Почему 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-файл в свой проект.

Другие вопросы по тегам