web-dev-qa-db-fra.com

Comment remplir le formulaire PDF en php

J'ai beaucoup de formulaires PDF, je devrais les remplir chacun en php avec les données que j'ai déjà.

Voici juste un exemple PDF form , je veux remplir ce formulaire en utilisant php. Les données que j'ai déjà dans DB. Je veux juste remplir ce formulaire et enregistrer il.

Je travaille dans PHP Zend Framework.

Tout ce que je veux, c'est quand je téléchargerais ces formulaires depuis mon site, il pré-remplirait tous les champs du formulaire pdf avec les informations que j'ai déjà.

Aidez-moi, s'il vous plaît.

20
Sohail

Appeler pdftk est un bon moyen d'y parvenir. Je suppose que vous savez comment exécuter un programme externe et laisser cela de côté.

Créez d'abord un fichier FDF à partir de votre PDF.

pdftk form.pdf generate_fdf output data.fdf

Vous pouvez maintenant l'utiliser comme modèle. L'exemple que vous avez fourni ressemble à ceci:

%FDF-1.2
%<E2><E3><CF><D3>
1 0 obj 
<<
/FDF 
<<
/Fields [
<<
/V ()
/T (Date)
>> 
<<
/V /
/T (CheckBox2)
>> 
<<
/V /
/T (CheckBox3)
>> 
<<
/V /
/T (CheckBox4)
>> 
<<
/V /
/T (CheckBox5)
>> 
<<
/V ()
/T (Your_Last_Name)
>> 
<<
/V ()
/T (Your_First_Name)
>> 
<<
/V /
/T (CheckBox1)
>>]
>>
>>
endobj 
trailer

<<
/Root 1 0 R
>>
%%EOF

Les champs sont des lignes qui commencent par /V (). Entrez vos valeurs souhaitées dans ces champs. Par exemple:

%FDF-1.2
%<E2><E3><CF><D3>
1 0 obj 
<<
/FDF 
<<
/Fields [
<<
/V (February 4, 2012)
/T (Date)
...

Enfin, fusionnez le FDF avec le PDF. Exécutez la commande:

pdftk form.pdf fill_form data.fdf output form_with_data.pdf

Si vous n'avez pas besoin de conserver le FDF et les fichiers PDF PDF générés, vous pouvez simplement diriger les données via stdin et stdout au lieu d'utiliser des fichiers temporaires.

31
Richard Ayotte

J'ai trouvé ça et ça marche pour moi. C'est un patch non officiel pour Zend pour remplir les champs de formulaire FDF . Site avec la discussion et le patch

PAS D'INSTALLATION, PAS DE PROGRAMMES EXTÉRIEURS, PAS DE COORDONNÉES

Utilisation:

$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');

Si la page n'existe plus, voici le correctif pour PDF.php (si quelqu'un a des problèmes - écrivez-moi un message privé):

--- 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.
16
Peter Denev

J'ai trouvé la bibliothèque fpdf à la recherche de la même chose sur Internet.

http://www.fpdf.org/en/script/script93.php

Le code a l'air propre, facile à utiliser et à retenir, et fonctionne pour les pdf avec des formulaires (remplissables).

<?php

/***************************
  Sample using a PHP array
****************************/

require('fpdm.php');

$fields = array(
    'name'    => 'My name',
    'address' => 'My address',
    'city'    => 'My city',
    'phone'   => 'My phone number'
);

$pdf = new FPDM('template.pdf');
$pdf->Load($fields, false); // second parameter: false if field values are in ISO-8859-1, true if UTF-8
$pdf->Merge();
$pdf->Output();
?>

Il est livré avec un exemple qui a fonctionné hors de la boîte. J'espère que ça aide.

2
erm3nda

Le composant Zend_Pdf - peut dessiner du texte dans votre pdf, mais c'est un peu maladroit car vous devez spécifier les coordonnées x et y sur votre page pdf. Quelque chose comme ca:

// This is the pdf-file you want to fill out...
$pdf = Zend_Pdf::load('/path/to/pdf-template.pdf')
$page = $pdf->pages[0]; // Use first page
$page->drawText("firstname lastname", 200, 600);
...
$pdf->pages[0] = $page;
// be sure to write to a new file, not the original empty  form.
$pdf->save('/path/to/pdf-output.pdf');

Je ne sais pas s'il existe des moyens faciles de trouver les coordonnées exactes, je joue généralement jusqu'à ce que ça corresponde.

2
dbrumann

Si cela ne vous dérange pas d'installer Drupal et de configurer un site simple, vous pouvez installer le module Fill PDF et le configurer. Si vous avez déjà les données, alors cela peut être exagéré, mais si vous pouvez importer ces données dans Drupal en quelque sorte (comme avec le module Feeds , par exemple), alors vous gagneriez du temps sur l'écriture de PDF -filling code. Vous pouvez utiliser un service hébergé avec ce module ou installer des éléments sur votre serveur.

Avertissement: je gère ce module et exécute le service hébergé.

0
wizonesolutions