FPDM的PDF表格填充

Wol*_*f87 3 php pdf fpdf pdf-form

我要完成的工作是使用PHP填充PDF表单。
我尝试了许多方法,发现当我创建新表单或使用它们提供的源文件中的表单时,FPDM(FPDF)可以正常工作。
我的问题是,当我使用已经创建的PDF表单时,该表单具有诸如所有者密码,文档签名和认证之类的限制。我使用该应用程序删除了这些限制,其中一些仍然存在。在下面的图片中,您可以看到我当前的PDF外观。

在此处输入图片说明

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

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

我可以按照FPDM的说明执行两种方法:

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

“ FPDF合并错误:未找到字段form1 [0]。#subform [0] .Line1_GivenName [0]”

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

<?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');
?>
Run Code Online (Sandbox Code Playgroud)

另一种方法是,我使用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');
Run Code Online (Sandbox Code Playgroud)

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

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

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

如果有人对此有经验,那么任何帮助或建议都会有很大帮助。

预先感谢您,沃卡辛

编辑:有关PDF文件的更多信息 在此处输入图片说明

Max*_*yss 6

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

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

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

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


小智 6

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

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

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

但是我不能把它放在我的网站托管的云 linux 网络服务器上,因为它需要弃用的库。

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

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

“不支持对象流” - 再次在“另存为”首选项中修复(清理 -> 对象压缩选项 -> 删除压缩)。

“不支持增量更新” - 再次使用 Acrobat 中的“另存为”进行修复。

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

一步解决方案

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

> pdftk broken.pdf output fixed.pdf
Run Code Online (Sandbox Code Playgroud)

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


Kyl*_*ett 5

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

以下格式对我有用:PDF 1.4(Acrobat 5)。我实际上必须转到“另存为”->选择“ Adob​​e PDF Optimized”,然后单击“设置”按钮。从那里,我必须从下拉/弹出菜单中选择版本。

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

现在,我收到错误,PDF合并错误:找不到字段'fieldname'。当我通过pdftk运行它以解决此问题时,收到以下错误:FPDF合并错误:对象数(35)与外部参照数(36)不同,某些东西pdf外部参照表已损坏:(

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

sudo apt-get install pdftk
Run Code Online (Sandbox Code Playgroud)

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

pdftk broken.pdf output fixed.pdf
Run Code Online (Sandbox Code Playgroud)

当我打开fix.pdf时,它没有任何问题,可以正确填充字段。哈利路亚这是世界上最令人讨厌的问题。总结一下,我必须将pdf文件放入以下步骤:

  • 编辑PDF至首选项
  • 另存为>优化的.pdf>设置> Acrobat 5>在清理下取消选中快速Web
  • 在pdftk中打开文件并重新保存
  • 通过ubuntu安装命令行pdftk
  • 运行命令:pdftk broken.pdf输出固定.pdf

完成。