我想要完成的是使用 PHP 填充 PDF 表单。
我尝试了很多方法,当我创建一个新表单或使用他们提供的源文件中的表单时,我发现 FPDM (FPDF) 运行良好。
我的问题是当我使用已经创建的 PDF 表单时,该表单具有所有者密码、文档已签名和认证等限制。我使用该应用程序删除了这些限制,其中一些被留下了。在下图中,您可以看到我当前的 PDF 的样子。
该 PDF 也被压缩了,并且由于 FPDM 抛出不支持“对象流”的错误,我通过 PDFTK 对其进行了解压缩,因此文件从 1.48 Mb 变为 6.78 Mb。
要获取我还使用 PDFTK 的所有表单字段名称,所以我将它们放在 txt 文件中。
根据 FPDM 的说明,我有两种方法:
第一种方法是只发送一个数组 field_name => 值以及我想要更改的 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');
?>
另一种方法是我使用 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 上的注释或表单数据。找不到此文档。它可能已被移动或删除。您要浏览以尝试找到此文档吗?
但文件在那里,没有移动或删除。当我手动找到它时,表单会填充。
如果有人有这方面的经验,任何帮助或建议都会有很大帮助。
提前谢谢你,Vukasin
编辑:有关 PDF 文件的更多信息