【问题标题】:PDF form population with FPDM使用 FPDM 填充 PDF 表单
【发布时间】:2014-10-24 18:24:15
【问题描述】:

我想要完成的是使用 PHP 填充 PDF 表单。
我尝试了很多方法,我发现当我创建新表单或使用他们提供的源文件中的表单时,FPDM (FPDF) 运行良好。
我的问题是当我使用已经创建的 PDF 表单时,该表单具有所有者密码、文档已签名和认证等限制。我使用该应用程序删除了这些限制,其中一些被留下了。在下图中,您可以看到我当前的 PDF 的样子。

该 PDF 也被压缩,因为 FPDM 抛出不支持“对象流”的错误,我通过 PDFTK 对其进行解压缩,因此文件从 1.48 Mb 变为 6.78 Mb。

为了获取我还使用 PDFTK 的所有表单字段名称,所以我将它们保存在 txt 文件中。

按照 FPDM 的指示,我有两种方法:

第一种方法是只发送一个数组 field_name => 值以及我想要更改的 PDF,仅此而已。因此,当我使用上述 PDF 时,会出现错误:

'FPDF-Merge Error: field form1[0].#subform[0].Line1_GivenName[0] not found'

只是提醒我,我有所有的名字,而且这个名字存在。

<?php
require('fpdm.php');

$fields = array(
        'form1[0].#subform[0].Line1_GivenName[0]' => 'my name'
    );
$pdf = new FPDM('test.pdf');
$pdf->Load($fields, false); // second parameter: false if field values are in ISO-8859-     1, true if UTF-8
$pdf->Merge();
$pdf->Output('new_pdf.pdf', 'F');
?>

另一种方法是我使用 createXFDF 函数创建 FDF 文件,然后使用 FPDM 将 FDF 合并为 PDF。这个解决方案像我想要的那样创建“new_file.pdf”但为空:)

function createXFDF($file, $info, $enc = 'UTF-8') {
$data = '<?xml version="1.0" encoding="'.$enc.'"?>' . "\n" .
    '<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">' . "\n" .
    '<fields>' . "\n";
foreach($info as $field => $val) {
    $data .= '<field name="' . $field . '">' . "\n";
    if(is_array($val)) {
        foreach( $val as $opt )
            $data .= '<value>' .
                htmlentities( $opt, ENT_COMPAT, $enc ) .
                '</value>' . "\n";
    } else {
        $data .= '<value>' .
            htmlentities( $val, ENT_COMPAT, $enc ) .
            '</value>' . "\n";
    }
    $data .= '</field>' . "\n";
}
$data .= '</fields>' . "\n" .
    '<ids original="' . md5( $file ) . '" modified="' .
        time() . '" />' . "\n" .
    '<f href="' . $file . '" />' . "\n" .
    '</xfdf>' . "\n";

return $data;
}


require('fpdm.php');

$pdf = new FPDM('test.pdf', 'posted-0.fdf');
$pdf->Merge();
$pdf->Output('new_file.pdf', 'F');

还有一件事,如果我尝试在 Acrobat 中打开 FDF 文件,我会收到一条消息

'您尝试打开的文件包含应该放在 test.pdf 上的 cmets 或表单数据。找不到此文档。它可能已被移动或删除。您要浏览以尝试找到此文档吗?'

但文件在那里,没有移动或删除。当我手动找到它时,表单会填充。

如果有人有这方面的经验,任何帮助或建议都会有很大帮助。

提前谢谢你,Vukasin

编辑: 有关 PDF 文件的更多信息

【问题讨论】:

  • 现有的PDF,PDF Producer和文档创建软件的条目是什么? (可在文档属性的描述选项卡中找到)。
  • 在 XFDF 中输入目标 PDF 的绝对路径会发生什么?当您按照 Acrobat 的建议并在打开 XFDF 时找到目标 PDF 时会发生什么?当您主动将 XFDF 导入已打开的目标 PDF 时会发生什么?
  • Max Wyss 感谢您的回答。看看我对问题的编辑。谢谢
  • @MaxWyss 我已经放置了目标 PDF 的绝对路径,“new_pdf.pdf”文件已创建但为空。但是,如果我尝试打开 FDF 文件,我会被带到默认浏览器,在该浏览器中打开了该文件并且存在数据。您知道将 FDF 合并为 PDF 的其他方法吗?再次感谢

标签: php pdf fpdf pdf-form


【解决方案1】:

我花了一整天的时间来解决 FPDM 的问题,但很难找到遇到类似问题的人。

以下格式适用于我:PDF 1.4 (Acrobat 5)。我不得不 实际上去另存为->选择Adobe PDF Optimized,然后单击 设置按钮。从那里我不得不从 下拉/飞出菜单。

我收到错误消息:“与快速网络视图不兼容”或类似错误。如果在 PDF 优化设置选项中单击左侧的“清理”,则可以取消快速 Web 视图。

现在我收到错误,PDF-Merge Error: field 'fieldname' not found。当我通过 pdftk 运行它希望解决这个问题时,我收到错误:FPDF-Merge Error: Number of objects (35) different with number of xrefs (36), something , pdf xref table is corrupted :(

要解决这个问题,我必须在 ubuntu 上下载并安装 pdftk 服务器实用程序

sudo apt-get install pdftk

安装后,如果可能,我运行此命令来修复 PDF 损坏的 XREF 表和流长度:

pdftk broken.pdf output fixed.pdf

当我打开 fixed.pdf 时,它没有任何问题,并且可以正确填充字段。哈利路亚,这是世界上最烦人的问题。总而言之,我必须将 pdf 文件通过以下步骤进行处理:

  • 根据偏好编辑 PDF
  • 另存为 > .pdf 优化 > 设置 > Acrobat 5 > 在清理下取消选中快速网络
  • 在 pdftk 中打开文件并重新保存
  • 通过ubuntu安装命令行pdftk
  • 运行命令:pdftk broken.pdf 输出fixed.pdf

完成。

【讨论】:

  • 这只是我的 5 小时搜索和尝试从头开始重写库的有效解决方案。你是救命稻草
  • 我在 06/2020 使用这个解决方案。对于那些在 Win 上的人,请下载 PDFtk Server pdflabs.com/tools/pdftk-server 另外,这个项目现在正在这里更新 github.com/codeshell/fpdm 谢谢,Kyle!
【解决方案2】:

在透露创作者/制作者信息后,问题就很清楚了。

您没有真正的 PDF 表单,但您有一个 XFA 表单(由 LiveCycle Designer 创建),包装在 PDF 包装器中,以便 Adob​​e Reader 可以显示它。

XFA 表单不支持 (X)FDF。您必须使用 XML 导入数据。您可以尝试从填充版本中导出数据,然后将其用作创建导入 XML 的示例。

请注意,XFA 表单使用的 XML 导出/导入格式与 XFDF(它只是 FDF 的 XML 表示,PDF 原生表单数据格式)不同。

【讨论】:

  • 感谢您的回答,我会将其标记为已接受,因为在某种程度上回答了我的问题。我尝试在此tutorial 之后删除 PDFTK 中的 xfa 但我仍然无法使其工作,创建者仍然相同,并且我遇到了与上面相同的问题。您知道如何将 XML 合并到 XFA 中吗?再次感谢
【解决方案3】:

感谢凯尔的回答,我解决了一个类似的问题。

我在 Adob​​e Acrobat Pro DC 中创建了一个 pdf,需要从 Web 输入填充其表单字段。

在我的开发机器上,我从我的 Web 表单数据创建了一个 fdf 文件,并使用 pdftk(使用 exec() 从 php 调用)将其合并到 pdf 中。

但我无法将它放在托管我的网站的云 linux 网络服务器上,因为它需要已弃用的库。

所以我切换到 FPDM 并出现以下错误:

'不支持快速 Web 查看模式'。我通过设置解决了这个问题 Adobe Acrobat Pro 中“另存为”的首选项(另存为 -> pdf 优化 -> 设置 -> 清理 -> 取消选中 Fast Web View)。

'不支持对象流' - 再次,固定在'另存为' 首选项(清理 -> 对象压缩选项 -> 删除 压缩)。

'不支持增量更新' - 再次使用'save 修复 就像在 Acrobat 中一样。

然后 FPDM 运行,但无法读取任何字段名称。

一站式解决方案

获取原始文件 pdf - 具有增量更新、对象压缩和快速 Web 视图 - 并通过 Windows 上的 pdftk 传递,正如 Kyle 所描述的那样。

> pdftk broken.pdf output fixed.pdf

现在 FPDM 从 fdf 文件中正确填充字段。

【讨论】:

  • 很高兴能帮上忙,恭喜您的第一次贡献,欢迎来到 stackoverflow!
  • 速度慢吗?我正在运行它,但似乎什么也没发生。没有输出错误或任何东西。只是空白,但它不会回到光标。在末尾添加详细信息对我来说没有任何改变
  • 没关系。这是 Mac Sierra 问题:stackoverflow.com/questions/39750883/…
【解决方案4】:

在检查了fpdf example 中使用的模板后,我发现了一个名为Scribus 的工具。您可以使用它来创建 pdf 模板,并且创建的格式与 fpdm 配合得很好。它不是一个复杂的程序,它允许您创建带有权限/参数的表单字段(例如在您从在线表单中填充数据后将表单字段设置为只读)。对于我的应用程序,我需要从数据库中不可编辑的值中预填充一些字段,预填充其他字段但仍可编辑,以及一些为空且需要完成(需要强制)的字段。使用 Scribus 生成的模板,一切皆有可能。

【讨论】:

    【解决方案5】:

    伟大的工作!

    一站式解决方案:

    获取原始文件 pdf - 具有增量更新、对象压缩和快速 Web 视图 - 并通过 Windows 上的 pdftk 传递,正如 Kyle 所描述的那样。

    pdftk broken.pdf 输出 fixed.pdf 现在 FPDM 从 fdf 文件中正确填充字段。

    我用 Acrobat 创建了一个 PDF,然后用 pdftk “修复”了它,然后 FPDM 类完美地合并了数据……

    【讨论】:

      猜你喜欢
      • 2021-01-01
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 2014-08-21
      相关资源
      最近更新 更多