PDF形式人口与FPDM

时间:2014-08-31 08:41:57

标签: php pdf fpdf pdf-form

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

enter image description here

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

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

我可以通过FPDM的指示做两种方式:

第一种方法是发送数组field_name =>值和PDF一起我想改变它的意思。因此,当我使用上述PDF时,我会收到错误:

' FPDF-Merge错误:字段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。该解决方案创建了&#39; new_file.pdf&#39;就像我想要但空着:)

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文件,我会收到一条消息

&#39;您尝试打开的文件包含应放在test.pdf上的注释或表单数据。找不到此文档。它可能已被移动或删除。您是否要浏览以尝试找到此文档?&#39;

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

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

提前感谢你,Vukasin

编辑: 有关PDF文件的更多信息 enter image description here

5 个答案:

答案 0 :(得分:5)

我花了一整天时间处理FPDM问题,并且很难找到有类似问题的人。

  

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

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

现在我收到错误,PDF-Merge错误:字段&#39; fieldname&#39;未找到。当我通过pdftk运行希望解决此问题时,我收到错误:FPDF-Merge错误:对象数(35)与外部参照数量(36)不同,某些情况下,pdf外部参照表已损坏:(

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

sudo apt-get install pdftk

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

pdftk broken.pdf output fixed.pdf

当我打开fixed.pdf时,它没有任何问题并正确填充字段。哈利路亚这是世界上最烦人的问题。总而言之,我不得不接受pdf并通过以下步骤:

  • 将PDF编辑为首选项
  • 另存为&gt; .pdf优化&gt;设置&gt; Acrobat 5&gt;取消选中正在清理的快速网站
  • 以pdftk打开文件并重新保存
  • 通过ubuntu安装命令行pdftk
  • 运行命令:pdftk broken.pdf output fixed.pdf

进行。

答案 1 :(得分:3)

在揭示创作者/制作者信息之后,问题很明显。

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

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

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

答案 2 :(得分:2)

感谢Kyle的回答,我解决了类似的问题。

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

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

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

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

'不支持'快速Web查看模式'。我通过设置修正了    Adobe Acrobat Pro中“另存为”的首选项(另存为 - &gt; pdf    优化 - &gt;设置 - &gt;清理 - &gt;取消选中Fast Web View)。

'不支持对象流' - 再次修复'另存为'    首选项(清理 - &gt;对象压缩选项 - &gt;删除    压缩)。

'不支持增量更新' - 再次使用'保存修复    如'在Acrobat中。

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

一步解决方案

使用原始文件pdf - 使用增量更新,对象压缩和快速Web查看 - 并在Windows上通过pdftk传递,就像Kyle描述的那样。

> pdftk broken.pdf output fixed.pdf

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

宏伟的工作!

一站式解决方案:

完全按照Kyle的描述,将原始文件pdf-具有增量更新,对象压缩和快速的Web视图-并通过Windows上的pdftk传递。

  

pdftk损坏.pdf输出已修复.pdf   现在,FPDM可以从fdf文件正确填充字段。

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