HummusJS为什么不在Acrobat Reader中显示pdf填充值(但在浏览器中显示)?

时间:2018-11-05 21:14:44

标签: javascript pdf acrobat pdf-form hummus.js

使用HummusJS来填写政府pdf表格,我无法弄清为什么在Chrome / Firefox中打开填写的pdf表格时会出现 do 的原因,但却不这样做”。

使用filling-form-values并为要填写的字段修改main.js代码和示例I-130 pdf form

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

如果我使用HummusJS样本parsing-form-values解析填充的PDF,则这些填充字段中的值。例如:

{
  "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 :(得分:1)

此问题的原因是PDF表单是AcroForm / XFA混合表单。鹰嘴豆泥 (至少是OP使用的版本)显然只能识别和更改AcroForm表单定义。大多数非Adobe PDF查看器也只能识别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规范仅指定存储表单定义的对象(目标字典和其中的键),并引用外部专有文档,该文档指定了表单定义的内容。< / p>

从PDF 2.0开始,XFA表单在PDF中已弃用,请参见。 ISO 32000-2:

  

XFA   流或数组   (可选;在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(阅读器)。

Adob​​e Acrobat(阅读器)遇到混合格式时,倾向于使用 XFA 定义并显示它。它在两个表单定义中存储值。

解决方法

对于混合表单定义,最好的选择通常是删除XFA表单定义。此外,混合表单PDF经常使用使用权签名进行签名,以使Adobe Acrobat Reader允许保存已填写的XFA表单。删除XFA表单后,还应删除使用权签名。

我不知道HummusJS是否可行,更不用说如何了。但是,即使不可能,也可以在其他软件中做到这一点,然后将缩减的PDF添加到一个人的项目中。