首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用PHP - PDFtk填写PDF表格

用PHP - PDFtk填写PDF表格
EN

Stack Overflow用户
提问于 2018-06-26 03:23:21
回答 3查看 8.1K关注 0票数 0

我在SAP中生成了PDF表单。这种形式的字段大约有30个。有些已经满了。而其他人则由员工来代替。这是那份表格的样品。

现在,我将创建一个php应用程序,它可以接受用户的数据并填写上面的表单并生成PDF文件。我阅读了由PDFtk服务器实用程序填写PDF表单的教程。所以我下载并安装在我的windows 7中。在创建我的PHP应用程序之前,我想我必须尝试在我的PC上手动填写这个表单。因此,首先我使用以下命令转储数据字段,然后尝试填充一个变量。

代码语言:javascript
运行
复制
pdftk sample.pdf dump_data_fields > fields_names.txt

产出:

代码语言:javascript
运行
复制
.
.
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变量。

代码语言:javascript
运行
复制
%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

我运行这个命令来生成填充表单。

代码语言:javascript
运行
复制
pdftk sample.pdf fill_form data.fdf output output.pdf

PDF表格没有填写。仍然显示原始PDF表格。同样,当我转储新创建的字段时,它显示..。

代码语言:javascript
运行
复制
---
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或运行命令时是否出错?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-28 06:26:49

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

代码语言:javascript
运行
复制
pdftk path/to/the/form.pdf dump_data_fields > field_names.txt

你得到了你的pdf文件的txt文件,它的输出如下

代码语言:javascript
运行
复制
FieldType: Text
FieldName: data[0].#pageSet[0].TimeSheet[0].KUNNR[0]
FieldNameAlt: User
FieldFlags: 1
FieldValueDefault: 65604
FieldJustification: Left
FieldMaxLength: 10
FieldJustification: Left
---

然后你用下面的软件包

代码语言:javascript
运行
复制
composer require mikehaertl/php-pdftk

然后更新编写器

代码语言:javascript
运行
复制
 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');

这是我的工作。

票数 0
EN

Stack Overflow用户

发布于 2018-06-26 11:38:44

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

代码语言:javascript
运行
复制
%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文件后,在终端中运行以下命令:

代码语言:javascript
运行
复制
pdftk sample.pdf fill_form data.fdf output output.pdf

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

我希望它能帮到你。

票数 0
EN

Stack Overflow用户

发布于 2018-06-26 16:01:18

PDF中有两种表单技术。

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

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

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

为什么pdfTk不能正确地做到这一点呢?

pdfTk是iText的翻版,它使用编译成可用GCJ执行的不应该再使用的iText版本。您可能会在一些pdfTk错误消息中注意到我的姓氏,因为我是iText的原始开发人员。pdfTk使用的pdfTk版本早于iText中的XFA支持,因此pdfTk无法正确填写表单是正常的。

如何解决这个问题?

  • 解决方法之一是在填写表单之前移除XFA部件。请参阅PDFTK和删除XFA格式
  • 另一个解决办法是切换到Java或C#,使用iText的最新版本,而不是编译成可执行文件的旧版本。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51034436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档