Install
Run this where your agent runs. ClawHub downloads the skill into its workspace.
npx clawhub@latest install pdf-form-fillerDocumentation
Programmatically fill PDF forms with text values and checkboxes. Uses pdfrw to set form field values while preserving appearance streams for proper PDF viewer rendering.
Quick Start
Fill a PDF form with a dictionary of field names and values:
from pdf_form_filler import fill_pdf_form
fill_pdf_form(
input_pdf="form.pdf",
output_pdf="form_filled.pdf",
data={
"Name": "John Doe",
"Email": "[email protected]",
"Herr": True, # Checkbox
"Dienstreise": True,
}
)
Features
- Text fields: Set any text value (names, dates, addresses, etc.)
- Checkboxes: Set boolean values (True for checked, False/None for unchecked)
- Appearance states: Properly sets
/Onand/Offstates for PDF viewer rendering - Preserves structure: Doesn't strip form functionality—can be further edited
- No dependencies: Uses pdfrw (lightweight, pure Python)
How It Works
- Opens the PDF template
- Iterates through form fields
- Sets values for matching field names
- Handles checkboxes by setting both
/V(value) and/AS(appearance state) - Saves the filled PDF
Field Name Matching
Field names should match exactly as they appear in the PDF form. Common patterns:
- German forms:
Herr,Frau,Dienstreise,Geschäftsnummer LfF - English forms:
Full Name,Email,Agree,Submit - Date fields:
Date,DOB,Start Date
To discover field names in your PDF, use list_pdf_fields():
from pdf_form_filler import list_pdf_fields
fields = list_pdf_fields("form.pdf")
for field_name, field_type in fields:
print(f"{field_name}: {field_type}")
Field types:
text: Text input fieldcheckbox: Boolean checkboxradio: Radio buttondropdown: Dropdown selectsignature: Signature field
Example: Job Application Form
fill_pdf_form(
input_pdf="job_application.pdf",
output_pdf="job_application_filled.pdf",
data={
"Full Name": "Jane Smith",
"Email": "[email protected]",
"Phone": "555-1234",
"Position": "Software Engineer",
"Years Experience": "5",
# Checkboxes
"Willing to relocate": True,
"Available immediately": False,
"Background check consent": True,
}
)
Advanced Usage
Partial fills
Only fill specific fields, leave others blank:
data = {"Name": "Jane Doe"} # Only Name is set
fill_pdf_form("form.pdf", "form_filled.pdf", data)
Dynamic field detection
Get all fields and prompt for values:
from pdf_form_filler import list_pdf_fields
fields = list_pdf_fields("form.pdf")
data = {}
for field_name, field_type in fields:
if field_type == "text":
data[field_name] = input(f"Enter {field_name}: ")
elif field_type == "checkbox":
data[field_name] = input(f"Check {field_name}? (y/n): ").lower() == 'y'
fill_pdf_form("form.pdf", "form_filled.pdf", data)
Batch fills
Fill multiple PDFs with the same data:
import os
from pdf_form_filler import fill_pdf_form
data = {"Name": "John Doe", "Date": "2026-01-24"}
for filename in os.listdir("forms/"):
if filename.endswith(".pdf"):
fill_pdf_form(
f"forms/{filename}",
f"forms_filled/{filename}",
data
)
Troubleshooting
Checkboxes not showing visually
Some PDF viewers don't render checkboxes immediately. The value is set correctly (/On or /Off), but appearance isn't regenerated. Try opening in:
- Adobe Reader (will render automatically)
- Firefox (has better form support)
- evince or okular on Linux (usually works)
Field names not found
Use list_pdf_fields() to confirm exact field names. PDF forms can be tricky:
- Some use unusual names (e.g.,
Field_1instead of descriptive names) - Some have nested field structures
Text appears cut off
Some PDFs have narrow text fields. Either:
- Use shorter values
- Reduce font size in the PDF template itself
- Manual editing after filling
Bundled Script
See scripts/fill_pdf_form.py for the full implementation using pdfrw.