Pregunta

Actualmente tengo un proyecto hay una serie de formas que son procesados ??y almacenados en la base de datos. Al completar con éxito un administrador es notificado por correo electrónico con el contenido de ese formulario de envío.

El problema es que uno de estos formularios que necesito que se vea exactamente igual que la versión de venta por correo, que tengo en formato PDF.

Así que tengo dos opciones básicas:

  1. Figura cabo todas las coordenadas del "campo" Tengo que escribir a, y luego superpuse mi texto dibujado en esas coordenadas
  2. Girar el PDF en un formulario PDF con Acrobat Pro asistente de formulario y establezca los valores de campo mediante programación

Opción 1 know i es factible. He hecho cosas similares antes. El problema es la forma es bastante complejo y hay una gran cantidad de coordenadas de averiguar ... Por otra parte, hay un montón de prueba y error para este proceso.

La opción 2 parece que sería más fácil tanto tiempo como puedo acceder a los campos a través de iteración o nombre / ID y acaba de establecer los valores.

Así que mi pregunta es: ¿Zend_Pdf apoyar la manipulación de los campos de formulario PDF? No veo nada en la API que no sea Presentar y acciones Restablecer formulario que denotar que apoya esto.

Además, si hay otras bibliotecas PDF OO F / OSS que apoyarían la opción 2 estaría interesado en escuchar acerca de ellos, así como cualquier enfoques alternativos.

¿Fue útil?

Solución

Lo sentimos, este es un poco tarde, pero pensamos que esto puede ser útil ...

Si usted tiene acceso a añadir componentes adicionales a su servidor, puede utilizar PDF PDF laboratorios Tooklit (pdftk) Biblioteca - es una utilidad de línea de comandos, pero puede ser visitada, obviamente, por el sistema / exec / tránsito comandos en PHP. Puede ver información pdftk aquí: http://www.pdflabs.com/docs/pdftk -man-página / PDFTK le permitirá a los archivos PDF de mezcla, añadir archivos PDF fondo y campos de formulario relleno dentro de un PDF (además de un montón más) -. ver el interruptor fill_form

Si usted puede agregar pdftk a su servidor, entonces también puede utilizar la clase pdftk-php de Andrew Heiss para que sea más fácil de actualizar los campos de formulario en el pdf de la información extraída de su base de datos - se puede ver más información en: < a href = "https://github.com/andrewheiss/pdftk-php/" rel = "nofollow"> https://github.com/andrewheiss/pdftk-php/

Un último comentario - si alguna vez quieren crear archivos PDF sobre la marcha directamente de HTML, entonces, con mucho, la mejor solución es WKHTML2PDF - http://code.google.com/p/wkhtmltopdf/ - funciona básicamente como un PDF captura de pantalla de cualquier pantalla de HTML (un poco más complejo que eso, pero se entiende la idea).

Como seguramente se puede decir que acabo de estado trabajando en un problema muy similar y han pasado por soooo muchos dolores de cabeza para obtener una solución de trabajo.

Otros consejos

prodigitalson, quería publicar esta solución para que, en caso de que todavía tenían curiosidad sobre el deseo de encontrar una respuesta. Sólo funciona en PDF optimizado para la versión 1.5 (Acrobat 6.0), pero funciona muy bien. Es un parche no oficial para Zend Framework 1.12.3 para rellenar campos de formulario PDF. con la discusión y el parche

sin instalación, programas fuera NO, NO COORDINATES

En primer lugar actualizar su archivo php.ini con algo como lo siguiente (nota: voy a tener que cambiar mi archivo .ini en mi servidor web real cuando subo estos cambios):

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

Sólo una nota: Me moví todos los contenidos de la biblioteca fuera de la carpeta 'ZendFramework-1.12.3 \ library' en una carpeta llamada Zend: C:\wamp\www\includes\Zend sólo por la facilidad de hacer referencia a la biblioteca (que es todo lo que de todos modos es necesario).

A continuación, en el archivo PHP (I utilizado 'DIRECTORY_SEPARATOR' para que pueda usarlo en un servidor de victorias o Unix y que no tendrá que hacer ningún código cambia dependiendo de donde mi archivo .php es, me quedo sólo tiene que hacer cambios en la configuración del servidor):

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

Y a continuación, para el uso código real:

$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, como lo hice para mis propósitos (que también incluye el código que he utilizado para enviar por correo electrónico a mi solicitud de empleo terminado y luego eliminar el archivo .pdf para que no obstruye mi servidor: attach_mailer_class.php disponible aquí 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 página ya no existe aquí es el parche para PDF.php (que si usted no sabe cómo ejecutar el parche real, básicamente vas a través de su archivo PDF.php y reemplazar todas las líneas que a continuación tienen una '+' delante de ellos. puede encontrar donde están por la etiqueta de ubicación '@@ -202,6 +202,13 @@', que está alrededor de la línea 200 a la derecha, a continuación, sólo copiar y pegar para reemplazar el código antiguo con la nueva):

--- 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.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top