【问题标题】:Filling PDF form by PHP - PDFtk not working通过 PHP 填写 PDF 表单 - PDFtk 不工作
【发布时间】:2018-12-04 16:13:51
【问题描述】:

我在 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或者运行命令有没有错误?

【问题讨论】:

    标签: php pdf pdftk


    【解决方案1】:

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

    这对我有用。

    【讨论】:

    • 是的..它的工作..但它删除了 XFA 结构。这样它就不再在软件中可读了。有什么方法可以更新 XFA 结构?
    • 参考这个链接希望对你有帮助stackoverflow.com/questions/29633873/…
    【解决方案2】:

    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 的 iText 的翻版,使用 GCJ 编译为可执行文件。您可能会在一些 pdfTk 错误消息中注意到我的姓氏,因为我是 iText 的原始开发者。 pdfTk 使用的 iText 版本早于 iText 中的 XFA 支持,因此 pdfTk 无法正确填写表单是正常的。

    如何解决这个问题?

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

    【讨论】:

    • 您好 Bruno,感谢您的详细解释。我正在用 PHP 开发我的网络应用程序,我想将数据库中的数据放入上述 PDF 表单中。我可以使用 iText 填写此表格吗?是的,那么是否有任何教程可以找到详细说明。 ?
    • 正如我所解释的,iText 仅存在于 Java 和 .NET 中,而不存在于 PHP 中。官网有很多教程itextpdf.com
    • 我们可以用Java开发简单的API。 PHP 表单会将数据发送到 API,API 可以使用 iText 将数据填充到 PDF 表单中,并使用填充的表单创建新的 PDF 文件。有可能吗?
    【解决方案3】:

    我认为这是 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
    

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

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2021-01-13
      • 2018-10-26
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多