
Fill, inspect, and manipulate PDF forms and pages with a strict script-first workflow so agents do not skip validation steps.
Overview
PDF is an agent skill for the Build phase that completes PDF forms and extracts field metadata through a mandatory fillable-vs-non-fillable detection workflow and bundled Python scripts.
Install
npx skills add https://github.com/appautomaton/document-skills --skill pdfWhat is this skill?
- Mandatory ordered workflow: detect fillable fields before writing ad-hoc PDF code
- check_fillable_fields.py via uv run python from the skill directory
- Separate paths for fillable vs non-fillable forms with extract_form_field_info.py JSON output
- Field types: text, checkbox, radio_group, choice with PDF coordinate rects
- Checkbox and radio_group semantics documented for correct value assignment
- Two-branch workflow: fillable fields vs non-fillable fields
- Field info JSON includes field_id, page, rect, and typed form controls
Adoption & trust: 534 installs on skills.sh; 107 GitHub stars; 2/3 security scanners passed (skills.sh audits).
What problem does it solve?
Your agent jumps straight to PDF library code and breaks forms because nobody checked whether fields are fillable or mapped checkbox values correctly.
Who is it for?
Solo builders automating tax, legal, onboarding, or ops PDFs inside an agent session with uv and Python already available.
Skip if: Heavy PDF design from scratch, scanned-image OCR-only forms without following the non-fillable branch, or teams that refuse local script execution.
When should I use this skill?
User needs to fill, inspect, or process PDF forms; CRITICAL steps require checking fillable fields first with check_fillable_fields.py.
What do I get? / Deliverables
You get a validated branch (fillable or non-fillable), structured field_info.json when applicable, and a correctly filled PDF following the skill’s ordered steps.
- Filled PDF output
- field_info.json for fillable forms
- Documented field type mapping for agent fill steps
Recommended Skills
Journey fit
Canonical shelf is Build/docs because the skill produces and edits document artifacts (filled PDFs, extracted field metadata) as part of shipping paperwork, contracts, and deliverables. Docs subphase covers PDF generation, form completion, and structured document outputs agents attach to repos or customer packets.
How it compares
Use instead of asking the model to invent pypdf snippets without inspecting form field types first.
Common Questions / FAQ
Who is pdf for?
Developers and operators using coding agents to fill or analyze PDF forms as part of shipping document-heavy products or internal workflows.
When should I use pdf?
During Build when you need to complete or introspect PDF forms—always start with fillable field detection before any custom PDF code.
Is pdf safe to install?
Check Prism’s Security Audits panel and review the bundled scripts; the skill runs local Python on PDFs you provide and does not imply a specific audit outcome here.
SKILL.md
READMESKILL.md - Pdf
**CRITICAL: You MUST complete these steps in order. Do not skip ahead to writing code.** If you need to fill out a PDF form, first check to see if the PDF has fillable form fields. Run this script from this file's directory: `uv run python scripts/check_fillable_fields.py <file.pdf>`, and depending on the result go to either the "Fillable fields" or "Non-fillable fields" and follow those instructions. # Fillable fields If the PDF has fillable form fields: - Run this script from this file's directory: `uv run python scripts/extract_form_field_info.py <input.pdf> <field_info.json>`. It will create a JSON file with a list of fields in this format: ``` [ { "field_id": (unique ID for the field), "page": (page number, 1-based), "rect": ([left, bottom, right, top] bounding box in PDF coordinates, y=0 is the bottom of the page), "type": ("text", "checkbox", "radio_group", or "choice"), }, // Checkboxes have "checked_value" and "unchecked_value" properties: { "field_id": (unique ID for the field), "page": (page number, 1-based), "type": "checkbox", "checked_value": (Set the field to this value to check the checkbox), "unchecked_value": (Set the field to this value to uncheck the checkbox), }, // Radio groups have a "radio_options" list with the possible choices. { "field_id": (unique ID for the field), "page": (page number, 1-based), "type": "radio_group", "radio_options": [ { "value": (set the field to this value to select this radio option), "rect": (bounding box for the radio button for this option) }, // Other radio options ] }, // Multiple choice fields have a "choice_options" list with the possible choices: { "field_id": (unique ID for the field), "page": (page number, 1-based), "type": "choice", "choice_options": [ { "value": (set the field to this value to select this option), "text": (display text of the option) }, // Other choice options ], } ] ``` - Convert the PDF to PNGs (one image for each page) with this script (run from this file's directory): `uv run python scripts/convert_pdf_to_images.py <file.pdf> <output_directory>` Then analyze the images to determine the purpose of each form field (make sure to convert the bounding box PDF coordinates to image coordinates). - Create a `field_values.json` file in this format with the values to be entered for each field: ``` [ { "field_id": "last_name", // Must match the field_id from `extract_form_field_info.py` "description": "The user's last name", "page": 1, // Must match the "page" value in field_info.json "value": "Simpson" }, { "field_id": "Checkbox12", "description": "Checkbox to be checked if the user is 18 or over", "page": 1, "value": "/On" // If this is a checkbox, use its "checked_value" value to check it. If it's a radio button group, use one of the "value" values in "radio_options". }, // more fields ] ``` - Run the `fill_fillable_fields.py` script from this file's directory to create a filled-in PDF: `uv run python scripts/fill_fillable_fields.py <input pdf> <field_values.json> <output pdf>` This script will verify that the field IDs and values you provide are valid; if it prints error messages, correct the appropriate fields and try again. # Non-fillable fields If the PDF doesn't have fillable form fields, you'll need to visually determine where the data should be added and create text annotations. Follow the below steps *exactly*. You MUST perform all of these steps to ensure that the the form is accurately completed. Details for each step are below. - Convert the PDF to PNG images and determine field bounding boxes. - Create a JSON file with field information and validation images showing the bounding boxes. - Validate the the bounding boxes. - Use the bounding boxes to fill in the form. ## Step 1: Visual Analysis (REQUIRED) - Convert the PDF to PNG imag