繁体   English   中英

如何在php中填写PDF表单

[英]How to fill PDF form in php

我有很多 PDF 表单,我需要用我已经拥有的数据在 php 中填写每个表单。

这只是一个示例 PDF 表单,我想使用 php 填写此表单。 我已经在数据库中的数据。 我只想填写此表格并保存。

我在 PHP Zend 框架中工作。

我想要的只是当我从我的网站下载这些表格时,它会用我已有的信息预先填写 pdf 表格中的所有字段。

请帮我。

调用pdftk是实现此目的的好方法。 我假设您知道如何执行外部程序并忽略它。

首先,从您的 PDF 创建一个FDF文件。

pdftk form.pdf generate_fdf output data.fdf

您现在可以将其用作模板。 您提供的示例如下所示:

%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 管道数据,而不是使用临时文件。

我找到了这个,它对我有用。 它是 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.

我发现 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();
?>

它带有开箱即用的示例。 希望能帮助到你。

Zend_Pdf 组件可以在您的 pdf 中绘制文本,但它有点笨拙,因为您必须在 pdf 页面上指定 x 和 y 坐标。 类似的东西:

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

我不知道是否有简单的方法可以找到确切的坐标,我通常会一直玩到合适为止。

如果您不介意安装Drupal并设置简单站点,则可以安装Fill PDF模块并进行配置。 如果您已经拥有数据,那么这可能是过度的,但是如果您可以以某种方式将该数据导入Drupal(例如,使用Feeds模块),那么您可以节省编写PDF填充代码的时间。 您可以使用该模块的托管服务或在您的服务器上安装东西。

免责声明:我维护该模块并运行托管服务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM