我有一个看起来应该是一个简单的问题 - 我希望能够在 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.
}
我也在尝试使用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;
}
如果没有其他人提出更好的答案,我希望这作为一个起点有所帮助。请让我们知道您的情况如何。