Почему HummusJS не отображает значения заполнения pdf в Acrobat Reader (а отображает в браузере)? - PullRequest
0 голосов
/ 06 ноября 2018

Использование HummusJS для заполнения правительственных PDF-форм Я не могу понять, почему заполненные значения do появляются, когда я открываю заполненные 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 с правильными заполненными значениями (никаких проблем с выравниванием - я знаю, как это исправить): enter image description here

А вот как это выглядит в Acrobat Reader - печальные пустые поля: enter image description here

Если я проанализирую заполненный PDF-файл, используя образцы HummusJS parsing-form-values ​​, значения равны в этих заполненных полях. например:

{
  "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

У кого-нибудь есть идеи или указатели?

1 Ответ

0 голосов
/ 17 февраля 2019

Причина проблемы заключается в том, что форма 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:

РФ поток или массив (Необязательно; не рекомендуется в PDF 2.0) Поток или массив, содержащий ресурс XFA, формат которого должен соответствовать Спецификации пакета данных (XDP).

См. Приложение K, «(нормативные) формы XFA».

(Таблица 224 - Записи в словаре интерактивной формы)

Формы XFA устарели с PDF 2.0.

(Приложение K (нормативное) XFA формы)

Спецификация PDF явно разрешает процессорам PDF не поддерживать формы XFA:

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

(Приложение K (нормативное) XFA формы)

Большинство программ просмотра PDF не реализуют обработку форм XFA (и, следовательно, сохраняют только значения в определении формы AcroForm ), очевидными исключениями являются Adobe Acrobat (Reader).

Adobe Acrobat (Reader), когда сталкивается с гибридной формой, предпочитает определение XFA и отображает его. Хранит значения в обоих определениях формы.

Работа вокруг

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

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

...