2012-02-04 12 views
15

में पीडीएफ फॉर्म भरने के लिए कैसे मेरे पास कई पीडीएफ फॉर्म हैं, मुझे उन्हें पहले से मौजूद डेटा के साथ php में भरना होगा।पीएचपी

यहां केवल sample PDF form है, मैं इस फ़ॉर्म को php का उपयोग करके भरना चाहता हूं। मेरे पास पहले से डीबी में डेटा है। मैं सिर्फ इस फॉर्म को भरना चाहता हूं और इसे सहेजना चाहता हूं।

मैं PHP ज़ेंड फ्रेमवर्क में काम कर रहा हूं।

मैं चाहता हूं कि जब मैं अपनी साइट से उन फॉर्मों को डाउनलोड करूंगा, तो यह मेरे पास पहले से मौजूद जानकारी के साथ पीडीएफ फॉर्म में सभी फ़ील्ड को पूर्व-भर देगा।

कृपया मेरी मदद करें।

उत्तर

29

कॉलिंग pdftk इसे पूरा करने का एक अच्छा तरीका है। मुझे लगता है कि आप जानते हैं कि execute an external program कैसे करें और इसे छोड़ दें।

सबसे पहले, अपने पीडीएफ से 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) 
... 

अंत में, पीडीएफ के साथ एफडीएफ को विलय करें। आदेश निष्पादित करें:

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

आप FDF रखने के लिए और की जरूरत नहीं है पीडीएफ फाइलों उत्पन्न, आप कर सकते हैं stdin और stdout के बजाय अस्थायी फ़ाइलों का उपयोग कर के माध्यम से बस पाइप डेटा।

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद। मुझे आपके से थोड़ा और चाहिए, क्या पीडीएफटीके सर्वर पर कुछ स्थापित होना चाहिए ?? मैंने पीडीएफ के साथ काम नहीं किया, क्या कोई उदाहरण है, या आप थोड़ा और बता सकते हैं कि मैं बाहरी प्रोग्राम कैसे निष्पादित कर सकता हूं ?? कृपया मेरी मदद करें। – Sohail

+0

हां, सर्वर पर पीडीएफटीके स्थापित करें। आप [निर्देश यहां] (http://www.pdflabs.com/docs/install-pdftk/) पा सकते हैं। PHP से सिस्टम कमांड निष्पादित करने के लिए बस निष्पादन फ़ंक्शन को कॉल करें। उदाहरण के लिए। ' ' –

+0

थेंक्स रिचर्ड, मैं कोशिश करूंगा। बहुत - बहुत धन्यवाद। – Sohail

1

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

मैं अगर वहाँ आसान तरीके से सटीक coords को खोजने के लिए कर रहे हैं पता नहीं है, मैं आमतौर पर चारों ओर खेलने जब तक यह फिट बैठता है।

+0

लेकिन यह पीडीएफ फॉर्म भर नहीं रहा है, यह स्पष्ट रूप से फ्लैट पीडीएफ के लिए काम करेगा लेकिन अब पीडीएफ फॉर्मों के लिए काम करेगा। – Sohail

+0

मुझे पता है, इसका उल्लेख किया जाना चाहिए था। लेकिन जहां तक ​​मुझे पता है, यह एकमात्र तरीका है जिसे आप Zend_Pdf का उपयोग करके एक पीडीएफ में टेक्स्ट डाल सकते हैं। – dbrumann

0

यदि आपको ड्रूपल स्थापित करने और एक साधारण साइट सेट करने में कोई फर्क नहीं पड़ता है, तो आप Fill PDF मॉड्यूल स्थापित कर सकते हैं और इसे कॉन्फ़िगर कर सकते हैं। यदि आपके पास पहले से डेटा है, तो यह अधिक हो सकता है, लेकिन यदि आप उस डेटा को किसी भी तरह ड्रूपल में आयात कर सकते हैं (उदाहरण के लिए Feeds मॉड्यूल के साथ), तो आप पीडीएफ भरने कोड लिखने पर समय बचाएंगे। आप उस मॉड्यूल के साथ होस्टेड सेवा का उपयोग कर सकते हैं या अपने सर्वर पर सामान इंस्टॉल कर सकते हैं।

अस्वीकरण: मैं उस मॉड्यूल को बनाए रखता हूं और होस्ट की गई सेवा चलाता हूं।

16

मुझे यह मिला और यह मेरे लिए काम करता है। यह ज़ेड के लिए एफडीएफ फॉर्म फ़ील्ड भरने के लिए एक अनौपचारिक पैच है। Site with the discussion and patch

कोई इंस्टॉलेशन, नहीं बाहर कार्यक्रमों, नहीं निर्देशांक

उपयोग:

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

पृष्ठ अब यहाँ मौजूद है पीडीएफ के लिए पैच है।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. 
+0

इसके लिए धन्यवाद, यह वही था जो मैं ढूंढ रहा था! – joren

+4

धन्यवाद, यह अतिरिक्त सॉफ्टवेयर स्थापित करने से कहीं बेहतर है। मैं काफी विश्वास नहीं कर सकता कि इस पैच ने इसे ज़ेन फ्रेमवर्क में कभी नहीं बनाया है। –

+0

मैंने अभी ज़ेंड फ्रेमवर्क डाउनलोड किया है और पैच पहले से ही वहां है ... इसलिए अब पैच करने की आवश्यकता नहीं है। –

1

मुझे इंटरनेट पर fpdf लाइब्रेरी मिलती है।

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

कोड, स्वच्छ उपयोग करें और यह याद रखने में आसान लग रहा है, और साथ रूपों (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(); 
?> 

यह उदाहरण के साथ आता है जो बॉक्स से बाहर काम करता है। उम्मीद है कि यह मदद करता है।