Вопрос

В настоящее время у меня есть проект, существует ряд форм, которые обрабатываются и хранятся в БД. После успешного завершения администратор уведомляется по электронной почте с содержанием этой формы представления.

Проблема в том, что для одной из этих форм мне нужно, чтобы она выглядела точно так же, как версия почтового заказа, которую у меня в формате PDF.

Поэтому у меня есть два основных варианта:

  1. Выясните все координаты «поля», мне нужно написать, а затем накладывать мой нарисованный текст на этих координатах
  2. Поверните PDF в форму PDF, используя мастер формы формы Acrobat Pro, а затем установить значения поля программно

Вариант 1 Я знаю, является выполненным. Я сделал подобные вещи раньше. Проблема в том, что форма довольно сложная, и есть много координат, чтобы выяснить ... Кроме того, есть много испытаний и ошибок к этому процессу.

Вариант 2 кажется, что было бы проще, так как я могу получить доступ к полям итерации или имени / ID и просто устанавливать значения.

Таким образом, мой вопрос: Zend_PDF поддерживает манипулирование полей формы PDF? Я ничего не вижу в API, кроме отправки и сброса действий, которые обозначают, что он поддерживает это.

Кроме того, если есть и другие библиотеки PDF OO F / OSS, которые будут поддерживать вариант 2, я был бы заинтересован в том, чтобы услышать о них, а также любые альтернативные подходы.

Это было полезно?

Решение

Извините, это немного поздно, но думал, что это может быть полезно ...

Если у вас есть доступ, чтобы добавить дополнительные компоненты на свой сервер, вы можете использовать библиотеку PDF Labs PDF (PDFTK) - это утилита командной строки, но может, очевидно, доступ к командам System / Exec / Passthru в PHP. Вы можете увидеть информацию PDFTK здесь: http://www.pdflabs.com/docs/pdftk-man-page/ PDFTK позволит вам объединить PDFS, добавить фоновые PDFS и поля формы заполнения в формате PDF (PLUS BUTE) - см. Переключатель Fill_Form.

Если вы можете добавить PDFTK на свой сервер, вы также можете использовать класс PDFTK-PHP-PHP-PHP-PHP andrew Heiss, чтобы облегчить обновление полей формы в своем PDF из информации, вытащенной из DB - вы можете увидеть больше информации по адресу: https://github.com/andrewheiss/pdftk-php/

Последний комментарий - если вы когда-либо хотите создать PDFS на лету напрямую из HTML, то, безусловно, лучшее решение является WHTML2PDF - http://code.google.com/p/wkhtmltopdf/ - Он в основном работает как скриншот PDF любого HTML-экрана (немного сложнее, чем это, но вы получаете идею).

Как вы, вероятно, можно сказать, что я только что работал над очень похожей на проблему и прошел через SOOOO много головных болей, чтобы получить рабочее решение.

Другие советы

Prodigitalson, я хотел опубликовать это решение для вас, на всякий случай, если вам все еще интересно узнать о том, чтобы найти ответ. Он работает только на PDF оптимизирован для версии 1.5 (Acrobat 6.0), но он работает красиво. Это неофициальный патч для Zend Framework 1.12.3 для заполнения полей формы PDF. Сайт с обсуждением и патчем

Нет установки, нет внешних программ, без координат

Сначала обновите свой файл php.ini с чем-то вроде следующего (Примечание: мне придется изменить мой файл .ini на своем настоящем веб-сервере, когда я загружаю эти изменения):

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

Просто примечание: я переместил все содержимое библиотеки из папки «ZendFramework-1.12.3 библиотека» в папку, называемую Zend: C:\wamp\www\includes\Zend Просто для простоты ссылки на библиотеку (которая есть все, что вам нужно в любом случае).

Затем в вашем файле PHP (я использовал «Directory_separator», чтобы вы могли использовать его на сервере Win или Unix и что мне не придется делать какие-либо изменения кода в зависимости от того, где есть мой файл .php, я только должен Сделайте изменения конфигурации сервера):

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

А затем для реального использования кода:

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

Или, как я сделал это для моих целей (я также включал код, который я использовал для отправки моего приложения завершенного занятия, а затем удалить файл .pdf, чтобы он не засорял мой сервер: altics_mailer_class.php доступно здесь Copyright (C) 2006, Олаф Ледерер):

// 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);

Если здесь не существует страница, - это патч для pdf.php (который, если вы не знаете, как запустить фактический патч, в основном вы проходите через файл PDF.PHP и замените все строки, которые ниже имеют «+» Перед ними. Вы можете найти, где они по тему местоположения '@@ -202,6 +202,13 @@', который правильно вокруг линии 200, то просто скопируйте и вставьте, чтобы заменить старый код с новым) :

--- 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.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top