Заполнение PDF-формы с помощью FPDF, а затем сведение с помощью PDFTK отображает незаполненный PDF-файл

Я использую скрипт «Заполнение формы» с сайта fpdf.org для заполнения некоторых полей в созданной мной форме PDF. Кажется, это работает правильно.

Я хочу, чтобы полученная PDF-форма была сглажена, чтобы пользователи не могли редактировать поля формы. Для этого я использую PDFTK. Однако, когда я пытаюсь сгладить PDF-файл, я получаю PDF-файл с пустыми полями формы.

Будем признательны за любые предложения о том, как сгладить PDF-файл (с помощью PHP). Спасибо!

Вот мой код:

<?php
require('fpdm.php');
$fields = array("Name" => "John Doe", 
                "Address" => "123 White Lane", 
                "Age" => "30", 
                "Phone" => "123-1234");
$pdf = new FPDM("templates/Test.pdf");
$pdf->Load($fields, true);
$pdf->Merge();
$pdf->Output("cache/Filled1.pdf","F");

exec("pdftk cache/Filled1.pdf output cache/Filled1Flat.pdf flatten");
?>

Загрузите исходный файл Test.pdf: Test.pdf

Загрузите файл Filled1.pdf (правильно отображает форму PDF с видимыми данными): Filled1.pdf

Загрузите файл Filled1Flat.pdf (отображает плоскую форму PDF без видимых данных формы): Filled1Flat.pdf


person user1855093    schedule 27.11.2012    source источник
comment
Также предоставьте промежуточный файл Filled1.pdf. Test.pdf содержит пустые потоки нормальных представлений для полей формы. Если fpdf только устанавливает значения полей, но не обновляет их внешний вид, и если pdftk считает существующие представления правильными, наблюдаемое поведение можно объяснить. В этом случае вам нужно изменить заполнение формы для обновления внешнего вида или сглаживание для создания внешнего вида. Однако я не разбираюсь в PHP и поэтому не могу сказать, что проще сделать и как.   -  person mkl    schedule 27.11.2012
comment
mcl, спасибо за ответ. Я добавил ссылки для загрузки промежуточного PDF-файла (Filled1.pdf) и окончательного PDF-файла (Filled1Flat.pdf). Ничего не стоит, если я удалю параметр flatten из команды PDFTK, PDF-файл действительно правильно отобразит данные формы: exec(pdftk cache/Filled1.pdf output cache/FilledProcessed.pdf); скачать здесь : FilledProcessed.pdf   -  person user1855093    schedule 27.11.2012
comment
К сожалению, до сих пор у меня не было времени просмотреть дополнительные файлы, которые вы предоставили, и теперь они, кажется, исчезли из предоставленных вами ссылок. Если вы повторно активируете ссылки, я посмотрю на эти файлы и попытаюсь сказать вам, какая из команд является виновником.   -  person mkl    schedule 29.11.2012


Ответы (3)


Откровенная самореклама: попробуйте мой пакет php-pdftk. Если у вас установлен pdftk, им очень легко пользоваться.

composer require mikehaertl/php-pdftk

<?php
use mikehaertl/pdftk/Pdf;

$pdf = new Pdf('form.pdf');
// Fill in UTF-8 compliant form data!
$pdf->fillForm(array('name' => 'Any char: ÄÖÜ'))
    ->saveAs('filled.pdf');

// Alternatively: Send to browser for download...
$pdf->send('filled.pdf');

// ... or inline display
$pdf->send();
person Michael Härtl    schedule 11.07.2014
comment
Привет А как насчет кириллицы? - person devzorg; 27.03.2016
comment
@devzorg Пожалуйста, проверьте документы. Они частично поддерживаются. Но у pdftk есть некоторые проблемы. - person Michael Härtl; 28.03.2016
comment
@MichaelHärtl - Хороший пакет и очень простой в использовании! Настоятельно рекомендую. - person billynoah; 06.05.2016
comment
@MichaelHärtl Привет! Люблю этот ресурс, в любом случае вы можете помочь мне диагностировать проблему, с которой я столкнулся: stackoverflow.com/questions/39533795/ - person LatentDenis; 16.09.2016
comment
Просто еще одна история успеха здесь. Вам нужно включить функции: exec, proc_open, proc_close, proc_get_status, proc_terminate, escapeshellarg, escapeshellcmd. - person cesAR; 02.07.2020
comment
Работает очень хорошо, однако нет поддержки флажков, такой как FPDM. Я использую FPDM, чтобы сначала заполнить флажки, а затем этот, чтобы сделать его совместимым с плоским. - person Jay Dadhania; 26.01.2021
comment
@JayDadhania Вы можете заполнять флажки так же, как и любое другое поле формы. Вы должны передать имя поля и значение параметра флажка (предопределено в PDF) в качестве значения. Попробуйте pdftk file.pdf dump_data_fields и найдите FieldStateOption в соответствующем поле, чтобы узнать доступные значения. - person Michael Härtl; 27.01.2021
comment
@MichaelHärtl Да, FPDM допускает любое значение, которое оценивается как true для флажков, поэтому я подумал, что здесь будет то же самое, и передача логического значения true в качестве значения не удалась. Я попробовал с фактическим предопределенным значением Yes, и это сработало прекрасно! Большое спасибо за этот замечательный пакет!! - person Jay Dadhania; 27.01.2021
comment
это не работает на серверах Linux, у которых нет PDFTK. Печально, что в 2021 году до сих пор нет решения для выравнивания PDF на общем хостинге Linux без установки зависимостей. Кроме того, PDFTK теперь не работает на Redhat, который используют многие веб-хосты. - person pablorenato; 18.07.2021

Я смог найти другой процесс для заполнения формы PDF, а затем сгладить ее. Я до сих пор не знаю, почему использование скрипта «Заполнение формы» с fpdf.org не сработало.

Я выполнил шаги, описанные здесь:

1) Получите имена полей, если они еще не известны

exec("pdftk templates/Test.pdf dump_data_fields >cache/testfields.txt");

2) Создайте файл FDF с именами полей и значениями полей и сохраните его как Test.fdf.

%FDF-1.2
1 0 obj<</FDF<< /Fields[
<</T(Name)/V(John Doe)>>
<</T(Address)/V(123 White Lane)>>
<</T(Age)/V(30)>>
<</T(Phone)/V(123-1234)>>
] >> >>
endobj
trailer
<</Root 1 0 R>>
%%EOF

3) Затем заполните форму и сгладьте ее.

exec("pdftk templates/Test.pdf fill_form templates/Test.fdf output cache/FilledFDF.pdf flatten");

Загрузите полученный PDF-файл (заполненный и сплющенный): FilledPDF.pdf

person user1855093    schedule 27.11.2012
comment
Кажется, это указывает на то, что pdftk умеет генерировать образы; таким образом, я бы предположил, что fpdf не создает новых представлений и не помечает PDF как требующий новых представлений для полей формы. Однако, поскольку промежуточные файлы недоступны по предоставленным ссылкам, я не могу проверить это предположение. - person mkl; 29.11.2012
comment
У меня точно такая же проблема, как и у этого вопроса, но это решение не работает для меня, учитывая, что у меня есть символы utf-8, поэтому я в первую очередь обратился к сценарию fpdf.org. - person David Folkner; 18.03.2014
comment
Чтобы установить флажок в формате FDF, используйте /V /Yes, однако все неотмеченные флажки (сам флажок) были полностью удалены, когда я использовал этот метод. - person Jay Dadhania; 26.01.2021
comment
Работает, но, к сожалению, на большинстве веб-серверов нет PDFTK. PHP Foundation необходимо добавить полную поддержку PDF... Это 2021 год - person pablorenato; 18.07.2021

В редакторе шаблонов Dhek PDF есть фрагмент PHP для заполнения данными в существующем PDF-файле с использованием FPDF/FPDI в соответствии с сопоставлениями JSON (чтобы знать, куда помещать тексты/флажки). https://github.com/applicius/dhek

person cchantep    schedule 20.10.2013