使用FPDF填写PDF表单,然后用PDFTK压平,显示未填充的PDF

15

我正在使用fpdf.org上的“表单填充”脚本来填写我创建的PDF表单上的一些字段。这似乎可以正常工作。

我希望生成的PDF表单被压平,以便用户无法编辑表单字段。为此,我正在使用PDFTK。然而,当我尝试将PDF压平时,我得到一个表单字段为空的PDF。

如果有关如何使用PHP将PDF压平的任何建议,将不胜感激。谢谢!

这是我的代码:

<?php
require('fpdm.php');
$fields = array("Name" => "John Doe", 
                "Address" => "123 White Lane", 
                "Age" => "30", 
                "Phone" => "123-1234");
$pdf = new FPDM("templates/Test.pdf");
$pdf->Load($fields, true);
$pdf->Merge();
$pdf->Output("cache/Filled1.pdf","F");

exec("pdftk cache/Filled1.pdf output cache/Filled1Flat.pdf flatten");
?>

下载原始 Test.pdf 文件:Test.pdf

下载填写后的 Filled1.pdf 文件(显示包含数据的 PDF 表单):Filled1.pdf

下载已展平的 Filled1Flat.pdf 文件(显示不含表单数据的展平 PDF 表单):Filled1Flat.pdf


请同时提供中间文件Filled1.pdf。Test.pdf包含表单字段的空白正常外观流。如果fpdf只设置字段的值但不更新它们的外观,并且pdftk假设现有的外观是正确的,那么可以解释观察到的行为。在这种情况下,您必须更改表单填充以更新外观或者将其压平以创建外观。虽然我不熟悉PHP,但无法确定哪种方法更容易实现以及如何实现。 - mkl
mkl,感谢您的回复。我添加了下载中间PDF(Filled1.pdf)和最终PDF(Filled1Flat.pdf)的链接。值得注意的是,如果我从PDFTK命令中删除“flatten”选项,则PDF文件会正确显示表单数据:exec("pdftk cache/Filled1.pdf output cache/FilledProcessed.pdf"); 在此处下载:FilledProcessed.pdf - user1855093
很不幸,我一直没有时间检查你提供的附加文件,现在它们似乎已经从你提供的链接中消失了。如果你重新激活这些链接,我会查看那些文件,并尝试告诉你哪个命令是罪魁祸首。 - mkl
3个回答

13

明目张胆的自我推销:尝试使用我的php-pdftk包。如果你已经安装了pdftk,使用起来非常容易。

composer require mikehaertl/php-pdftk

<?php
use mikehaertl/pdftk/Pdf;

$pdf = new Pdf('form.pdf');
// Fill in UTF-8 compliant form data!
$pdf->fillForm(array('name' => 'Any char: ÄÖÜ'))
    ->saveAs('filled.pdf');

// Alternatively: Send to browser for download...
$pdf->send('filled.pdf');

// ... or inline display
$pdf->send();

你好,那么关于西里尔字母符号呢? - devzorg
@devzorg 请查看文档。它们部分受支持。但是pdftk存在一些问题。 - Michael Härtl
@MichaelHärtl - 很棒的包,使用起来非常容易!强烈推荐。 - But those new buttons though..
@MichaelHärtl 你好!很喜欢这个资源,不知道你能否帮我诊断一下我遇到的问题:https://dev59.com/yZrga4cB1Zd3GeqPsdHw - LatentDenis
1
@JayDadhania 您可以像填写其他表单字段一样填写复选框。您需要传递字段名称和复选框的选项值(在PDF中预定义)作为值。尝试使用 pdftk file.pdf dump_data_fields 命令,并查找相应字段上的 FieldStateOption,以查找可用值。 - Michael Härtl
显示剩余4条评论

11

我找到了另一个方法来填写PDF表单并将其压平。但我仍然不知道为什么使用fpdf.org上的“Form Filling”脚本无法正常工作。

我按照这里描述的步骤进行操作:点击此处

1)获取字段名称(如果尚未知道)。

exec("pdftk templates/Test.pdf dump_data_fields >cache/testfields.txt");

2) 创建一个包含字段名称和字段值的FDF文件,并将其保存为Test.fdf

%FDF-1.2
1 0 obj<</FDF<< /Fields[
<</T(Name)/V(John Doe)>>
<</T(Address)/V(123 White Lane)>>
<</T(Age)/V(30)>>
<</T(Phone)/V(123-1234)>>
] >> >>
endobj
trailer
<</Root 1 0 R>>
%%EOF

3) 然后填写表格并将其压平

exec("pdftk templates/Test.pdf fill_form templates/Test.fdf output cache/FilledFDF.pdf flatten");

下载已填写并压平的PDF文件:FilledPDF.pdf


这似乎表明pdftk知道如何生成外观; 因此,我推测fpdf既不创建新的外观,也不将PDF标记为需要表单字段的新外观。然而,由于中间文件在提供的链接中不可用,因此我无法验证这个推测。 - mkl
我和这个问题的提问者有完全相同的担忧,但是考虑到我使用了utf-8字符集,所以这个解决方案对我不起作用,这也是我首先去fpdf.org脚本的原因。 - David Folkner
在FDF格式中,“打勾”一个复选框使用 /V /Yes,但是当我使用这种方法时,任何未打勾的复选框(即复选框本身)都被完全删除了。 - Jay Dadhania
可惜大多数网络服务器没有PDFTK,虽然它能够正常工作。PHP基础需要添加完整的PDF支持...现在是2021年了。 - pablorenato

0
使用Dhek PDF模板编辑器,可以使用FPDF/FPDI中的PHP片段根据JSON映射(以了解文本/复选框放置位置)填充数据到现有PDF中。 https://github.com/applicius/dhek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接