【问题标题】:PDF Form filling with FPDF and then Flatten with PDFTK displays un-filled PDF使用 FPDF 填充 PDF 表单,然后使用 PDFTK 展平显示未填充的 PDF
【发布时间】:2023-03-20 19:21:01
【问题描述】:

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

我希望将生成的 PDF 表单展平,以便用户无法编辑表单域。我为此使用PDFTK。但是,当我尝试拼合 PDF 时,我得到一个表单字段为空的 PDF。

任何关于如何使 PDF 扁平化(使用 PHP)的建议将不胜感激。谢谢!

这是我的代码:

<?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,感谢您的回复。我添加了下载中间 PDF (Filled1.pdf) 和最终 PDF (Filled1Flat.pdf) 的链接。如果我从 PDFTK 命令中删除“flatten”选项,那么 PDF 文件确实会正确显示表单数据,这毫无价值:exec("pdftk cache/Filled1.pdf output cache/FilledProcessed.pdf"); i> 在这里下载:FilledProcessed.pdf
  • 很遗憾,直到现在我还没有时间检查您提供的其他文件,现在它们似乎从您提供的链接中消失了。如果您重新激活链接,我会查看这些文件并尝试告诉您哪些命令是罪魁祸首。

标签: php pdf fpdf pdftk pdf-form


【解决方案1】:

公然自我推销:试试我的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 请查看文档。它们受到部分支持。但是 pdftk 有一些问题。
  • @MichaelHärtl - 不错的包,非常易于使用!强烈推荐。
  • @MichaelHärtl 嘿!喜欢这个资源,无论如何你可以帮我诊断我遇到的问题:stackoverflow.com/questions/39533795/…
  • @JayDadhania 您可以像填写任何其他表单字段一样填写复选框。您必须将复选框的字段名称和选项值(在 PDF 中预定义)作为值传递。尝试pdftk file.pdf dump_data_fields 并在相应字段中查找FieldStateOption 以找出可用值。
【解决方案2】:

我能够找到另一个流程来填写 PDF 表单,然后将其展平。我仍然不知道为什么使用 fpdf.org 的“表单填写”脚本不起作用。

我按照here 概述的步骤操作:

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 标记为表单字段需要新外观。但是,由于提供的链接中没有中间文件,我无法验证这一推测。
  • 我和这个问题有完全相同的担忧,但考虑到我有 utf-8 字符,这个解决方案对我不起作用,这就是我首先使用 fpdf.org 脚本的原因。
  • 要“勾选”FDF 格式的复选框,请使用/V /Yes,但是当我使用此方法时,所有未勾选的复选框(框本身)都被完全删除。
  • 有效,但遗憾的是大多数网络服务器没有 PDFTK。 PHP 基金会需要添加完整的 PDF 支持......现在是 2021 年
【解决方案3】:

使用 Dhek PDF 模板编辑器,有一个 PHP sn-p 可以根据 JSON 映射使用 FPDF/FPDI 将数据填充到现有 PDF 中(以了解将文本/复选框放在哪里)。 https://github.com/applicius/dhek

【讨论】:

    猜你喜欢
    • 2021-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    相关资源
    最近更新 更多