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

标签 javascript pdf acrobat pdf-form hummus.js

使用 HummusJS填写政府 pdf 表格 我无法弄清楚为什么当我在 Chrome/Firefox 中打开已填写的 pdf 表格时,填写的值确实出现,但当我在 Acrobat 中打开时,却出现读者。

使用 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 示例解析填充的 PDF 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

有人有什么想法或建议吗?

最佳答案

问题的原因是 PDF 表单是 AcroForm/XFA 混合表单。鹰嘴 bean 泥 (至少是 OP 使用的版本)显然只能识别和更改 AcroForm 表单定义。大多数非 Adob​​e 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 表单定义更灵活;例如他们可以有可变长度的表。但是,在混合形式中,它们不能充分利用这种更大的灵 active ,因为它们旨在表现得与在 AcroForm 变体中一样。

AcroForm 表单定义在 PDF 规范 ISO 32000 本身中指定。对于 XFA 表单定义,PDF 规范仅指定存储表单定义的对象(目标字典和其中的键),并引用指定表单定义内容的外部专有文档。

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

XFA stream or array (Optional; deprecated in PDF 2.0) A stream or array containing an XFA resource, whose format shall conform to the Data Package (XDP) Specification.

See Annex K, “(normative) XFA forms”.

(表 224 — 交互式表单词典中的条目)

XFA forms were deprecated with PDF 2.0.

(附件 K(规范性)XFA 表格)

PDF 规范明确允许 PDF 处理器不支持 XFA 表单:

The implementation of such a schema driven page generation involves considerable effort beyond that for a simple PDF viewer and therefore a PDF processor may choose to not implement this feature.

(附件 K(规范性)XFA 表格)

大多数 PDF 查看器不执行 XFA 表单处理(因此,仅将值存储在 AcroForm 表单定义中),明显的异常(exception)是 Adob​​e Acrobat (Reader)。

Adobe Acrobat (Reader) 在遇到混合表单时,倾向于使用 XFA 定义并显示它。它将值存储在两个表单定义中。

解决方法

在混合表单定义的情况下,最好的选择通常是删除 XFA 表单定义。此外,混合表单 PDF 通常使用使用权签名进行签名,以使 Adob​​e Acrobat Reader 允许保存填写的 XFA 表单。删除 XFA 表单后,还应删除使用权限签名。

我不知道 HummusJS 是否可行,更不用说如何实现了。但即使不可能,也可以在其他软件中执行此操作,并将剪切的 PDF 添加到自己的项目中。

关于javascript - 为什么 HummusJS 不在 Acrobat Reader 中显示 pdf 填充值(但在浏览器中显示)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53162322/

相关文章:

javascript - 正则表达式未检测到 javascript contenteditable div 中的 youtube 链接

caching - 在 Acrobat Reader 10.0 (HTTP 1.0/HTTP 1.1) 中使用 PDF 流时如何防止缓存

acrobat - 如何使用 Adob​​e Acrobat Pro 将批量(即巨大的 pdf 文件)转换为文本?

node.js - 如何在node.js服务器的客户端下载存储在服务器中的pdf文件

pdf - 将 PDF 转换为 Word

javascript - 在哪里可以找到 Closure Compiler 的 jQuery Mobile 外部文件?

javascript - 通过更新 Prop 更新输入值

javascript - dojo - 声明函数

javascript - 自动在字符之间添加空格

javascript - 使用 Angular 2 下载 Node 流