Как заполнить PDF форму в php - PullRequest
       46

Как заполнить PDF форму в php

18 голосов
/ 04 февраля 2012

У меня много PDF-форм, мне нужно заполнить каждую из них в php данными, которые у меня уже есть.

Вот только образец PDF-формы , я хочу заполнить этоФорма с использованием php.Данные у меня уже есть в БД.Я просто хочу заполнить эту форму и сохранить ее.

Я работаю в PHP Zend Framework.

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

Пожалуйста, помогите мне.

Ответы [ 5 ]

30 голосов
/ 04 февраля 2012

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

Сначала создайте файл FDF из вашего PDF.1010 *

Теперь вы можете использовать это как шаблон.Предоставленный вами пример выглядит следующим образом:

%FDF-1.2
%<E2><E3><CF><D3>
1 0 obj 
<<
/FDF 
<<
/Fields [
<<
/V ()
/T (Date)
>> 
<<
/V /
/T (CheckBox2)
>> 
<<
/V /
/T (CheckBox3)
>> 
<<
/V /
/T (CheckBox4)
>> 
<<
/V /
/T (CheckBox5)
>> 
<<
/V ()
/T (Your_Last_Name)
>> 
<<
/V ()
/T (Your_First_Name)
>> 
<<
/V /
/T (CheckBox1)
>>]
>>
>>
endobj 
trailer

<<
/Root 1 0 R
>>
%%EOF

Поля - это строки, начинающиеся с /V ().Введите желаемые значения в эти поля.Например:

%FDF-1.2
%<E2><E3><CF><D3>
1 0 obj 
<<
/FDF 
<<
/Fields [
<<
/V (February 4, 2012)
/T (Date)
...

Наконец, объедините FDF с PDF.Выполните команду:

pdftk form.pdf fill_form data.fdf output form_with_data.pdf

Если вам не нужно сохранять FDF и сгенерированные файлы PDF, вы можете просто передать данные через stdin и stdout вместо использования временных файлов.

16 голосов
/ 03 августа 2012

Я нашел это, и это работает для меня.Zend является неофициальным патчем для заполнения полей формы FDF. Сайт с обсуждением и патчем

БЕЗ УСТАНОВКИ, БЕЗ ВНЕШНИХ ПРОГРАММ, БЕЗ КООРДИНАТ

Использование:

$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.php (если у кого-то возникли проблемы - напишите мне приветственное сообщение):

--- 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.
2 голосов
/ 15 июля 2017

Я нашел библиотеку fpdf, которая ищет то же самое в Интернете.

http://www.fpdf.org/en/script/script93.php

Код выглядит чистым, простым в использовании и запоминании, а также работает с PDF с формами (заполняемыми).

<?php

/***************************
  Sample using a PHP array
****************************/

require('fpdm.php');

$fields = array(
    'name'    => 'My name',
    'address' => 'My address',
    'city'    => 'My city',
    'phone'   => 'My phone number'
);

$pdf = new FPDM('template.pdf');
$pdf->Load($fields, false); // second parameter: false if field values are in ISO-8859-1, true if UTF-8
$pdf->Merge();
$pdf->Output();
?>

Это идет с примером, который работал из коробки. Надеюсь, это поможет.

2 голосов
/ 04 февраля 2012

Компонент Zend_Pdf может рисовать текст в вашем pdf, но он немного неуклюж, так как вам нужно указать x- и y-координаты на вашей pdf-странице. Примерно так:

// This is the pdf-file you want to fill out...
$pdf = Zend_Pdf::load('/path/to/pdf-template.pdf')
$page = $pdf->pages[0]; // Use first page
$page->drawText("firstname lastname", 200, 600);
...
$pdf->pages[0] = $page;
// be sure to write to a new file, not the original empty  form.
$pdf->save('/path/to/pdf-output.pdf');

Я не знаю, есть ли простые способы найти точные координаты, я обычно играю, пока они не подойдут.

0 голосов
/ 13 апреля 2012

Если вы не возражаете против установки Drupal и настройки простого сайта, вы можете установить модуль Fill PDF и настроить его. Если у вас уже есть данные, это может быть излишним, но если вы можете каким-то образом импортировать эти данные в Drupal (например, с помощью модуля Feeds ), то вы сэкономите время на написании PDF-заполнения код. Вы можете использовать размещенный сервис с этим модулем или установить оборудование на ваш сервер.

Отказ от ответственности: я поддерживаю этот модуль и запускаю размещенную службу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...