【问题标题】:PDF fields don't show in Reader but show in pdftk dump_data_fields after populating with PHPPDF 字段不在 Reader 中显示,但在使用 PHP 填充后显示在 pdftk dump_data_fields 中
【发布时间】:2014-09-02 13:20:18
【问题描述】:

http://www.russellyazbeck.com/aanasea

填写表格并下载 PDF 后,它会在浏览器窗口中打开,并且所有字段都已正确填充。然后我右键单击并另存为,然后在 Adob​​e Reader 中打开 PDF。所有库存字段都消失了。即使我转到工具 > 字段 > 编辑字段,库存字段也不存在。

但是,如果我在同一个 PDF 上运行“pdftk doc.pdf dump_data_fields”,我可以看到库存字段确实存在相应的值。

为什么独立阅读器看不到这些字段?

我在 Adob​​e Acrobat 中创建了这个 PDF,导出了 field.fdf 文件,使用 pdftk 将它们合并,然后使用 pdftk 输出了 template.pdf。

http://www.russellyazbeck.com/aanasea/template.pdf

这里是 PHP

<?php

    require('fpdm.php');
    $today = date("F j, Y"); 

    $fields = array(
        'todaysDate'     => $today,
        'invoiceNumber' => $_POST["invoice_number"],
        'customerName'  => $_POST["customer_name"],
        'customerName2'  => $_POST["customer_name"],
        'address'        => $_POST["address"],
        'cityStateZip' => $_POST["city"] . ', ' . $_POST["state"] . ' ' . $_POST["zip"],
        'phoneNumber'   => $_POST["phone_number"],
        'email'          => $_POST["email"], 
        'rentalDates'   => $_POST["date_from"] . " - " . $_POST["date_to"],
    );

    $inventory = array (
        $_POST["inventory0"],
        $_POST["inventory1"],
        $_POST["inventory2"],
        $_POST["inventory3"],
        $_POST["inventory4"],
        $_POST["inventory5"],
        $_POST["inventory6"],
        $_POST["inventory7"],
        $_POST["inventory8"],
        $_POST["inventory9"],
        $_POST["inventory10"],
        $_POST["inventory11"],
        $_POST["inventory12"],
        $_POST["inventory13"],
        $_POST["inventory14"],
        $_POST["inventory15"],
        $_POST["inventory16"],
        $_POST["inventory17"],
        $_POST["inventory18"],
    );

    $unit = array (
        $_POST["unit0"],
        $_POST["unit1"],
        $_POST["unit2"],
        $_POST["unit3"],
        $_POST["unit4"],
        $_POST["unit5"],
        $_POST["unit6"],
        $_POST["unit7"],
        $_POST["unit8"],
        $_POST["unit9"],
        $_POST["unit10"],
        $_POST["unit11"],
        $_POST["unit12"],
        $_POST["unit13"],
        $_POST["unit14"],
        $_POST["unit15"],
        $_POST["unit16"],
        $_POST["unit17"],
        $_POST["unit18"],
    );

    $price = array (
        $_POST["price0"],
        $_POST["price1"],
        $_POST["price2"],
        $_POST["price3"],
        $_POST["price4"],
        $_POST["price5"],
        $_POST["price6"],
        $_POST["price7"],
        $_POST["price8"],
        $_POST["price9"],
        $_POST["price10"],
        $_POST["price11"],
        $_POST["price12"],
        $_POST["price13"],
        $_POST["price14"],
        $_POST["price15"],
        $_POST["price16"],
        $_POST["price17"],
        $_POST["price18"],
    );

    $subtotal = 0;

    for ($i=0, $z=count($inventory); $i<=$z; $i++) {
        $subtotal = $subtotal + ($unit[$i] * $price[$i]);
    }

    $subtotal = $subtotal;
    $deposit = $subtotal * ($_POST["deposit"] / 100);
    $tax = $subtotal * ($_POST["tax"] / 100);
    $deductions = $_POST["deductions"]; 
    $balanceDue = $subtotal + $tax - $deductions;
    $allTotal = $subtotal + $tax;
    $c = 0;

    for ($i=0, $z=count($inventory); $i<=$z; $i++) {
        if ($inventory[$i] !== NULL) {
            $fields[inventory . $c] = $inventory[$i];
            $fields[unit . $c] = $unit[$i];
            $fields[price . $c] = "$" . money_format('%i', $price[$i]);
            $fields[total . $c] = "$" . money_format('%i', ($unit[$i] * $price[$i]));
            $c++;
        }
    };
    $fields[subtotal] = "$" . money_format('%i', $subtotal);            
    $fields[deposit] = "$" . money_format('%i', $deposit);
    $fields[tax] = "$" . money_format('%i', $tax);
    $fields[deductions] = "$" . money_format('%i', $deductions);
    $fields[balanceDue] = "$" . money_format('%i', $balanceDue);
    $fields[allTotal] = "$" . money_format('%i', $allTotal);

    $pdf = new FPDM('template.pdf');
    $pdf->Load($fields, true); // second parameter: false if field values are in ISO-8859-1, true if UTF-8
    $pdf->Merge();
    $pdf->Output();

?>

【问题讨论】:

  • 不幸的是,您的 pdf 链接返回 404 错误。不过,我会假设它的表单是 xfa 和 AcroForm 表单的混合体。您的代码、浏览器和 pdftk 只能查看/操作 AcroForm 部分,但 Adob​​e Reader 会显示 xfa 信息。
  • 修复了 pdf 链接。我会检查你提到的那些事情。谢谢。
  • 我看了pdf。它不包含我假设的混合形式限制。因此,您能否提供一份已归档的 pdf。
  • 您可以在我提供的第一个链接下载填写好的pdf。

标签: php pdf populate pdftk


【解决方案1】:

原始 PDF 中存在一个问题,在某些情况下,Acrobat Reader 会忽略字段 inventory0 .. inventory9。

inventory0 ..inventory9 字段是用对象 146 0Parent 条目定义的,该条目又被定义为

146 0 obj 
<<
/Kids [81 0 R 117 0 R]
>> 

一个明显的错误是,并非所有提及该字段为 Parent 的字段都在此处列举为 Kids

如果在这种情况下 NeedAppearancesfalse,Acrobat Reader 仍然很高兴,但如果是 true,Acrobat Reader 拒绝显示这些字段。不幸的是,在填写字段时,FPDM 将该标志设置为true

通过使用空格字符覆盖字段inventory0 ..inventory9 的 条目来修补结果PDF 会生成一个PDF,Acrobat Reader 再次很乐意显示这些字段。

因此,我建议删除那个虚假的Parent

【讨论】:

  • 嗯,一种方法是在十六进制编辑器中编辑您的原始 PDF,用空格覆盖 inventory0..inventory9 表单字段字典中的 /Parent 146 0 R 条目。但是,您必须仔细工作,这些条目需要被覆盖,而不是被删除,因为这会改变对象位置,这需要您在 PDF 中重建交叉引用。我不知道是否有任何标准的 PDF 工具允许这种改变。顺便说一句:Adobe Acrobat Preflight 还警告页面内容不是 100% 好的。您可能希望从头开始重新创建 PDF,而不会出现此类问题。
猜你喜欢
  • 2018-01-09
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2021-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
相关资源
最近更新 更多