通过 PHP 填写 PDF 表单 - PDFtk 不工作

Filling PDF form by PHP - PDFtk not working

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

现在我要创建一个 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 或 运行ning 命令时是否有任何错误?

我认为这是 fdf 文件格式的问题,所以首先使用以下文件更新您的 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

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

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

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

希望对你有所帮助

PDF 中有两种表单技术。

  • AcroForm技术:使用PDF语法定义表单;字段名称如下所示:timeSheet.currentweek.
  • XML 表单架构(又名 XFA):表单是使用 XML 定义的;字段名称如下所示:data[0].#pageSet[0].TimeSheet[0].CURRENTWEEK[0]

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

根据您在问题中分享的信息,我假设您的表单是混合表单。该表单内部有一个 XFA 流,同时,字段是使用 PDF 语法定义的。填写时,您需要确保更新 AcroForm 表单字段 以及 XFA 表单的 XML。

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

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

如何解决这个问题?

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

首先你已经在你的服务器上安装了 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');

对我有用。