使用PDF.JS填写PDF表单

问题描述 投票:0回答:1

我有一个看起来应该是一个简单的问题 - 我希望能够在 javascript 中以编程方式填写 PDF 表单。

我的第一次尝试是使用 pdf-lib,它有一个很好的用于填写表单的 API - 但是,我尝试填写的表单有这样的字段:

{
...
"employment.employment": [
  {
    id: '243R',
    value: 'Off',
    defaultValue: null,
    exportValues: 'YES',
    editable: true,
    name: 'employment',
    rect: [ 264.12, 529.496, 274.23, 539.604 ],
    hidden: false,
    actions: null,
    page: -1,
    strokeColor: null,
    fillColor: null,
    rotation: 0,
    type: 'checkbox'
  },
  {
    id: '244R',
    value: 'Off',
    defaultValue: null,
    exportValues: 'NO',
    editable: true,
    name: 'employment',
    rect: [ 307.971, 529.138, 318.081, 539.246 ],
    hidden: false,
    actions: null,
    page: -1,
    strokeColor: null,
    fillColor: null,
    rotation: 0,
    type: 'checkbox'
  }
]
}

which pdf-lib 无法正确解析。它只允许我设置 243R 的值,将 244R 视为不存在(我认为是因为名称不唯一)。那个图书馆似乎也被遗弃了。这就是生活。

然后前往pdf.js。我可以加载文档并设置值,但调用 saveDocument 或 getData 仅返回原始的、未修改的文档。如何保存修改后的文档?

const run = async () => {
  const loading = pdfjs.getDocument('form-cms1500.pdf')
  const pdf = await loading.promise
  const fields = await pdf.getFieldObjects()

  console.log(fields['employment.employment'] )
  fields['employment.employment'][0].value = 'On'
  console.log(fields['employment.employment'] )
  await fs.writeFileSync('test.pdf', await pdf.saveDocument()) // saveDocument throws this Warning: saveDocument called while `annotationStorage` is empty, please use the getData-method instead.

}
javascript pdf pdf.js pdf-lib.js
1个回答
0
投票

我也在尝试使用PDF.js来填写PDF表单(但它们是使用XFA的政府表单,因此您必须修改XML数据而不是PDF元素),所以我希望这个问题能产生更多回复.

我确实在 Mozilla 上找到了一篇博客文章,讨论 PDF.js 在 2021 年 10 月开始使用 XFA 支持 PDF 文件(https://blog.mozilla.org/attack-and-defense/2021/10/14/implementing-在-firefox-pdf-viewer 中填写表单和辅助功能/)。

撰写这篇文章的开发人员之一 Brendan Dahl 还发布了一些 PDF.js 实用程序 - 一个显示 PDF 的结构,另一个使用 XFA 显示 PDF 的结构,第三个(制作者)修改一个 PDF 以使用另一个 PDF 中的字体并保存它 (https://github.com/brendandahl/pdf.js.utils/blob/master/README.md)。看起来maker.js文件中的create(data, fontRef, content)函数中有保存修改后的PDF文档的代码。本例中保存的相关代码似乎是:

// line 55
var maker = (function () {

  function PDFOut() {
    this.output = '';
  }
  PDFOut.prototype = {
    write: function (data) {
      this.output += data;
    }
  };

// line 224
 function create(data, fontRef, content) {

// build PDF header, body and trailer

// line 284
    var out = new PDFOut();
    createHeader(out);
    createBody(catalogRef.ref, refManager, out);
    var xrefOffset = createXref(refManager, out);
    createTrailer(refManager.offsetCount, catalogRef.ref, xrefOffset, out);

    return out.output;
  }

如果没有其他人提出更好的答案,我希望这作为一个起点有所帮助。请让我们知道您的情况如何。

© www.soinside.com 2019 - 2024. All rights reserved.