https://pypi.org/project/fillpdf/
This is a simple package to make filling pdfs much easier. I have delt with a lot projects that involve manipulating pdfs in python. I found no easy solution for writting, or flattening pdfs, so I decided to make a library to make this task much easier. As a young software engineer I kept this library really simple but practicle and am open to any input for the future!
- Fills pdfs
- Lists fields in pdf
- Flattens pdfs (Turns to a non-editable pdf)
import fillpdf
from fillpdf import fillpdfs
get_form_fields(input_pdf_path)
- input_pdf_path- path to your pdf you want to alter (including the pdf name could just leave as 'blank.pdf' if the pdf is in your current directory)
fillpdfs.get_form_fields('blank.pdf')
print_form_fields(input_pdf_path)
- input_pdf_path- path to your pdf you want to alter (including the pdf name could just leave as 'blank.pdf' if the pdf is in your current directory)
fillpdfs.print_form_fields('blank.pdf')
write_fillable_pdf(input_pdf_path, output_pdf_path, data_dict, flatten=False)
- input_pdf_path- path to your pdf you want to alter (including the pdf name could just leave as 'blank.pdf' if the pdf is in your current directory)
- output_pdf_path- path of where you want your pdf to write to (including the pdf name could just leave as 'new.pdf' to write to current directory)
- data_dict- dictionary that contains the fields to write to as your key and what to write to it as your value (get this from the get_form_fields function)
- flatten (default=False)- If True, then the fields will become uneditable when you write to the pdf.
data_dict = {'Address 1 Text Box': '500 West Main Street',
'Driving License Check Box': 'Yes',
'Language 1 Check Box': 'Off',}
fillpdfs.write_fillable_pdf('blank.pdf', 'new.pdf', data_dict)
- For radio boxes ('Off' = not filled, 'Yes' = filled)
- For check boxes ('Off' or '' = not filled, 'Yes' = filled)
- For drop downs (Enter the name of the desired drop down option)
- For radio groups ('0' = The first option, '1' = The second option, '2' = the third option, etc.)
flatten_pdf(input_pdf_path, output_pdf_path, as_images=False)
- input_pdf_path- path to your pdf you want to alter (including the pdf name could just leave as 'blank.pdf' if the pdf is in your current directory)
- output_pdf_path- path of where you want your pdf to write to (including the pdf name could just leave as 'new.pdf' to write to current directory)
- as_images=False- Default is False meaning it will update each individual annotation and set it to False. True means it will convert to images and then reinsert into the pdf. Try this if the first is not working. (this image technique requires poppler.)
fillpdfs.flatten_pdf('new.pdf', 'newflat.pdf')
A command line wrapper is available for this tool. Here are the two commands:
extractfillpdf input_pdf_path
or
extractfillpdf input_pdf_path output_json_path
- input_pdf_path- path to your pdf you want to alter (including the pdf name could just leave as 'blank.pdf' if the pdf is in your current directory)
- output_json_path- path of where you want your json file containing the fields and contents of the pdf to write to (If not included then the default will be the same name/path as the input_pdf_path but .json instead of .pdf)
extractfillpdf blank.pdf
or
extractfillpdf blank.pdf data.json
insertfillpdf -j blank.json -o new.pdf blank.pdf
- input_pdf_path- path to your pdf you want to alter (including the pdf name could just leave as 'blank.pdf' if the pdf is in your current directory)
- input_json_path- path to the json file that you generated and modified with the extractfillpdf command.
- output_pdf_path- path of where you want your pdf to write to (including the pdf name could just leave as 'new.pdf' to write to current directory)
fillpdfs.flatten_pdf('new.pdf', 'newflat.pdf')
extractfillpdf --help or extractfillpdf -h
Will bring up this menu positional arguments: test.pdf Input pdf file
optional arguments:
-h, --help show this help message and exit
-o test.json, --output test.json
Output file to write result, if none given, it will be the input file
with the JSON extension
--version show program's version number and exit
-v, --verbose set loglevel to INFO
-vv, --very-verbose set loglevel to DEBUG
insertfillpdf --help or insertfillpdf -h
Will bring up this menu
positional arguments:
test.pdf Input PDF file
optional arguments:
-h, --help show this help message and exit
-j test.json, --JSON test.json
Input JSON file, if none given, it will be the input file with the JSON
extension
-o test_out.pdf, --output test_out.pdf
Output file to write result, if none given, it will be the input file
with '_out.pdf' extension'
--version show program's version number and exit
-v, --verbose set loglevel to INFO
-vv, --very-verbose set loglevel to DEBUG
pip install fillpdf
conda install -c conda-forge poppler
- 'pdfrw'
- 'pdf2image'
- 'Pillow'
- 'poppler'
- Add perfect fill (sometimes does not fill random things ie. drop down lists)
- give option to place text by coordinate
- easier way to fill the data dictionary in write_fillable_pdf function
- fill drop downs