PDF Form Filler Skill
Take a form template (extracted from a PDF, written in markdown, or whatever) plus structured data, and produce a filled version. AI handles fuzzy field-name matching so the data does not have to use the exact same labels as the form.
The Problem
Filling forms is the world's most common boring task. Repeated rental applications, vendor onboarding sheets, customer intake forms, expense reports — different layouts, same data over and over. The painful part is mapping the data you have to the labels the form uses ("DOB" vs "Date of Birth" vs "Birthdate"). AI handles this trivially.
How It Works
- A trigger-file watches an inbound folder for new form templates (PDF, txt, md)
- A
pdf extracttask pulls the text out of the PDF (skip if the form is already text/md) - The
pdf-form-fillerskill matches a fixed JSON data block against the labels and produces the filled text - A
pdf generatetask renders the filled text back to PDF - A
messageoremailtask delivers it
Setup
- Install this skill
- Create a JSON file with the data you reuse (or pull it from a database)
- Create a trigger-file watching your form-inbox folder
- Use the YAML below
Example YAML Job
name: form-fill
version: 1.0.0
description: Fill a form template with stored data, output as PDF
notifications:
- userNames: [intouch]
alertOnError: true
tasks:
- name: extract-form
tool: pdf
properties:
operation: extract
inputFile: "${TRIGGER_FILE}"
- name: fill-form
tool: skill
properties:
skillName: pdf-form-filler
input: |
dateFormat: US
data:
{
"firstName": "Alice",
"lastName": "Chen",
"email": "[email protected]",
"dateOfBirth": "1990-03-15",
"phone": "4155551234",
"addressLine1": "123 Main St",
"city": "San Francisco",
"state": "CA",
"zip": "94110"
}
template:
{{extract-form.text}}
- name: render-pdf
tool: pdf
properties:
operation: generate
outputFile: "${INTOUCH_HOME}/forms/filled-$(basename ${TRIGGER_FILE}).pdf"
content: "{{fill-form.answer}}"
title: "Filled form"
font: helvetica
fontSize: 11
- name: notify
tool: message
properties:
subject: "Form filled — review before sending"
body: "Filled PDF available at ${INTOUCH_HOME}/forms/. Missing fields are marked [MISSING] in the document."
userNames: "intouch"
Customization
- Multiple data profiles — store JSON files per "persona" (you, your spouse, your business) and pick the right one in the input
- Database lookup — replace the inline
data:block with asqlquery that pulls from a customers/applicants table - Auto-route on missing fields — wrap the render task in a workflow that branches on whether
[MISSING:appears in the filled text; route incomplete forms to a human-review queue - Skip the PDF roundtrip — for markdown templates, the workflow is just
read template → fill-form → write filled.md; nopdftool needed
Limitations
Plain-text form-fill works for ~80% of forms in the wild. For PDFs with native AcroForm fields (the kind where you can click and type directly in Adobe Reader), this skill cannot fill those fields directly — you'd need a tool that writes back into the form's field objects. Most non-government forms aren't AcroForm; they're flat layouts that this approach handles fine.
Cost
- AI assistant: ~$0.005 per form with Claude Haiku for typical forms
- Larger or more complex forms: ~$0.02 with Claude Sonnet