Pdf tools
Skill event4u-app/agent-config/dist/agent-src/skills/pdf-tools
Universal AI Agent OS — audited skills, governance rules, replayable state. One contract, every host agent.
npx -y skills add event4u-app/agent-config --skill pdf-toolsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 7 stars7 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Use when creating, merging, splitting, filling, or extracting from a PDF — library-per-task, output validated. Triggers on 'merge these PDFs', 'fill this PDF form', 'split the PDF', 'create a PDF'.
SKILL.md
4.3 KB, 945 tokens by cl100k_base, as published. Nobody here has run it
pdf-tools
Wing-1 engineering skill for PDF write/transform — markitdown reads a PDF
to Markdown; this creates, merges, fills, and extracts. Ships zero runtime: the
agent drives libraries the consumer has. Pattern re-implementation only.
When to use
- "Merge / split / rotate / encrypt these PDFs."
- "Fill this PDF form (AcroForm) with these values."
- "Create a PDF from this content."
- "Extract the text / tables from this PDF" (structured extraction beyond
markitdown's Markdown). - "OCR this scanned PDF."
Do NOT use for: PDF → Markdown ingestion (markitdown); Word (docx-authoring).
Procedure
1. Library per task — do not force one tool
| Task | Library path |
|---|---|
| merge / split / rotate / encrypt | pypdf — page-level operations, no rendering |
| create from content | reportlab (canvas / platypus) |
| form-fill (AcroForm) | a form-aware library; map field name → value, then flatten if the form must not be re-editable |
| text / table extraction | a text-layer extractor; tables need a layout-aware pass, not naive text |
| OCR (scanned/image PDF) | an OCR engine over rasterized pages — ONLY when there is no text layer |
2. Decide flatten-or-keep on form fills
A filled AcroForm stays editable unless flattened. Flatten when the PDF is a final artifact (an invoice, a signed form); keep fields when the recipient must edit further. State which you chose — a silently-editable "final" form is a correctness bug.
3. Validate — assert output validity, do not trust the write
- Re-open the output with pypdf; assert
len(reader.pages)matches the expected count (merge = sum; split = 1 per part). - For a form-fill: read back one field value (pre-flatten) or extract the rendered text (post-flatten) and assert the value is present.
- For create: assert the file opens and page 1 carries expected text.
Output format
- The output PDF path(s).
- Validation: page count matches expected ✅, read-back value/text present ✅.
- For fills: flatten decision stated (flattened / kept-editable + why).
Gotcha
OCR is a last resort, not the default extraction path. Running OCR over a PDF that already has a text layer produces worse output (OCR errors) than the existing text and burns time. Check for a text layer first; OCR only when it is genuinely absent.
- Editable "final" form: a filled AcroForm left un-flattened ships as a "signed invoice" the recipient can silently alter → flatten when the artifact is final.
Do NOT
- Do NOT bundle a Python toolkit in this package — drive the consumer's libraries (zero-runtime posture).
- Do NOT OCR a PDF that has a text layer.
- Do NOT leave a "final" filled form editable without saying so.
- Do NOT claim success on "file written"; claim it only after the re-open + page-count assertion.
Related Skills
WHEN to use this
- The task creates, merges, splits, rotates, encrypts, or form-fills a PDF.
- Structured text/table extraction beyond
markitdown's Markdown, or OCR of a scanned PDF.
WHEN NOT to use this
- PDF → Markdown ingestion →
markitdown. - Word documents →
docx-authoring; spreadsheets →spreadsheet-authoring.
When the agent should load this
- "Merge / split / rotate these PDFs."
- "Fill this PDF form."
- "Create a PDF from this content."
- "Extract the tables from this PDF / OCR this scan."
Output
- Output PDF(s) — the path(s). Cite as
pdf-output. - Validation receipt — page count matches expected ✅, read-back value/text present ✅. Cite as
pdf-validation. - Fill decision — present on form-fills: flattened / kept-editable + why. Cite as
pdf-fill-decision.
Gives 0 of the 12 instructions most pdf office docs skills give in 945 tokens
Counted across 635 of the 690 authors here whose files we hold, read 2026-08-06
- extract text using pdfplumberin 92 of 635, across 25 files
- create PDFs using reportlabin 83 of 635, across 16 files
- read FORMS.md to fill out PDF formsin 80 of 635, across 13 files
- OCR scanned PDFs using pytesseractin 77 of 635, across 10 files
- merge or split PDFs using qpdfin 70 of 635, across 3 files
- use Excel formulas instead of hardcoded calculated valuesin 68 of 635, across 12 files
- unpack edit xml and repack existing documentsin 63 of 635, across 8 files
- document sources for hardcoded valuesin 61 of 635, across 9 files
- write minimal python code without unnecessary commentsin 59 of 635, across 7 files
- run the recalculation script after adding or modifying formulasin 58 of 635, across 6 files
- fix all identified formula errors and recalculatein 58 of 635, across 6 files
- format years as text stringsin 57 of 635, across 5 files
Said here and by no other author read
- select one library per task
- flatten final forms or state the decision
- reopen output and assert page count
- assert expected text or field value is present
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.