Skill0 starsChanged 11 days agoApache-2.0View on GitHub
PDF files: create, read, merge, fill, OCR, edit. For an invoice, letter, quote or deck load that pack first.
- Installs packages
194 other projects use a version of this, 5 of them edited.
Adopted by
Most recently taken up by
- CloudChef/atlasclaw-providerstheir own version, first seen Nov 8, 2026
- holon-run/holontheir own version, first seen Nov 8, 2026
- rvdbreemen/OTGW-firmwaretheir own version, first seen Nov 8, 2026
- EvanLee2004/finance-skillstheir own version, first seen Nov 8, 2026
- codewhale-hq/codewhale-plugin-marketplacetheir own version, first seen Nov 8, 2026
- insight68/Skillstheir own version, first seen Nov 8, 2026
Used with
Projects with it also use gift-evaluator, Podcast Generate and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
dav-niu474Skillgift-evaluator
The PRIMARY tool for Spring Festival gift analysis and social interaction generation. Use this skill when users upload photos of gifts (alcohol, tea, supplements, etc.) to inquire about their value, authenticity, or how to respond socially. Integrates visual perception, market valuation, and HTML card generation.
Also in 5 projects that use this
dav-niu474SkillPodcast Generate
Generate podcast episodes from user-provided content or by searching the web for specified topics. If user uploads a text file/article, creates a dual-host dialogue podcast (or single-host upon request). If no content is provided, searches the web for information about the user-specified topic and generates a podcast. Duration scales with content size (3-20 minutes, ~240 chars/min). Uses z-ai-web-dev-sdk for LLM script generation and TTS audio synthesis. Outputs both a podcast script (Markdown) and a complete audio file (WAV).
Also in 5 projects that use this
huang-x-hSkillVideo Generation
Implement AI-powered video generation capabilities using the z-ai-web-dev-sdk. Use this skill when the user needs to generate videos from text prompts or images, create video content programmatically, or build applications that produce video outputs. Supports asynchronous task management with status polling and result retrieval.
Also in 6 projects that use this
huang-x-hSkillVLM
Implement vision-based AI chat capabilities using the z-ai-web-dev-sdk. Use this skill when the user needs to analyze images, describe visual content, or create applications that combine image understanding with conversational AI. Supports image URLs and base64 encoded images for multimodal interactions.
Also in 6 projects that use this
Liang-MHSkillstock_analysis
获取 A 股、基金和港股的实时行情和技术分析数据
Also in 5 projects that use this
OpenAISkillmigrate-to-codex
Migrate supported instruction files, skills, agents, and MCP config into Codex project and global files.
Also in 5 projects that use this
- +1 more from huang-x-h
- +3 more from dav-niu474
Other versions194 projects use a version of this.
Word for word · 0
None found.
Edited · 5
- NousResearch/hermes-agent★ 262k76% same
- aivrar/portable-hermes-agent★ 23991% same
- wundercorp/loki★ 2894% same
- Samin12/skills★ 886% same
- abduznik/abduznik-skills★ 294% same
Wrote their own version · 189
- anthropics/skills★ 189ksame name
- shareAI-lab/analysis_claude_code★ 80ksame name
- shareAI-lab/learn-claude-code★ 80ksame name
- openai/skills★ 27ksame name
- spinabot/brigade★ 11ksame name
- netease-youdao/LobsterAI★ 6.2ksame name
- OpenBMB/PilotDeck★ 5ksame name
- nextlevelbuilder/goclaw★ 3.7ksame name
- awslabs/agentcore-samples★ 3.5ksame name
- awslabs/amazon-bedrock-agentcore-samples★ 3.5ksame name
179 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository24 other files it gives its agents.
- AGENTS.mdAGENTS.md
- llms.txtllms.txt
- academic-referencesSkill
- annual-accountsSkill
- business-deckSkill
- business-letterSkill
- _checksSkill
- contract-draftingSkill
- diagramSkill
- docxSkill
- e-invoiceSkill
- employment-statementSkill
- html-deckSkill
- literature-searchSkill
- meeting-minutesSkill
- paperSkill
- powerpointSkill
- requirements-specSkill
- _sharedSkill
- social-posterSkill
- trade-documentsSkill
- whatsapp-exportSkill
- xlsxSkill
- zotero-librarySkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
16 rules. 0 are common, 3 are distinctive, and 13 are very specific to this project.
0
Common
Most of the 180 edited versions we read keep these.
3
Distinctive
This author's own choices. Worth a look.
13
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 43
NOT for scanned/image-only PDFs (use references/ocr-extraction.md) and for pixel-perfect HTML-to-PDF rendering use nodejam-print in the …
- Very specific: line 57
All helpers live in scripts/ and are argparse CLIs — run them with the bash tool.
- Very specific: line 105
Inspect first: Run pdf_read.py file.pdf --meta.
- Very specific: line 106
Create: Write a JSON spec with write (elements: heading, paragraph, table, image, pagebreak.
- Very specific: line 109
Build forms: Write one form-spec JSON (fields with label_box/entry_box in PDF points — see references/forms.md), lint it with …
- Distinctive: line 124
Keep the original aspect ratio and inspect the rendered page at a useful reading size for pixelation, clipping and text/image balance.
- Distinctive: line 127
If only a low-resolution reference exists, keep that limitation explicit.
- Very specific: line 132
When the deliverable promises the source's own words, export its actual quote and citation fields to a JSON list of …
- Very specific: line 146
NeedAppearances: after filling, viewers only render values if appearance streams exist.
- Very specific: line 160
After create/merge/split: pdf_read.py out.pdf --meta — confirm page_count, and per-page rotation when you rotated.
- Distinctive: line 161
After extraction: check the JSON is non-empty and spot-check a known string or cell.
- Very specific: line 163
After building a form: pdf_read.py form.pdf --fields lists every spec field with the right type and options.
- Very specific: line 164
After form fill: pdf_read.py filled.pdf --fields and compare values (exact match, including non-ASCII).
- Very specific: line 165
After stamping: re-extract text (pypdf for rotated stamps) or render the page with pdf_page_image.py and inspect with vision_analyze.
- Very specific: line 166
After metadata/attachment edits: pdf_read.py --meta / pdf_meta.py --list-attachments, and re-extract an attachment to byte-compare.
- Very specific: line 167
After encrypt: --meta shows "encrypted": true and opening without a password fails.
“Common” is measured: kept by at least 6 in 10 of the 180 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
PDF Skill
First: is there a pack for this kind of document?
This skill handles the PDF file. It does not know what a kind of document must carry. If the ask is for one of these and that pack is installed, stop and load it first: the pack lays the file out and checks it.
- an invoice or a credit note:
e-invoice - a letter:
business-letter - a quotation, order confirmation, delivery note, pro forma or purchase order:
trade-documents - a business deck (a board update, a proposal, a sales or investor deck):
business-deck
Whatever language the ask is in. Come back here only for a file none of them names, or to read or change an existing one.
For an existing HTML file in the desktop app (NODEJAM_PRINT is set), export
with the bundled nodejam-print "input.html" "output.pdf". It uses the app’s
own Chromium. Keep the existing HTML and pictures; a separate browser install
is unnecessary. Outside the desktop, use the existing headless browser path.
Create PDFs from structured specs, build and fill AcroForm forms (with layout linting and visual overlays), extract text/tables/metadata, merge/split/rotate/watermark/stamp pages, export page images, manage metadata and attachments, and encrypt/decrypt — using pypdf, reportlab, and pdfplumber. Two absorbed capabilities live in references/ (read the matching file before those tasks):
- Scanned/image-only PDFs and OCR (render pages with scripts/pdf_page_image.py and read the images; marker-pdf via scripts/extract_marker.py for bulk OCR):
references/ocr-extraction.md - Editing text inside an existing PDF via natural-language prompts (nano-pdf CLI):
references/nano-pdf-editing.md
When to Use
- Generate a report or another multi-page document as PDF (an invoice, a letter, a quotation and a deck have their own packs, above).
- Build a fillable AcroForm (text/checkbox/radio/dropdown) from a JSON spec, linting the layout first.
- Pull text, tables (JSON/CSV), metadata, or form-field values out of a PDF.
- Merge, split, rotate, extract page subsets, watermark, stamp text/images at coordinates, bookmark, or compress PDFs.
- Export pages as PNGs for visual review or for OCR hand-off; set/clear document metadata; add/extract file attachments.
- Fill or flatten AcroForm forms; encrypt or decrypt with passwords.
- NOT for scanned/image-only PDFs (use
references/ocr-extraction.md) and for pixel-perfect HTML-to-PDF rendering usenodejam-printin the desktop or a headless browser elsewhere.
Prerequisites
The desktop already bundles these dependencies. Use its Python; no package setup is required there.
- Python 3.10+ with
pypdf,reportlab,pdfplumber,pypdfium2:python -m pip install pypdf reportlab pdfplumber pypdfium2 - Optional, for page rasterization (
pdf_page_image.py, overlay rendering):python -m pip install pypdfium2, or poppler'spdftoppmon PATH. Scripts fall back pypdfium2 → pdftoppm and report{"rendered": false, "missing": [...]}(exit 0) when neither exists. - Each helper script checks imports lazily and prints an install hint if a dependency is missing.
How to Run
All helpers live in scripts/ and are argparse CLIs — run them with the bash tool; every one supports --help. They read/write JSON strictly as UTF-8, print JSON results to stdout, and exit non-zero on failure.
python scripts/pdf_create.py spec.json -o out.pdf # build PDF from JSON spec
python scripts/pdf_make_form.py formspec.json -o form.pdf # build fillable AcroForm from JSON spec
python scripts/pdf_form_layout.py formspec.json # lint form layout BEFORE building
python scripts/pdf_form_layout.py formspec.json --render-overlay boxes.png [--pdf form.pdf]
python scripts/pdf_read.py doc.pdf --text # per-page text (JSON)
python scripts/pdf_read.py doc.pdf --tables --csv-dir t/ # tables to JSON + CSV files
python scripts/pdf_read.py doc.pdf --meta # metadata, page sizes, encrypted/scanned flags
python scripts/pdf_read.py form.pdf --fields # form fields: name, type, value
python scripts/pdf_merge.py a.pdf b.pdf -o merged.pdf [--bookmarks]
python scripts/pdf_split.py doc.pdf --pages 1-3,7 -o part.pdf [--rotate 90]
python scripts/pdf_fill_form.py form.pdf --fields-json values.json -o filled.pdf [--flatten]
python scripts/pdf_secure.py doc.pdf --encrypt -o enc.pdf --user-password your-password
python scripts/pdf_secure.py enc.pdf --decrypt -o dec.pdf --password your-password
python scripts/pdf_watermark.py doc.pdf --stamp mark.pdf -o stamped.pdf [--under]
python scripts/pdf_stamp.py doc.pdf -o out.pdf --text "DRAFT" --x 150 --y 400 \
--font-size 60 --rotation 45 --opacity 0.3 --color "#cc0000" [--pages 1-3]
python scripts/pdf_stamp.py doc.pdf -o out.pdf --image sig.png --x 400 --y 60 --width 120
python scripts/pdf_page_image.py doc.pdf --pages 1-3 --dpi 150 --out-dir imgs/
python scripts/pdf_meta.py doc.pdf --set-meta --title "T" --author "A" -o out.pdf
python scripts/pdf_meta.py doc.pdf --attach data.csv -o out.pdf
python scripts/pdf_meta.py doc.pdf --list-attachments | --extract-attachments dir/Quick Reference
| Task | Tool | Command / API |
| Create doc (headings, tables, images) | reportlab platypus | pdf_create.py spec.json -o out.pdf |
| Build fillable form | reportlab acroForm | pdf_make_form.py formspec.json -o form.pdf |
| Lint form layout / overlay image | pure python + PIL | pdf_form_layout.py formspec.json [--render-overlay o.png] |
| Per-page text | pdfplumber | pdf_read.py f.pdf --text |
| Tables → JSON/CSV | pdfplumber | pdf_read.py f.pdf --tables |
| Metadata / sizes / encrypted / scanned | pypdf + pdfplumber | pdf_read.py f.pdf --meta |
| Merge (+ outline) | pypdf | pdf_merge.py a.pdf b.pdf -o m.pdf |
| Split / extract / rotate | pypdf | pdf_split.py f.pdf --pages 2-5 --rotate 90 |
| List / fill / flatten form | pypdf | pdf_read.py --fields, pdf_fill_form.py |
| Encrypt / decrypt (AES-256) | pypdf | pdf_secure.py --encrypt/--decrypt |
| Watermark / stamp PDF page | pypdf | pdf_watermark.py f.pdf --stamp w.pdf |
| Stamp text/image at coordinates | reportlab + pypdf | pdf_stamp.py f.pdf --text "Sign here" --x 400 --y 60 |
| Pages → PNG (review / OCR hand-off) | pypdfium2 or pdftoppm | pdf_page_image.py f.pdf --pages 1-3 --out-dir imgs/ |
| Set/clear metadata, attachments | pypdf | pdf_meta.py --set-meta / --attach / --extract-attachments |
| Compress content streams | pypdf | pdf_split.py f.pdf --pages 1-N --compress |
Procedure
- Inspect first. Run
pdf_read.py file.pdf --meta. Checkencrypted(if true, decrypt first withpdf_secure.py --decrypt) andlikely_scanned_pages. If pages are image-only, export them withpdf_page_image.py --pages <scanned> --dpi 300 --out-dir imgs/and hand the PNGs to thereferences/ocr-extraction.mdskill — do not report empty text as "no content". - Create. Write a JSON spec with
write(elements:heading,paragraph,table,image,pagebreak; optionaltitle/authormetadata; page numbers are added automatically), then runpdf_create.py. Verify visually withvision_analyzeon a rendered page image if layout matters. - Extract.
--textgives a JSON list of per-page strings;--tablesgives row arrays per page and can also emit CSV files. Read results withread; never eyeball a binary PDF directly. - Manipulate.
pdf_merge.pyconcatenates and can add one bookmark per source file;pdf_split.pyhandles page ranges (1-based, e.g.1-3,5,9-), rotation in 90° steps, and--compress. Watermark by preparing a single-page stamp PDF (e.g. viapdf_create.py) and overlaying it withpdf_watermark.py; for one-liner stamps ("sign here", diagonal DRAFT, corner labels) usepdf_stamp.pywith text or an image at explicit coordinates. - Build forms. Write one form-spec JSON (fields with
label_box/entry_boxin PDF points — seereferences/forms.md), lint it withpdf_form_layout.pyand fix every reported problem, optionally review the--render-overlayPNG withvision_analyze, then build withpdf_make_form.pyand confirm withpdf_read.py --fields. - Fill forms. List fields (
--fields) to learn exact names and types, write a UTF-8 JSON of{"FieldName": "value"}withwrite(checkboxes accepttrue/false; radio/choice values must match the field's export options), thenpdf_fill_form.py. Re-read with--fieldsto confirm values landed. - Metadata & attachments.
pdf_meta.py --set-metawrites Title/Author/Subject/Keywords (DocInfo);--clear-metadrops them;--attach/--list-attachments/--extract-attachmentsround-trip embedded files. - Secure. Encrypt with distinct user/owner passwords and AES-256. To remove a password you know,
--decryptwrites an unencrypted copy. - Verify (see below) before reporting success.
Use source images at the delivered size
For a prominent image, prefer the original local source or cutout when it is available. An image extracted from a workbook, preview or contact sheet may be a small thumbnail, even when it depicts the right item. Compare the source pixel dimensions with the size used on the page before enlarging it. Reuse a thumbnail only at a size where it remains suitable; increasing its pixel dimensions does not recover the source detail.
Keep the original aspect ratio and inspect the rendered page at a useful reading size for pixelation, clipping and text/image balance. Use the same adequate source in the editable file so a later export retains the quality. If only a low-resolution reference exists, keep that limitation explicit; do not invent product detail or substitute an unverified variant to conceal it.
Verify literal source wording
When the deliverable promises the source's own words, export its actual quote
and citation fields to a JSON list of {"id":"row-1","pages":[1],"quote":"..."}
and run python scripts/pdf_verify_quotes.py source.pdf quotes.json before
calling those words verified. The helper checks normalized text containment,
not complete coverage or semantic correctness. Investigate every needs_review:
use the exact source wording, label a paraphrase as your summary, or visually
verify an image-only quote and retain that evidence. Never fabricate a caption
for an unnamed picture merely to obtain a match. Quotes spanning pages may be
split into separately cited literal fragments. Keep the original PDF unchanged.
Pitfalls
- Scanned PDFs: empty
extract_text()plus page images means there is no text layer. Route toreferences/ocr-extraction.md; do not fabricate text. - Flattening limits:
pdf_fill_form.py --flattenuses pypdf's flatten support, which converts widget appearances into page content. It is reliable for plain text fields and checkboxes but can drop or misrender exotic widgets (rich text, custom appearance streams, some radio groups). Verify the flattened output visually withvision_analyze; for bulletproof flattening use an external renderer (e.g. Ghostscript orpdftoppm+reassembly) as a fallback. - NeedAppearances: after filling, viewers only render values if appearance streams exist. The fill script sets the AcroForm
NeedAppearancesflag so conforming viewers regenerate them; some minimal viewers ignore it — flatten if display fidelity matters. - Non-Latin form values: values are stored correctly (UTF-16), but the field's default font may lack glyphs, so a viewer can show blanks even though the data round-trips. Verify with
--fields, not just visually. - Compression expectations:
--compressonly deflates content streams. Typical savings are 0–20%; it does nothing for PDFs dominated by images or already-compressed streams. It is not a substitute for image downsampling (Ghostscript territory). - Permission flags don't enforce: owner-password permission bits (no-print, no-copy) are polite requests that viewers may honor; any library (including pypdf) can read and strip them. Only the user password actually gates content via encryption. Never present permission flags as security.
- Table extraction is heuristic: pdfplumber detects tables from ruling lines/word alignment; borderless or merged-cell tables may need
table_settingstuning or manual cleanup. - Page indexing: helper CLIs take 1-based pages; pypdf APIs are 0-based. The scripts convert — don't double-convert.
- Rotated stamp text extraction: pdfplumber's line grouping scrambles rotated glyphs (a 45° "DRAFT" extracts as stray letters); verify rotated stamps with
pypdf'sextract_text()or a rendered image instead. - Radio groups: reportlab needs ≥2
radio()widgets per group, fills need the slashed export value ("/red"), and flatten fidelity is worst for radios — seereferences/forms.md. - Metadata scope:
pdf_meta.pywrites the classic DocInfo dictionary only; embedded XMP metadata (if any) is left untouched and may show different values in some viewers. - PDF/A is out of scope: pypdf/reportlab cannot produce or validate conformant PDF/A. If archival conformance is required, run Ghostscript via the
bashtool (e.g.gs -dPDFA=2 -dPDFACompatibilityPolicy=1 -sColorConversionStrategy=UseDeviceIndependentColor -sDEVICE=pdfwrite -o out.pdf in.pdfwith a suitable ICC profile) and validate with veraPDF — both are external installs, and the result still needs validation, not assumption. - Rotation must be a multiple of 90; encrypted inputs must be decrypted before any other operation.
Verification
- After create/merge/split:
pdf_read.py out.pdf --meta— confirmpage_count, and per-pagerotationwhen you rotated. - After extraction: check the JSON is non-empty and spot-check a known string or cell.
- Form design loop:
pdf_form_layout.py spec.jsonmust exit 0; then--render-overlay boxes.png --pdf form.pdfand review the PNG withvision_analyze(red = entry boxes with field names, blue = label boxes) asking about overlaps, misalignment, and labels detached from their fields. Iterate spec → lint → overlay until clean. - After building a form:
pdf_read.py form.pdf --fieldslists every spec field with the right type and options. - After form fill:
pdf_read.py filled.pdf --fieldsand compare values (exact match, including non-ASCII). - After stamping: re-extract text (pypdf for rotated stamps) or render the page with
pdf_page_image.pyand inspect withvision_analyze. - After metadata/attachment edits:
pdf_read.py --meta/pdf_meta.py --list-attachments, and re-extract an attachment to byte-compare. - After encrypt:
--metashows"encrypted": trueand opening without a password fails; after decrypt, text extraction matches the original. - For anything visual (watermarks, flattened forms), render and inspect with
vision_analyze.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

