通过PHP填写PDF表单-PDFtk无法正常工作

时间:2018-06-26 03:23:21

标签: php pdf pdftk

我有在SAP中生成的PDF表格。该表格大约有30个字段。有些已经装满了。而其他人将由员工填补。这是该表格的示例。

enter image description here

现在,我将创建一个php应用程序,该应用程序可以接受来自用户的数据并填写以上表格并生成该PDF文件。我阅读了PDFtk Server Utility填写PDF表单的教程。因此,我在Windows 7中下载并安装了该工具。在创建PHP应用程序之前,我认为我必须尝试在PC上手动填写表格。因此,首先,我使用以下命令转储数据字段并尝试填充一个变量。

pdftk sample.pdf dump_data_fields > fields_names.txt

输出:

.
.
FieldType: Text
FieldName: data[0].#pageSet[0].TimeSheet[0].CURRENTWEEK[0]
FieldNameAlt: Week
FieldFlags: 0
FieldValueDefault: 26
FieldJustification: Left
FieldMaxLength: 2
---
FieldType: Text
FieldName: data[0].#pageSet[0].TimeSheet[0].CURRENTYEAR[0]
FieldNameAlt: Year
FieldFlags: 0
FieldValueDefault: 2018
FieldJustification: Left
FieldMaxLength: 4
.
.

然后我创建FDF文件以填充CURRENTWEEK变量。

%FDF-1.2
%âãÏÓ
1 0 obj 
<<
/FDF 
<<
/Fields [
<</T(data[0].#pageSet[0].TimeSheet[0].CURRENTWEEK[0])/V(80)>>
]
>>
>>
endobj
trailer
<<
/Root 1 0 R
>>
%%EOF

我运行此命令以生成填充表格

pdftk sample.pdf fill_form data.fdf output output.pdf

PDF表格未填写。仍显示原始PDF表单。 当我转储新创建的表单的字段时,它再次显示。

---
FieldType: Text
FieldName: data[0].#pageSet[0].TimeSheet[0].CURRENTWEEK[0]
FieldNameAlt: Week
FieldFlags: 0
FieldValue: 80
FieldValueDefault: 26
FieldJustification: Left
FieldMaxLength: 2
---

FieldValue:80被添加,但是表格中没有数据。在字段中显示相同的26值。 创建FDF或运行命令时是否有任何错误?

3 个答案:

答案 0 :(得分:0)

我认为这是fdf文件格式的问题,因此首先使用以下文件更新fdf文件:

{{ @action($controller.'@show', ['id' => $id])}}

更新fdf文件后,在终端中运行以下命令:

%FDF-1.2
1 0 obj<</FDF<< /Fields[

<</T(data[0].#pageSet[0].TimeSheet[0].CURRENTWEEK[0])/V(80)>>

] >> >>
endobj
trailer
<</Root 1 0 R>>
%%EOF

注意:正确检查所有文件的路径

希望它能对您有所帮助。

答案 1 :(得分:0)

PDF中的表格技术有两种。

  • AcroForm技术:使用PDF语法定义表格;字段名称看起来像这样:timeSheet.currentweek
  • XML表单体系结构(又称XFA):表单是使用XML定义的;字段名称如下所示:data[0].#pageSet[0].TimeSheet[0].CURRENTWEEK[0]

有时,PDF包含两种技术。这通常称为混合形式

根据您在问题中分享的信息,我认为您的表单是混合表单。表单中包含XFA流,同时,这些字段是使用PDF定义的句法。填写时,您需要确保更新AcroForm表单字段以及 XFA表单的XML。

为什么pdfTk不能正确执行此操作?

pdfTk是iText的翻版,该iText使用a version of iText that should no longer be used编译为GCJ可执行文件。由于我是iText的原始开发人员,因此在一些pdfTk错误消息中,您可能会注意到我的姓氏。 pdfTk使用的iText版本早于iText中的XFA支持,因此pdfTk无法正确填写表单是正常的。

如何解决此问题?

  • 一种解决方法是在填写表单之前删除XFA部分。参见PDFTK and removing the XFA format
  • 另一种解决方法是切换到Java或C#,并使用最新版本的iText,而不是编译为可执行文件的旧版本。

答案 2 :(得分:0)

首先,您已经在服务器上安装了pdftk,然后运行以下命令

pdftk path/to/the/form.pdf dump_data_fields > field_names.txt

您会得到pdf文件的txt文件,其输出如下所示

FieldType: Text
FieldName: data[0].#pageSet[0].TimeSheet[0].KUNNR[0]
FieldNameAlt: User
FieldFlags: 1
FieldValueDefault: 65604
FieldJustification: Left
FieldMaxLength: 10
FieldJustification: Left
---

然后您使用以下软件包

composer require mikehaertl/php-pdftk

然后更新作曲家

 use mikehaertl\pdftk\Pdf; 
// Fill form with data array
    $pdf = new Pdf('path of your pdf');
    $pdf->fillForm([
        'data[0].#pageSet[0].TimeSheet[0].KUNNR[0]'=>'sanjay',
    ])
        ->needAppearances()
        ->saveAs('filled.pdf');

这对我有用。