Почему HummusJS не отображает значения заполнения pdf в Acrobat Reader (а в браузере это делает)?
Использование HummusJS для заполнения правительственных PDF-форм Я не могу понять, почему заполненные значения появляются, когда я открываю заполненные PDF-формы в Chrome/Firefox, но не отображаются, когда я открываю их в Acrobat Reader.
Использование значений формы-заполнения и изменение main.js
код для заполнения полей и пример формы I-130 в формате PDF:
var hummus = require('hummus'),
fillForm = require('./pdf-form-fill').fillForm;
var filename = 'i-130.pdf';
var writer = hummus
.createWriterToModify(__dirname + '/sample-forms/' + filename, {
modifiedFilePath: __dirname + '/output/' + filename + '_out.pdf'
});
var data = {
"form1[0].#subform[0].Pt2Line4a_FamilyName[0]" : "LAST filled",
"form1[0].#subform[0].Pt2Line4b_GivenName[0]" : 'FIRST filled ',
"form1[0].#subform[0].Pt2Line4c_MiddleName[0]" : 'MIDDLE filled',
}
fillForm(writer,data);
writer.end();
Вот как это выглядит в Chrome с правильными заполненными значениями (никаких проблем с выравниванием - я знаю, как это исправить):
А вот как это выглядит в Acrobat Reader - грустные пустые поля:
Если я проанализирую заполненный PDF-файл, используя значения формы синтаксического анализа HummusJS Samples, в этих заполненных полях будут значения. например:
{
"name": "Pt2Line4a_FamilyName[0]",
"fullName": "form1[0].#subform[0].Pt2Line4a_FamilyName[0]",
"alternateName": "Part 2. Information About You (Petitioner). Your Full Name. 4. A. Enter Family Name (Last Name).",
"isNoExport": false,
"isFileSelect": false,
"type": "plaintext",
"value": "LAST filled"
},
{
"name": "Pt2Line4b_GivenName[0]",
"fullName": "form1[0].#subform[0].Pt2Line4b_GivenName[0]",
"alternateName": "Part 2. Information About You (Petitioner). Your Full Name. 4. B. Enter Given Name (First Name).",
"isNoExport": false,
"isFileSelect": false,
"type": "plaintext",
"value": "FIRST filled "
},
{
"name": "Pt2Line4c_MiddleName[0]",
"fullName": "form1[0].#subform[0].Pt2Line4c_MiddleName[0]",
"alternateName": "Part 2. Information About You (Petitioner). Your Full Name. 4. C. Enter Middle Name.",
"isNoExport": false,
"isFileSelect": false,
"type": "plaintext",
"value": "MIDDLE filled"
},
Я попытался запустить это на Windows и Linux с тем же результатом.
Значения не отображаются в Acrobat Reader, даже если щелкнуть эти поля.
Я также пробовал загружать шрифты, чтобы исключить это с тем же результатом.
var font = handles.writer.getFontForFile(__dirname + '/arial.ttf');
xobjectForm.getContentContext()
.BT() // Begin Text writing
.k(0,0,0,1) // set color to Black (cmyk = 0,0,0,1)
.Tf(font,10) // set font; size 20
.Tm(1,0,0,1,10,10) // set position to 0,40 in this object
.Tj('YO YO YO!!') // set text
.ET() // end text writing
У кого-нибудь есть идеи или указатели?
0 ответов
Причина проблемы заключается в том, что форма PDF представляет собой гибридную форму AcroForm/XFA. HummusJS (по крайней мере, версия, используемая OP), по-видимому, только распознает и изменяет определение формы AcroForm. Большинство программ просмотра PDF, не относящихся к Adobe, также распознают только определение формы AcroForm, поэтому Chrome и Firefox отображают ваши изменения: они отображают форму AcroForm. Adobe Reader, с другой стороны, предпочитает определение формы XFA и показывает неизмененную форму XFA.
Фон
Определения форм AcroForm являются собственными определениями форм в PDF-файлах. Метки форм, пояснения и другие фиксированные части отображаются в виде обычного содержимого страницы, а сами видимые поля формы являются аннотациями виджетов на соответствующих страницах PDF. Значения формы хранятся в объектах PDF.
Определения форм XFA - это потоки XML, определяющие поля, статические тексты, линии, изображения, декорации и т. Д. Они могут быть встроены в PDF и использовать PDF просто как транспортный контейнер (заставляя людей думать, что у них есть "нормальный" документ PDF, и делая компьютеры открывают их в своей стандартной программе просмотра PDF). Значения формы хранятся в XML.
PDF-файлы с гибридной формой содержат определение формы AcroForm и XFA, которые отображаются и ведут себя более или менее идентично.
Для сравнения, определения форм XFA могут быть более гибкими, чем определения форм AcroForm; например, они могут иметь таблицы переменной длины. В гибридных формах, однако, они не могут в значительной степени использовать эту большую гибкость, поскольку они должны выглядеть так же, как в варианте AcroForm.
Определения форм AcroForm указаны в самой спецификации PDF ISO 32000. Для определений форм XFA в спецификации PDF указывается только объект (целевой словарь и ключ в нем), в котором хранится определение формы, и ссылка на внешний частный документ, который задает содержимое определения формы.
Начиная с PDF 2.0 формы XFA устарели в PDF, ср. ISO 32000-2:
Поток или массив XFA (Необязательно; не рекомендуется в PDF 2.0) Поток или массив, содержащий ресурс XFA, формат которого должен соответствовать Спецификации пакета данных (XDP).
См. Приложение K, "(нормативные) формы XFA".
(Таблица 224 - Записи в интерактивной форме словаря)
XFA формы устарели с PDF 2.0.
(Приложение К (нормативное) формы XFA)
Спецификация PDF явно позволяет процессорам PDF не поддерживать формы XFA:
Реализация такой генерации страниц, управляемой схемой, требует значительных усилий помимо простой программы просмотра PDF, и поэтому процессор PDF может решить не реализовывать эту функцию.
(Приложение К (нормативное) формы XFA)
Большинство программ просмотра PDF не поддерживают обработку форм XFA (и, следовательно, хранят только значения в определении формы AcroForm), за исключением явных Adobe Acrobat (Reader).
Adobe Acrobat (Reader), сталкиваясь с гибридной формой, предпочитает определение XFA и отображает его. Он хранит значения в обоих определениях формы.
Работа вокруг
В случае гибридных определений форм лучшим вариантом обычно является удаление определения формы XFA. Кроме того, гибридные PDF-файлы часто подписываются с помощью подписи прав на использование, чтобы Adobe Acrobat Reader позволял сохранять заполненные формы XFA. После удаления формы XFA необходимо также удалить подпись прав на использование.
Я не знаю, возможно ли это с HummusJS, не говоря уже о том, как. Но даже если это невозможно, можно сделать это в другом программном обеспечении и добавить урезанный PDF-файл в свой проект.