I have many PDF forms, I would need to fill them each in php with the data I already have. Here is just a sample PDF form , I want to fill this form using php. The data I already have in DB. I just want to fill this form and save it. I am working in PHP Zend Framework. All I want is when I would download those forms from my site, it would pre-fill all the fields in the pdf form with the information I already have. Please help me.
39.4k 10 10 gold badges 49 49 silver badges 69 69 bronze badges asked Feb 4, 2012 at 9:21 2,302 7 7 gold badges 36 36 silver badges 61 61 bronze badgesCalling pdftk is a nice way to accomplish this. I'll assume that you know how to execute an external program and leave that out.
First, create an FDF file from your PDF.
pdftk form.pdf generate_fdf output data.fdf
You can now use that as template. The sample that you provided looks like this:
%FDF-1.2 % 1 0 obj > > > > > > > >] >> >> endobj trailer > %%EOF
The fields are lines that start with /V () . Enter your desired values into those fields. For example:
%FDF-1.2 % 1 0 obj
Finally, merge the FDF with the PDF. Execute the command:
pdftk form.pdf fill_form data.fdf output form_with_data.pdf
If you don't need to keep the FDF and generated PDF files, you can simply pipe the data via stdin and stdout instead of using temp files.
answered Feb 4, 2012 at 15:48 Richard Ayotte Richard Ayotte 5,070 1 1 gold badge 38 38 silver badges 35 35 bronze badgesThank you so much for your answer. I would need a little more from you, Is PDFTK something should be installed on server ?? I didn't work with PDF much, is there some example, or could you explain a bit more that how could I execute external program?? Please help me out.
Commented Feb 4, 2012 at 20:43Yes, install pdftk on the server. You can find the instructions here. To execute system commands from PHP simply call the exec function. For example.
Commented Feb 4, 2012 at 22:42 Thanx Richard, I will try. Thanks a million. Commented Feb 5, 2012 at 8:18@RichardAyotte This was a good find :) I have to do the exact same thing, with a twist. I need also to include an image in one of the form fields. How would I do that?
Commented Dec 2, 2013 at 3:44 To "tick" a checkbox in FDF format use /V /Yes Commented Jan 26, 2021 at 15:53I found this and it works for me. It is an unofficial patch for Zend to fill FDF Form Fields.Site with the discussion and patch
NO INSTALLATION, NO OUTSIDE PROGRAMS, NO COORDINATES
$pdf = Zend_Pdf::load('input-file-containing-form.pdf'); $pdf->setTextField('name', 'Someone'); $pdf->setTextField('address', '1 Main Street'); $pdf->setTextField('city', 'Cyberspace'); $pdf->save('outputfile.pdf');
If page no longer exists here is the patch for PDF.php (if someone have problems - write me privete message):
--- Pdf.php.orig 2009-11-15 17:52:57.000000000 +0100 +++ Pdf.php 2010-01-07 04:05:23.000000000 +0100 @@ -202,6 +202,13 @@ * @var array */ protected static $_inheritableAttributes = array('Resources', 'MediaBox', 'CropBox', 'Rotate'); + + /** + * List of form fields + * + * @var array - Associative array, key: name of form field, value: Zend_Pdf_Element + */ + protected $_formFields = array(); /** * Request used memory manager @@ -315,6 +322,7 @@ $this->_loadNamedDestinations($this->_trailer->Root, $this->_parser->getPDFVersion()); $this->_loadOutlines($this->_trailer->Root); + $this->_loadFormfields($this->_trailer->Root); if ($this->_trailer->Info !== null) < $this->properties = $this->_trailer->Info->toPhp(); @@ -557,6 +565,61 @@ $this->_originalOpenOutlinesCount = $root->Outlines->Count->value; > > + + /** + * Load form fields + * Populates the _formFields array, for later lookup of fields by name + * + * @param Zend_Pdf_Element_Reference $root Document catalog entry + */ + protected function _loadFormFields(Zend_Pdf_Element_Reference $root) + < + if ($root->AcroForm === null || $root->AcroForm->Fields === null) < + return; + >+ + foreach ($root->AcroForm->Fields->items as $field) + < + if ( $field->FT->value == 'Tx' && $field->T !== null ) /* We only support fields that are textfields and have a name */ + < + $this->_formFields[$field->T->value] = $field; + > + > + + if ( !$root->AcroForm->NeedAppearances || !$root->AcroForm->NeedAppearances->value ) + < + /* Ask the .pdf viewer to generate its own appearance data, so we do not have to */ + $root->AcroForm->add(new Zend_Pdf_Element_Name('NeedAppearances'), new Zend_Pdf_Element_Boolean(true) ); + $root->AcroForm->touch(); + > + > + + /** + * Retrieves a list with the names of the AcroForm textfields in the PDF + * + * @return array of strings + */ + public function getTextFieldNames() + < + return array_keys($this->_formFields); + > + + /** + * Sets the value of an AcroForm text field + * + * @param string $name Name of textfield + * @param string $value Value + * @throws Zend_Pdf_Exception if the textfield does not exist in the pdf + */ + public function setTextField($name, $value) + < + if ( !isset($this->_formFields[$name])) + throw new Zend_Pdf_Exception("Field '$name' does not exist or is not a textfield"); + + $field = $this->_formFields[$name]; + $field->add(new Zend_Pdf_Element_Name('V'), new Zend_Pdf_Element_String($value) ); + $field->touch(); + > /** * Orginize pages to tha pages tree structure.