Pergunta

Atualmente tenho um projeto há uma série de formas que são processados e armazenados no bd.Após a conclusão bem sucedida de um administrador é notificado por e-mail com o conteúdo do formulário de submissão.

O problema é que, por uma das seguintes formas eu preciso dele para parecer exatamente como a versão que eu tenho em formato PDF.

Então, eu tenho duas opções básicas:

  1. Descobrir todas as coordenadas do "campo" eu preciso escrever para e, em seguida, sobreposição de minha desenhado texto nessas coordenadas
  2. Rode o pdf em um formulário pdf usando o Acrobat Pro assistente de formulário e, em seguida, defina os valores de campo através de programação

Opção 1 eu sei que é factível.Eu tenho feito coisas semelhantes antes.O problema é que o formulário é bastante complexo, e há UM MONTE de coordenadas para descobrir...Além disso, há um monte de tentativa e erro para este processo.

Opção 2 parece que ele iria ser mais fácil, desde que eu possa acessar os campos através de iteração ou o nome/id e defina os valores.

Então, minha pergunta é, será que Zend_Pdf suporte a manipulação de campos de formulários em PDF?Eu não vejo nada na API diferente de Submeter e Repor formulário de medidas que possam denotar suporta isso.

Além disso, se há outros OO F/OSS PDF bibliotecas de apoio opção 2 eu estaria interessado em ouvir sobre eles, bem como quaisquer abordagens alternativas.

Foi útil?

Solução

Desculpe, isso é um pouco tarde, mas pensei que isso pode ser útil...

Se você tiver acesso ao adicionar componentes adicionais para o servidor, em seguida, você pode usar o PDF Laboratórios PDF Tooklit (pdftk) biblioteca - é um utilitário de linha de comando mas, obviamente, pode ser acessado pelo sistema/exec/passagem de comandos em PHP.Você pode ver pdftk info aqui: http://www.pdflabs.com/docs/pdftk-man-page/ PDFTK irá permitir que você mesclar arquivos pdf, adicionar plano de fundo de pdf e preencher campos de formulário dentro de um PDF (e muito mais) - veja a fill_form mudar.

Se você pode adicionar pdftk para o seu servidor, em seguida, você também pode usar Andrew Heiss do pdftk-classe php para tornar mais fácil para atualizar os campos de formulário em pdf a partir de informações extraídas de seu banco de dados - você pode ver mais informações em: https://github.com/andrewheiss/pdftk-php/

Um último comentário - se você está sempre querendo criar PDFs em tempo real directamente a partir do HTML, em seguida, de longe, a melhor solução é WKHTML2PDF - http://code.google.com/p/wkhtmltopdf/ - ele funciona basicamente como um PDF screenshot de qualquer HTML de tela (um pouco mais complexa que isso, mas essa é a idéia).

Como você provavelmente pode dizer eu tenho apenas trabalhado muito semelhante problema e passaram por soooo muitas dores de cabeça para obter uma solução de trabalho.

Outras dicas

prodigitalson, eu queria postar esta solução para você, apenas no caso de você ainda estava curioso sobre o desejo de encontrar uma resposta.Ele só funciona em PDF otimizado para a versão 1.5 (Acrobat 6.0), mas ele não funcionar muito bem.Não é oficial patch para o Zend Framework 1.12.3 para preencher Campos de formulários em PDF. Site com a discussão e patch

SEM INSTALAÇÃO, SEM A PROGRAMAS EXTERNOS, NÃO COORDENADAS

Primeira atualização do seu php.arquivo ini com algo como o seguinte (observe:vou ter que mudar o meu .arquivo ini no meu servidor web real quando eu carregar estas alterações):

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

Apenas uma nota:Mudei todo o conteúdo da biblioteca da ZendFramework-1.12.3\' biblioteca pasta em uma pasta chamada Zend: C:\wamp\www\includes\Zend apenas para facilitar a referência a biblioteca (que é tudo o que você precisa, de qualquer maneira).

Em seguida, no seu arquivo php (eu usei 'DIRECTORY_SEPARATOR", de modo que você pode usá-lo em uma Vitória ou um servidor Unix e que eu não é necessário efectuar quaisquer alterações de código, dependendo de onde o meu .arquivo php é, eu só terá de fazer alterações na configuração do servidor):

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

E, em seguida, para o código real de uso:

$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 como eu fiz isso para meus propósitos (eu também o código que eu usei para o meu e-mail terminar a aplicação do emprego e, em seguida, elimine o .arquivo pdf para que ele não entupir meu servidor:attach_mailer_class.php disponível aqui 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 a página não existe mais aqui é o patch para PDF.php (que se você não sabe como executar o patch, basicamente, através de seu PDF.php arquivo e substituir todas as linhas que abaixo tem um " + " na frente deles.Você pode descobrir onde eles estão com a localização tag '@@ -202,6 +202,13 @@', que é o direito em torno da linha 200, em seguida, basta copiar e colar para substituir o antigo código novo):

--- 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top