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.
Nguồn
2012-08-03 09:47:30
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
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ụ. ' php exec ('/ usr/bin/pdftk form.pdf fill_form data.fdf output form_with_data.pdf'); ?> ' –
Thanx Richard, tôi sẽ thử. Cảm ơn rất nhiều. – Sohail