Заполнение формы PDF с помощью FPDM

я пытаюсь заполнить форму PDF с помощью PHP.
Я перепробовал множество способов и обнаружил, что FPDM (FPDF) работает хорошо, когда я создаю новую форму или использую форму из предоставленного исходного файла.
Моя проблема заключается в том, что когда я использую уже созданную форму PDF, форма имеет ограничения, такие как пароль владельца, документ подписан и сертифицирован. Я использовал приложение, чтобы снять эти ограничения, некоторые из них остались. На картинке ниже вы можете увидеть, как выглядит мой текущий PDF.

введите здесь описание изображения

Этот PDF-файл также был сжат, и поскольку FPDM выдавал ошибку, что «Object Stream» не поддерживается, я распаковал его с помощью PDFTK, поэтому размер файла увеличился с 1,48 МБ до 6,78 МБ.

Чтобы получить все имена полей формы, я также использовал PDFTK, поэтому они у меня есть в текстовом файле.

По инструкции FPDM я могу сделать это двумя способами:

Первый способ - отправить массив field_name => value вместе с 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');
?>

Другой способ заключается в том, что я создаю файл FDF с помощью функции createXFDF, а затем использую 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');

Еще одна вещь, если я пытаюсь открыть файл FDF в Acrobat, я получаю сообщение

'Файл, который вы пытаетесь открыть, содержит комментарии или данные формы, которые должны быть помещены в файл test.pdf. Этот документ не может быть найден. Возможно, он был перемещен или удален. Вы хотите просмотреть, чтобы попытаться найти этот документ?»

но файл есть, не перемещен и не удален. Когда я нахожу его вручную, форма заполняется.

Если у кого-то есть опыт в этом, любая помощь или совет очень помогут.

Заранее спасибо, Вукасин

РЕДАКТИРОВАТЬ: больше информации о файле PDF введите описание изображения здесь


person Wolf87    schedule 31.08.2014    source источник
comment
Этот существующий PDF, каковы записи для PDF Producer и программного обеспечения для создания документов? (можно найти на вкладке «Описание» в свойствах документа).   -  person Max Wyss    schedule 31.08.2014
comment
Что происходит, когда вы вводите абсолютный путь к целевому PDF-файлу в XFDF? Что произойдет, если вы последуете совету Acrobat и найдете целевой PDF-файл при открытии XFDF? Что происходит, когда вы активно импортируете XFDF в уже открытый целевой PDF?   -  person Max Wyss    schedule 31.08.2014
comment
Макс Висс спасибо за ответ. Взгляните на мое редактирование вопроса. Спасибо   -  person Wolf87    schedule 02.09.2014
comment
@MaxWyss Я указал абсолютный путь к целевому PDF-файлу, файл «new_pdf.pdf» создан, но пуст. Однако, если я попытаюсь открыть файл FDF, я попаду в браузер по умолчанию, где этот файл открыт и присутствуют данные. Знаете ли вы какой-либо другой способ объединить FDF в PDF? Еще раз спасибо   -  person Wolf87    schedule 02.09.2014


Ответы (5)


После раскрытия информации о создателе / ​​продюсере проблема ясна.

У вас нет настоящей формы PDF, но есть форма XFA (созданная LiveCycle Designer), завернутая в оболочку PDF, чтобы Adobe Reader мог ее отобразить.

Формы XFA не поддерживают (X)FDF. Вы должны импортировать данные, используя XML. Вы можете попробовать экспортировать данные из заполненной версии, а затем использовать ее в качестве образца для создания XML-кода импорта.

Обратите внимание, что формат экспорта/импорта XML, используемый формами XFA, отличается от XFDF (который является просто XML-представлением FDF, собственного формата данных форм PDF).

person Max Wyss    schedule 02.09.2014
comment
Спасибо за ответ, я отмечу это как принятое, потому что как-то ответил на мой вопрос. Я попытался удалить xfa в PDFTK после этого учебник, но все же я не могу заставить его работать, создатель все тот же, и у меня те же проблемы, что и выше. Вы знаете, как я могу объединить XML в XFA? Спасибо еще раз - person Wolf87; 06.09.2014

Я потратил больше дня на решение проблем с FPDM, и мне было трудно найти кого-то, у кого были бы похожие проблемы.

У меня работал следующий формат: PDF 1.4 (Acrobat 5). На самом деле мне пришлось перейти в «Сохранить как» -> выбрать «Adobe PDF Optimized», затем нажать кнопку «Настройки». Оттуда мне пришлось выбрать версию из раскрывающегося/выпадающего меню.

Я получил сообщение об ошибке: «несовместимо с быстрым веб-просмотром» или подобное. Если в параметре «Оптимизированные настройки PDF» вы нажмете «Очистить» с левой стороны, вы можете отключить быстрый веб-просмотр.

Теперь я получаю сообщение об ошибке PDF-Merge Error: поле «имя поля» не найдено. Когда я запускаю его через pdftk в надежде решить эту проблему, я получаю сообщение об ошибке: FPDF-Merge Error: количество объектов (35) отличается от количества внешних ссылок (36), что-то, таблица pdf xref повреждена :(

Чтобы решить эту проблему, мне пришлось скачать и установить серверную утилиту pdftk на Ubuntu.

sudo apt-get install pdftk

После установки я выполнил эту команду, чтобы восстановить поврежденную таблицу XREF PDF и длину потока, если это возможно:

pdftk broken.pdf output fixed.pdf

Когда я открываю fixed.pdf, он не имеет никаких проблем и правильно заполняет поля. Аллилуйя, это была самая раздражающая проблема в мире. Подводя итог, мне пришлось взять pdf и выполнить следующие шаги:

  • Отредактируйте PDF по своему усмотрению
  • Сохранить как > оптимизированный .pdf > Настройки > Acrobat 5 > снимите флажок с быстрого Интернета при очистке
  • Открой файл в pdftk и пересохрани
  • Установить командную строку pdftk через ubuntu
  • команда запуска: pdftk сломанный.pdf вывод исправлен.pdf

Готово.

person Kyle Burkett    schedule 22.12.2016
comment
Это единственное рабочее решение для моего 5-часового поиска и попытки переписать библиотеку с нуля. Вы спасатель - person Kref; 17.09.2018
comment
Я использую это решение 06/2020. Для тех, кто использует Win, загрузите сервер PDFtk pdflabs.com/tools/pdftk-server Кроме того, этот проект сейчас обновляется здесь github.com/codeshell/fpdm Спасибо, Кайл! - person cesAR; 25.06.2020

Благодаря ответу Кайла я решил аналогичную проблему.

У меня есть PDF-файл, созданный в Adobe Acrobat Pro DC, и мне нужно заполнить поля формы из веб-ввода.

На моей машине для разработки я создал файл fdf из данных моей веб-формы и объединил его в pdf с помощью pdftk (вызывается из php с помощью exec() ).

Но я не мог разместить это на облачном веб-сервере Linux, на котором размещен мой сайт, потому что для этого требуются устаревшие библиотеки.

Поэтому я переключился на FPDM и получил следующие ошибки:

«Режим быстрого веб-просмотра не поддерживается». Я исправил это, установив настройки в «сохранить как» в Adobe Acrobat Pro (сохранить как -> оптимизированный pdf -> настройки -> очистить -> снять флажок «Быстрый веб-просмотр»).

«Потоки объектов не поддерживаются» — опять же, исправлено в настройках «сохранить как» (очистить -> параметры сжатия объектов -> удалить сжатие).

«Добавочные обновления не поддерживаются» — опять же, исправлено с помощью «сохранить как» в Acrobat.

Затем запустился FPDM, но не смог прочитать имена полей.

Решение за один шаг:

Возьмите исходный файл pdf — с добавочными обновлениями, сжатием объектов и быстрым веб-просмотром — и передайте его через pdftk в Windows, точно так, как описывает Кайл.

> pdftk broken.pdf output fixed.pdf

Теперь FPDM правильно заполняет поля из файла fdf.

person HalfInHalf    schedule 16.01.2018
comment
рад, что смог помочь, поздравляю с первым вкладом, добро пожаловать в stackoverflow! - person Kyle Burkett; 19.01.2018
comment
было медленно? Я запускаю его и ничего не происходит. Никаких ошибок вывода или чего-то еще. Просто пустой, но он не возвращается к курсору. Добавление verbose в конец для меня ничего не меняет - person Francisc0; 10.09.2018
comment
неважно. это проблема Mac Sierra: stackoverflow.com/questions/39750883 / - person Francisc0; 10.09.2018

Я нашел инструмент под названием Scribus после изучения шаблона, используемого в пример fpdf. Вы можете использовать его для создания шаблонов PDF, а созданный формат хорошо работает с fpdm. Это не сложная программа, которая позволяет вам создавать поля формы с разрешениями/параметрами вокруг них (например, сделать поле формы доступным только для чтения после того, как вы заполните его данными из онлайн-формы). Для моего приложения мне нужно было, чтобы некоторые поля были предварительно заполнены значениями в базе данных, которые были нередактируемыми, другие поля были предварительно заполнены, но все же доступны для редактирования, а некоторые поля были пустыми и требовали заполнения (требуется принудительное выполнение). Все это было возможно с использованием шаблона, созданного Scribus.

person T Beatty    schedule 10.01.2019

ВЕЛИКОЛЕПНАЯ работа!

Одношаговое решение:

Возьмите исходный файл pdf — с добавочными обновлениями, сжатием объектов и быстрым веб-просмотром — и передайте его через pdftk в Windows, точно так, как описывает Кайл.

pdftk break.pdf output fixed.pdf Теперь FPDM корректно заполняет поля из файла fdf.

Я создал PDF-файл с помощью Acrobat, затем «исправил» его с помощью pdftk, и класс FPDM идеально объединил данные...

person John Horst    schedule 16.11.2019