Question

J'ai actuellement un projet il y a un certain nombre de formes qui sont traitées et stockées dans la base de données. Après avoir réussi un administrateur est informé par e-mail avec le contenu de cette soumission du formulaire.

Le problème est pour une de ces formes je en ai besoin de regarder exactement comme la version de correspondance que j'ai au format PDF.

J'ai donc deux options de base:

  1. Figure toutes les coordonnées du « champ » je dois écrire, puis superposer mon texte dessiné à ces coordonnées
  2. Activer le pdf en format pdf en utilisant l'assistant de formulaire d'Acrobat Pro et puis définissez les valeurs de champ par programmation

Option 1 je sais est faisable. J'ai fait des choses semblables auparavant. Le problème est la forme est assez complexe et il y a beaucoup de coordonnées pour comprendre ... De plus, il y a beaucoup d'essais et d'erreurs à ce processus.

L'option 2 semble que ce serait plus facile si longtemps que je peux accéder aux champs par itération ou le nom / id et juste définir les valeurs.

Alors ma question est, est-ce Zend_Pdf soutenir la manipulation des champs de formulaire PDF? Je ne vois rien dans l'API autre que Envoyer et Réinitialiser les actions de formulaire qui indiqueraient qu'il supporte.

De plus, s'il y a d'autres bibliothèques PDF OO F / OSS qui soutiendrait l'option 2 je serais intéressé à entendre parler ainsi que des approches alternatives.

Était-ce utile?

La solution

Désolé, c'est un peu en retard, mais pensé que cela peut être utile ...

Si vous avez accès à ajouter des composants supplémentaires à votre serveur, vous pouvez utiliser PDF Labs PDF Tooklit (pdftk) bibliothèque - il est un utilitaire de ligne de commande, mais ne peut évidemment être accessible par le système / exec / commandes PassThru en PHP. Vous pouvez voir les informations pdftk ici: http://www.pdflabs.com/docs/pdftk -man pages / PDFTK vous permettra de fusionner des fichiers PDF, ajouter des fichiers PDF en arrière-plan et remplir les champs de formulaire dans un PDF (plus des charges plus) - voir le commutateur fill_form

.

Si vous pouvez ajouter pdftk à votre serveur, vous pouvez également utiliser la classe pdftk-php Andrew Heiss pour le rendre plus facile à mettre à jour les champs de formulaire dans votre pdf de l'information tirée de votre DB - vous pouvez voir plus d'infos sur: < a href = "https://github.com/andrewheiss/pdftk-php/" rel = "nofollow"> https://github.com/andrewheiss/pdftk-php/

Un dernier commentaire - si jamais vous êtes désireux de créer des fichiers PDF à la volée directement à partir de HTML puis de loin la meilleure solution est WKHTML2PDF - http://code.google.com/p/wkhtmltopdf/ - il fonctionne essentiellement comme une capture d'écran PDF d'un écran HTML (un peu plus complexe que cela, mais vous voyez l'idée).

Comme vous pouvez probablement dire que je viens de travailler sur un problème très similaire et ont traversé tellement de maux de tête pour obtenir une solution de travail.

Autres conseils

prodigitalson, je voulais poster cette solution pour vous, juste au cas où vous étiez toujours curieux de vouloir trouver une réponse. Il ne fonctionne que sur PDF est optimisé pour la version 1.5 (Acrobat 6.0), mais il ne fonctionne admirablement. Il est un correctif non officiel pour Zend Framework 1.12.3 pour remplir les champs de formulaire PDF.

pas d'installation, aucun programme extérieur, pas de coordonnées

Tout d'abord mettre à jour votre fichier php.ini avec quelque chose comme ce qui suit (note: je vais devoir changer mon fichier .ini sur mon serveur web réel lorsque je télécharger ces modifications):

include_path = ".;C:\wamp\www\includes"

Juste une remarque: je me suis déplacé tout le contenu de la bibliothèque à partir du dossier « bibliothèque ZendFramework-de 1.12.3 de \ » dans un dossier appelé Zend: C:\wamp\www\includes\Zend juste pour la facilité de référencement la bibliothèque (qui est vous avez besoin de toute façon tout).

Ensuite, dans votre fichier php (je « DIRECTORY_SEPARATOR » afin que vous puissiez l'utiliser sur un serveur Windows ou Unix et que je ne veux pas d'apporter des modifications de code en fonction de l'endroit où mon fichier .php est, je vais ne doivent modifier la configuration du serveur):

require_once('Zend'.DIRECTORY_SEPARATOR.'Loader'.DIRECTORY_SEPARATOR.'Autoloader.php');
$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('Zend_');

Et puis pour l'utilisation de code réel:

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

Ou comme je l'ai fait pour mes besoins (je aussi inclus le code que je l'habitude d'envoyer un courriel ma demande d'emploi fini et puis supprimez le fichier .pdf afin qu'il ne se bouche pas mon serveur: attach_mailer_class.php ici Copyright (c) 2006, Olaf Lederer):

// Write $_POST form data to associative array
foreach ($_POST as $key => $value) { 
    $NameArray[$key] = $value;
}

// Path to PDF application fillable file
$pdf_path = dirname(__FILE__) . "\\docs";
$pdf_filename = 'employment_applicationJBzend.pdf';
$pdf_file_path = $pdf_path . "\\" . $pdf_filename;

// Path to PDF application file save location
$result_path = dirname(__FILE__) . "\\results";
$result_filename = ucfirst($_POST['first_name']) . ucfirst($_POST['last_name']) . $filedatetime . '.pdf';
$result_file_path = $result_path . "\\" . $result_filename;

//Filling PDF fields | Example: $pdf->setTextField('position_applied_for', 'IT Manager');
$pdf = Zend_Pdf::load($pdf_file_path);

foreach ($NameArray as $key1 => $value) {
    foreach($ExceptionArray as $key2 => $value)
    {
        if($key1 == $ExceptionArray[$key2]){
            $boolSetText = false;
            break;
        }else{
            $boolSetText = true;
        }
    }
    if($boolSetText){
        $pdf->setTextField($key1, $NameArray[$key1]); 
    }
}
$pdf->save($result_file_path);

//Create and send message using 'attach_mailer_class.php
$email = new attach_mailer($from_name, $from_mail, $mail_to, $cc = "", $bcc = "", $subject);
$email->text_body = $message;
$email->add_attach_file($result_file_path);
// $email->add_attach_file("ip2nation.zip"); 
$email->process_mail();
unlink($result_file_path);

Si la page n'existe plus ici est le patch pour pdf.php (qui, si vous ne savez pas comment faire fonctionner le patch réelle, vous allez essentiellement dans votre fichier pdf.php et de remplacer toutes les lignes ci-dessous ont une « + » devant eux. Vous pouvez trouver où ils sont par la balise de localisation « @@ -202,6 +202,13 @@ » qui est juste autour de la ligne 200, puis il suffit de copier-coller pour remplacer l'ancien code avec le nouveau):

--- 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.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top