Domanda

Al momento ho un progetto ci sono una serie di forme che vengono elaborati e memorizzati nel DB. In caso di superamento di un amministratore viene avvisato per e-mail con il contenuto di quella forma di presentazione.

Il problema è per una di queste forme ho bisogno di apparire esattamente come la versione per corrispondenza che ho in formato PDF.

Così ho due opzioni di base:

  1. capire tutte le coordinate del "campo" ho bisogno di scrivere a e sovrapporre il mio testo elaborato a quelle coordinate
  2. Ruotare il pdf in un modulo PDF utilizzando Acrobat Pro Creazione guidata Maschera e quindi impostare i valori dei campi a livello di codice

L'opzione 1 so che è fattibile. Ho fatto cose simili prima. Il problema è la forma è abbastanza complessa e ci sono un sacco di coordinate per capire ... Inoltre, c'è un sacco di tentativi ed errori per questo processo.

L'opzione 2 sembra che sarebbe più facile fintanto che posso accedere ai campi attraverso l'iterazione o il nome / id e basta impostare i valori.

Quindi la mia domanda è, fa Zend_Pdf sostenere la manipolazione dei campi dei moduli PDF? Non vedo nulla nel API diversa Invia e ripristinare azioni modulo che denotano supporta questo.

Inoltre, se ci sono altre librerie OO F / OSS PDF che sosterrebbero l'opzione 2 sarei interessato a sentir parlare di loro così come eventuali approcci alternativi.

È stato utile?

Soluzione

Spiacente, questo è un po 'tardi, ma pensato che questo può essere utile ...

Se si ha accesso ad aggiungere componenti aggiuntivi al server, è possibile utilizzare PDF Labs PDF Tooklit (pdftk) library - si tratta di un'utility a riga di comando, ma può ovviamente essere accessibile dal sistema / exec / passante comandi in PHP. È possibile vedere informazioni pdftk qui: http://www.pdflabs.com/docs/pdftk -man-page / PDFTK vi permetterà di file PDF di unione, aggiungere file PDF di sfondo e campi del modulo di riempimento all'interno di un PDF (più carichi di più) -. consultare l'interruttore fill_form

Se è possibile aggiungere pdftk al server allora si può anche utilizzare la classe pdftk-php di Andrew Heiss per rendere più facile per aggiornare i campi modulo nel pdf dal informazioni tirato dal vostro DB - si possono vedere più informazioni a: < a href = "https://github.com/andrewheiss/pdftk-php/" rel = "nofollow"> https://github.com/andrewheiss/pdftk-php/

Un ultimo commento - se si è mai voglia di creare file PDF al volo direttamente da HTML quindi di gran lunga la soluzione migliore è WKHTML2PDF - http://code.google.com/p/wkhtmltopdf/ - funziona praticamente come un PDF schermata di qualsiasi tipo HTML (un po 'più complessa di quella, ma si ottiene l'idea).

Come si può probabilmente dire che ho appena lavorato su un problema molto simile e sono passati attraverso soooo molti mal di testa per ottenere una soluzione di lavoro.

Altri suggerimenti

prodigitalson, ho voluto postare questa soluzione per voi, nel caso in cui si dovesse ancora curioso di voler trovare una risposta. Funziona solo su PDF ottimizzato per la versione 1.5 (Acrobat 6.0), ma funziona in modo bello. Si tratta di una patch non ufficiale per Zend Framework 1.12.3 a riempire PDF campi modulo. del sito con la discussione e la patch

nessuna installazione, nessun programma esterno, NO COORDINATE

In primo luogo aggiornare il file php.ini con qualcosa di simile a quanto segue (nota: dovrò cambiare il mio file .ini sul mio server web attuale quando si invia questi cambiamenti):

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

Solo una nota: ho spostato tutto il contenuto della biblioteca fuori dalla cartella 'ZendFramework-1.12.3 \ library' in una cartella chiamata Zend: C:\wamp\www\includes\Zend solo per la facilità di riferimento della biblioteca (che è tutto ciò che serve in ogni modo).

Poi nel file php (io ho usato 'DIRECTORY_SEPARATOR' in modo che si può utilizzare su un server Windows o Unix e che non dovrà fare alcun codice cambia a seconda di dove il mio file .php è, io avere solo per apportare modifiche alla configurazione del server):

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

E poi per l'uso codice vero e proprio:

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

O come ho fatto per i miei scopi (ho incluso anche il codice che ho usato per e-mail la mia domanda di lavoro finito e quindi eliminare il file pdf in modo da non intasare il mio server: attach_mailer_class.php disponibile qui 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);

Se la pagina non esiste più qui è la patch per PDF.php (che se non si sa come far funzionare la patch attuale, in pratica si passa attraverso il file PDF.php e sostituire tutte le linee che hanno un seguito '+' davanti a loro. potete trovare dove sono dal tag posizione '@@ -202,6 +202,13 @@' che si trova proprio linea di circa 200, quindi basta copiare e incollare per sostituire il vecchio codice con il nuovo):

--- 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.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top