2012-02-04 51 views
15

Tôi có nhiều dạng PDF, tôi sẽ cần phải điền chúng trong php với dữ liệu tôi đã có.Làm thế nào để điền vào mẫu PDF trong php

Đây chỉ là sample PDF form, tôi muốn điền biểu mẫu này bằng cách sử dụng php. Dữ liệu tôi đã có trong DB. Tôi chỉ muốn điền vào biểu mẫu này và lưu nó.

Tôi đang làm việc trong PHP Zend Framework.

Tất cả những gì tôi muốn là khi tôi tải xuống các biểu mẫu đó từ trang web của mình, nó sẽ điền trước tất cả các trường trong biểu mẫu pdf với thông tin tôi đã có.

Hãy giúp tôi.

Trả lời

29

Gọi pdftk là cách hay để thực hiện việc này. Tôi sẽ giả định rằng bạn biết làm thế nào để execute an external program và để lại điều đó.

Trước tiên, hãy tạo một tệp FDF từ tệp PDF của bạn.

pdftk form.pdf generate_fdf output data.fdf 

Bây giờ bạn có thể sử dụng làm mẫu. Mẫu bạn cung cấp trông giống như sau:

%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 

Các trường là dòng bắt đầu bằng /V(). Nhập giá trị mong muốn của bạn vào các trường đó. Ví dụ:

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

Cuối cùng, hợp nhất FDF bằng PDF. Thực hiện lệnh:

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

Nếu bạn không cần phải giữ cho FDF và tạo tập tin PDF, bạn có thể chỉ đơn giản là ống dữ liệu thông qua stdin và stdout thay vì sử dụng các file tạm.

+0

Cảm ơn bạn rất nhiều vì câu trả lời của bạn. Tôi sẽ cần nhiều hơn một chút từ bạn, Có phải PDFTK nên được cài đặt trên máy chủ không ?? Tôi đã không làm việc với PDF nhiều, là có một số ví dụ, hoặc bạn có thể giải thích thêm một chút rằng làm thế nào tôi có thể thực hiện chương trình bên ngoài ?? Hãy giúp tôi ra. – Sohail

+0

Có, cài đặt pdftk trên máy chủ. Bạn có thể tìm thấy [hướng dẫn tại đây] (http://www.pdflabs.com/docs/install-pdftk/). Để thực hiện các lệnh hệ thống từ PHP, chỉ cần gọi hàm exec. Ví dụ. ' ' –

+0

Thanx Richard, tôi sẽ thử. Cảm ơn rất nhiều. – Sohail

1

Thành phần Zend_Pdf có thể vẽ văn bản trong pdf của bạn, nhưng có một chút vụng về khi bạn phải chỉ định toạ độ x và y trên trang pdf của mình. Một cái gì đó như thế:

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

Tôi không biết có cách nào dễ dàng để tìm chính xác coords, tôi thường chơi xung quanh cho đến khi nó phù hợp.

+0

Nhưng đây không phải là điền vào mẫu PDF, điều này sẽ làm việc khác biệt cho các tệp PDF phẳng nhưng bây giờ cho các biểu mẫu PDF có thể đọc được. – Sohail

+0

Tôi biết, nên đã đề cập đến điều đó. Nhưng theo như tôi biết, đây là cách duy nhất bạn có thể đưa văn bản vào một pdf bằng cách sử dụng Zend_Pdf. – dbrumann

0

Nếu bạn không ngại cài đặt Drupal và thiết lập một trang web đơn giản, bạn có thể cài đặt mô-đun Fill PDF và định cấu hình nó. Nếu bạn đã có dữ liệu, thì điều này có thể là quá mức cần thiết, nhưng nếu bạn có thể nhập dữ liệu đó vào Drupal bằng cách nào đó (ví dụ như với mô-đun Feeds), thì bạn sẽ tiết kiệm thời gian viết mã điền PDF. Bạn có thể sử dụng dịch vụ được lưu trữ với mô-đun đó hoặc cài đặt nội dung trên máy chủ của mình.

Tuyên bố từ chối trách nhiệm: Tôi duy trì mô-đun đó và chạy dịch vụ được lưu trữ.

16

Tôi đã tìm thấy điều này và nó hoạt động cho tôi. Nó là một bản vá không chính thức cho Zend để điền vào các trường mẫu FDF. Site with the discussion and patch

Không cần cài đặt, không có chương trình bên ngoài, NO tọa

Sử dụng:

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

Nếu trang không còn tồn tại ở đây là bản vá cho PDF.php (nếu ai đó gặp sự cố - hãy viết cho tôi thư cá nhân):

--- 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. 
+0

Cảm ơn vì điều này, đó là chính xác những gì tôi đang tìm kiếm! – joren

+4

Cảm ơn, điều này tốt hơn nhiều so với cài đặt thêm phần mềm. Tôi hoàn toàn không thể tin rằng bản vá này KHÔNG BAO GIỜ làm cho nó thành Zend Framework. –

+0

Tôi vừa tải xuống khung công tác Zend và bản vá đã có trong đó ... Vì vậy, không cần phải vá ngay bây giờ. –

1

Tôi tìm thấy thư viện fpdf đang tìm kiếm trên internet.

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

Mã trông sạch sẽ, dễ sử dụng và ghi nhớ nó, và làm việc cho pdf với các hình thức (fillable).

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

Nó đi kèm với ví dụ làm việc ra khỏi hộp. Hy vọng điều đó sẽ hữu ích.

Các vấn đề liên quan