Заполнение PDF-формы PHP - PDFtk не работает - PullRequest
0 голосов
/ 26 июня 2018

У меня есть форма PDF, созданная в SAP.В этой форме примерно 30 полей.Некоторые уже заполнены.В то время как другие будут заполнены сотрудником.Вот образец этой формы.

enter image description here

Теперь я собираюсь создать приложение php, которое может принимать данные от пользователя и заполнять форму выше исоздать этот файл PDF.Я прочитал учебники по заполнению PDF-формы с помощью PDFtk Server Utility.Поэтому я загружаю и устанавливаю этот инструмент в свои окна 7. Перед созданием приложения PHP я подумал, что мне нужно попытаться заполнить форму вручную на моем ПК.Поэтому сначала я создаю дамп полей данных с помощью следующей команды и пытаюсь заполнить одну переменную.

pdftk sample.pdf dump_data_fields > fields_names.txt

output:

.
.
FieldType: Text
FieldName: data[0].#pageSet[0].TimeSheet[0].CURRENTWEEK[0]
FieldNameAlt: Week
FieldFlags: 0
FieldValueDefault: 26
FieldJustification: Left
FieldMaxLength: 2
---
FieldType: Text
FieldName: data[0].#pageSet[0].TimeSheet[0].CURRENTYEAR[0]
FieldNameAlt: Year
FieldFlags: 0
FieldValueDefault: 2018
FieldJustification: Left
FieldMaxLength: 4
.
.

Затем я создаю файл FDF для заполнения переменной CURRENTWEEK ..

%FDF-1.2
%âãÏÓ
1 0 obj 
<<
/FDF 
<<
/Fields [
<</T(data[0].#pageSet[0].TimeSheet[0].CURRENTWEEK[0])/V(80)>>
]
>>
>>
endobj
trailer
<<
/Root 1 0 R
>>
%%EOF

Я запускаю эту команду для создания заполненной формы

pdftk sample.pdf fill_form data.fdf output output.pdf

Форма PDF не заполнена.По-прежнему отображается оригинальная форма PDF.Опять же, когда я сбрасываю поля вновь созданной формы, она показывает ..

---
FieldType: Text
FieldName: data[0].#pageSet[0].TimeSheet[0].CURRENTWEEK[0]
FieldNameAlt: Week
FieldFlags: 0
FieldValue: 80
FieldValueDefault: 26
FieldJustification: Left
FieldMaxLength: 2
---

FieldValue:80 добавляется, но в форме нет данных.Отображение того же значения 26 в поле.Есть ли ошибка при создании FDF или выполнении команды?

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

В PDF существует два типа технологии форм.

  • Технология AcroForm: форма определяется с использованием синтаксиса PDF;имена полей выглядят так: timeSheet.currentweek.
  • Архитектура форм XML (она же XFA): форма определяется с использованием XML;имена полей выглядят так: data[0].#pageSet[0].TimeSheet[0].CURRENTWEEK[0]

Иногда PDF-файл содержит обе технологии.Это часто называют гибридной формой .

Исходя из информации, которой вы делитесь в своем вопросе, я предполагаю, что ваша форма является гибридной формой. Формаимеет поток XFA внутри, и в то же время поля определяются с использованием синтаксиса PDF.Когда вы заполняете его, вам необходимо убедиться, что вы обновили поля формы AcroForm , а также XML формы XFA.

Почему pdfTk не делает это правильно?

pdfTk - это плагиат iText, который использует версию iText, которая больше не должна использоваться , скомпилированную в исполняемый файл с GCJ.Вы можете заметить мою фамилию в некоторых сообщениях об ошибках pdfTk, так как я являюсь первоначальным разработчиком iText.Версия iText, используемая pdfTk, предшествует поддержке XFA в iText, поэтому нормально, что pdfTk не может правильно заполнить форму.

Как обойти эту проблему?

  • OneОбходной путь должен был бы удалить часть XFA перед заполнением формы.См. PDFTK и удаление формата XFA
  • Другим обходным решением будет переключение на Java или C # и использование последней версии iText вместо старой версии, скомпилированной в исполняемый файл.
0 голосов
/ 28 июня 2018

Сначала установите pdftk на свой сервер, затем выполните следующую команду

pdftk path/to/the/form.pdf dump_data_fields > field_names.txt

, и вы получите txt-файл для вашего pdf-файла, и его вывод будет выглядеть как

FieldType: Text
FieldName: data[0].#pageSet[0].TimeSheet[0].KUNNR[0]
FieldNameAlt: User
FieldFlags: 1
FieldValueDefault: 65604
FieldJustification: Left
FieldMaxLength: 10
FieldJustification: Left
---

, затем выиспользуйте следующий пакет для него

composer require mikehaertl/php-pdftk

, затем обновите композитор

 use mikehaertl\pdftk\Pdf; 
// Fill form with data array
    $pdf = new Pdf('path of your pdf');
    $pdf->fillForm([
        'data[0].#pageSet[0].TimeSheet[0].KUNNR[0]'=>'sanjay',
    ])
        ->needAppearances()
        ->saveAs('filled.pdf');

это работает для меня.

0 голосов
/ 26 июня 2018

Я думаю, что это проблема формата файла fdf, поэтому сначала обновите ваш файл fdf следующим файлом:

%FDF-1.2
1 0 obj<</FDF<< /Fields[

<</T(data[0].#pageSet[0].TimeSheet[0].CURRENTWEEK[0])/V(80)>>

] >> >>
endobj
trailer
<</Root 1 0 R>>
%%EOF

после обновления файла fdf выполните в терминале следующую команду:

pdftk sample.pdf fill_form data.fdf output output.pdf

Примечание : проверьте путь ко всем файлам правильно

Надеюсь, это вам поможет.

...