通过 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');
对我有用。
我在 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');
对我有用。