pdf-form-filler
Fill PDF forms programmatically with text values and checkboxes.
Installation
npx clawhub@latest install pdf-form-fillerView the full skill documentation and source below.
Documentation
PDF Form Filler
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": "john@example.com",
"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
/V (value) and /AS (appearance state)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
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": "jane.smith@example.com",
"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:
Bundled Script
See scripts/fill_pdf_form.py for the full implementation using pdfrw.