Skill0 starsChanged 10 days agoMITView on GitHub
PDF files: create, read, merge, fill, OCR, edit text.
- Deletes or force-pushes
- Installs packages
194 other projects use a version of this, 5 of them edited.
Adopted by
Most recently taken up by
- anatelgovbr/ai-skillstheir own version, first seen Nov 15, 2026
- neromtoobad/creator-skillstheir own version, first seen Nov 15, 2026
- sugatoray/aiskillstheir own version, first seen Nov 15, 2026
- FimawLLC/fimaw-skillstheir own version, first seen Nov 15, 2026
- krishagel/geoffreytheir own version, first seen Nov 15, 2026
- superduck-ai/open-managed-agentstheir own version, first seen Nov 15, 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★ 262k100% same
- aivrar/portable-hermes-agent★ 23994% same
- wundercorp/loki★ 2898% same
- Samin12/skills★ 889% same
- abduznik/abduznik-skills★ 298% same
Wrote their own version · 189
- anthropics/skills★ 195ksame 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 repository57 other files it gives its agents.
- agent/AGENTS.mdAGENTS.md
- AGENTS.mdAGENTS.md
- cron/AGENTS.mdAGENTS.md
- gateway/AGENTS.mdAGENTS.md
- hermes_cli/AGENTS.mdAGENTS.md
- hermes_platform/AGENTS.mdAGENTS.md
- plugins/AGENTS.mdAGENTS.md
- pm/AGENTS.mdAGENTS.md
- skills/AGENTS.mdAGENTS.md
- tests/AGENTS.mdAGENTS.md
- tools/AGENTS.mdAGENTS.md
- tui_gateway/AGENTS.mdAGENTS.md
- web/AGENTS.mdAGENTS.md
- apple-notesSkill
- apple-remindersSkill
- findmySkill
- imessageSkill
- claude-codeSkill
- codexSkill
- computer-useSkill
- hermes-agentSkill
- architecture-diagramSkill
- ascii-videoSkill
- baoyu-infographicSkill
- claude-designSkill
- humanizerSkill
- local-pngSkill
- manim-videoSkill
- p5jsSkill
- popular-web-designsSkill
- songwriting-and-ai-musicSkill
- sdlc-reviewSkill
- email-inbox-triageSkill
- himalayaSkill
- youtube-contentSkill
- obsidianSkill
- document-to-action-itemsSkill
- google-workspaceSkill
- mapsSkill
- meeting-action-itemsSkill
- microsoft-officeSkill
- product-price-monitorSkill
- teams-meeting-pipelineSkill
- weekly-review-planningSkill
- arxivSkill
- competitor-news-monitorSkill
- grounded-citationsSkill
- xurlSkill
- codebase-inspectionSkill
- dogfoodSkill
- githubSkill
- requesting-code-reviewSkill
- simplify-codeSkill
- spikeSkill
- systematic-debuggingSkill
- test-driven-developmentSkill
- blocked-page-recoverySkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
15 rules. 0 are common, 1 is distinctive, and 14 are very specific to this project.
0
Common
Most of the 179 edited versions we read keep these.
1
Distinctive
This author's own choices. Worth a look.
14
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 30
NOT for scanned/image-only PDFs (use references/ocr-extraction.md) and NOT for pixel-perfect HTML-to-PDF rendering (use a headless browser).
- Very specific: line 70
Run every helper below with "$PY".
- Very specific: line 73
Never pip install into the interpreter that runs Hermes or into the hermes pm environment one.
- Very specific: line 80
All helpers live in scripts/ and are argparse CLIs — run them with the terminal tool.
- Very specific: line 128
Inspect first: Run pdf_read.py file.pdf --meta.
- Very specific: line 129
Create: Write a JSON spec with write_file (elements: heading, paragraph, table, image, pagebreak.
- Very specific: line 132
Build forms: Write one form-spec JSON (fields with label_box/entry_box in PDF points — see references/forms.md), lint it with …
- Very specific: line 142
NeedAppearances: after filling, viewers only render values if appearance streams exist.
- Very specific: line 156
After create/merge/split: pdf_read.py out.pdf --meta — confirm page_count, and per-page rotation when you rotated.
- Distinctive: line 157
After extraction: check the JSON is non-empty and spot-check a known string or cell.
- Very specific: line 159
After building a form: pdf_read.py form.pdf --fields lists every spec field with the right type and options.
- Very specific: line 160
After form fill: pdf_read.py filled.pdf --fields and compare values (exact match, including non-ASCII).
- Very specific: line 161
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 162
After metadata/attachment edits: pdf_read.py --meta / pdf_meta.py --list-attachments, and re-extract an attachment to byte-compare.
- Very specific: line 163
After encrypt: --meta shows "encrypted": true and opening without a password fails.
“Common” is measured: kept by at least 6 in 10 of the 179 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
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 (pymupdf fast path, marker-pdf quality path, scripts/extract_pymupdf.py + scripts/extract_marker.py):
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, invoice, or multi-page document as PDF.
- 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 NOT for pixel-perfect HTML-to-PDF rendering (use a headless browser).
Prerequisites
- Python 3.10+ with
pypdf,reportlab,pdfplumber. Pick the interpreter with
terminal. Usepythonwhen it already imports the libraries (the Hermes Docker image ships them). Otherwise, whenhermesis on PATH, let Hermes build its shared, pinned documents environment under the Hermes home: it survives container restarts, never touches the Hermes install itself, and is safe to run from several agents at once. When it is not (the terminal runs in a Docker sandbox, which has no Hermes), the block builds a venv in the sandbox home with the same pinned versions. Use this exact block in every document skill so they all share one environment:python -c "import pypdf, reportlab, pdfplumber" 2>/dev/null && PY=python || if command -v hermes >/dev/null 2>&1; then PY="$(hermes pm environment documents --extra documents --extra documents-pdf)" else PY="$HOME/.cache/hermes-docs-venv/bin/python" "$PY" -c "import docx, openpyxl, pptx, reportlab, pypdf, pdfplumber, pypdfium2" 2>/dev/null || ( # Safe to run from several agents at once: each caller builds a private venv, # a symlink publishes the first finished one atomically, the others delete theirs; # a published build is replaced and deleted only while it still fails to import. mkdir -p "$HOME/.cache" && cd "$HOME/.cache" && stage="$(mktemp -d hermes-docs-venv.XXXXXX)" || exit 1 old="$(readlink hermes-docs-venv)" # the published build, if any (another agent may have just published it) python3 -m venv "$stage" && "$stage/bin/python" -m pip install -q --disable-pip-version-check python-docx==1.2.0 openpyxl==3.1.5 python-pptx==1.0.2 reportlab==5.1.0 pypdf==6.21.2 pdfplumber==0.11.10 pypdfium2==5.14.0 && "$stage/bin/python" -c "import docx, openpyxl, pptx, reportlab, pypdf, pdfplumber, pypdfium2" && if [ -z "$old" ]; then python3 -c 'import os, sys; os.symlink(*sys.argv[1:])' "$stage" hermes-docs-venv elif [ "$(readlink hermes-docs-venv)" = "$old" ] && ! "$old/bin/python" -c "import docx, openpyxl, pptx, reportlab, pypdf, pdfplumber, pypdfium2" 2>/dev/null; then ln -s "$stage" "$stage.lnk" && python3 -c 'import os, sys; os.replace(*sys.argv[1:])' "$stage.lnk" hermes-docs-venv && case "$old" in hermes-docs-venv.??????) rm -rf "$old" ;; esac fi 2>/dev/null [ "$(readlink hermes-docs-venv)" = "$stage" ] || rm -rf "$stage" "$stage.lnk" ) fi export PY "$PY" scripts/pdf_create.py --helpRun every helper below with
"$PY". In PowerShell (Hermes runs on that host, so it is on PATH):$env:PY = hermes pm environment documents --extra documents --extra documents-pdf. Neverpip installinto the interpreter that runs Hermes or into thehermes pm environmentone; Hermes owns both.- Page rasterization (
pdf_page_image.py, overlay rendering) usespypdfium2, which the documents environment already has (if yourpythonlacks it, switchPYto that environment with the command above), 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 terminal 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_file(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_file; 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_file(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.
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
terminaltool (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.

