Поля PDF не отображаются в Reader, но отображаются в pdftk dump_data_fields после заполнения PHP

http://www.russellyazbeck.com/aanasea

После заполнения формы и загрузки PDF она открывается в окне браузера и все поля заполняются правильно. Затем щелкните правой кнопкой мыши и сохраните как, а затем откройте PDF-файл в Adobe Reader. Все поля инвентаря исчезли. Даже если я зайду в Инструменты> Поля> Редактировать поля, поля инвентаря не существуют.

Однако, если я запускаю 'pdftk doc.pdf dump_data_fields' в том же самом файле PDF, я вижу, что поля инвентаризации действительно существуют с соответствующими значениями.

Почему автономный читатель не видит эти поля?

Я создал этот PDF-файл в Adobe Acrobat, экспортировал файл field.fdf, объединил их с помощью pdftk, а затем вывел файл template.pdf с помощью pdftk.

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();

?>

1 ответ

В исходном PDF-файле есть проблема, из-за которой Acrobat Reader игнорирует поля инвентаризация0 .. инвентаризация9.

Поля инвентарь0 .. инвентарь9 определяются родительской записью для объекта 146 0, которая, в свою очередь, определяется как

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

Очевидная ошибка заключается в том, что не все поля, в которых упоминается поле " Родитель", перечислены здесь как " Дети".

Если в такой ситуации NeedAppearances есть false, Acrobat Reader по-прежнему счастлив, но если это так true Acrobat Reader не отображает эти поля. К сожалению, при заполнении полей FPDM устанавливает этот флаг на true,

Извлечение PDF-файла результата путем перезаписи родительских записей полей инвентаризация0 .. инвентаризация9 пробелами приводит к получению PDF-файла, в котором Acrobat Reader снова с удовольствием отображает эти поля.

Таким образом, я предлагаю удалить этого поддельного родителя.

Другие вопросы по тегам