【发布时间】: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 的其他方法吗?再次感谢