pdf-processing — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited pdf-processing (Agent Skill) and scored it 91/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 1 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} is the classic direct prompt-injection phrasing. Placed in a skill body that the agent reads as trusted instructions, it tries to make the agent abandon its prior rules and follow whatever comes next — a full system-prompt override.
ignore/disregard/forget … previous instructions sentence.Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
This skill handles all PDF operations: text extraction, table parsing, form filling, merging, splitting, and metadata extraction.
Determine what the user needs:
For Python environments:
pypdf (formerly PyPDF2): text extraction, merging, splitting, metadata - pure Python, no system depspdfplumber: best for tables and layout-aware extractionpymupdf (fitz): fastest, handles scanned PDFs with OCR via Tesseractreportlab: generate new PDFs or fill forms programmaticallypdfrw: low-level PDF manipulation, ideal for form fillingimport pypdf
reader = pypdf.PdfReader("document.pdf")
text = "\n\n".join(page.extract_text() for page in reader.pages)
print(text)For layout-preserving extraction:
import pdfplumber
with pdfplumber.open("document.pdf") as pdf:
for page in pdf.pages:
print(page.extract_text(layout=True))import pdfplumber
with pdfplumber.open("document.pdf") as pdf:
for page in pdf.pages:
tables = page.extract_tables()
for table in tables:
for row in table:
print(row)import pypdf
merger = pypdf.PdfMerger()
for path in ["file1.pdf", "file2.pdf", "file3.pdf"]:
merger.append(path)
merger.write("merged.pdf")
merger.close()import pypdf
reader = pypdf.PdfReader("document.pdf")
for i, page in enumerate(reader.pages):
writer = pypdf.PdfWriter()
writer.add_page(page)
with open(f"page_{i+1}.pdf", "wb") as f:
writer.write(f)import pypdf
reader = pypdf.PdfReader("form.pdf")
writer = pypdf.PdfWriter()
writer.append(reader)
writer.update_page_form_field_values(
writer.pages[0],
{"field_name": "value", "another_field": "another_value"}
)
with open("filled_form.pdf", "wb") as f:
writer.write(f)pymupdf + Tesseract OCR - warn the user if no text is foundreader.decrypt("password") before readingpdfplumber handles RTL better than pypdf~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.