Javascript 使用 PDFTron WebViewer FormBuilder 创建的表单字段的触发操作 UI
Javascript trigger action for form fields created using PDFTron WebViewer FormBuilder UI
我目前正在评估 WebViewer 5.2.8 版。
我需要设置一些 javascript function/code 作为触发器的操作,例如通过 WebViewer UI 计算触发器、格式化触发器和击键触发器。
请帮助我如何在 WebViewer UI.
中为表单字段触发器配置 javascript 代码
提前致谢,
赛义德
抱歉回复晚了!
您必须自己创建 UI 组件,这些组件将包含 JavaScript 代码。您可以仅使用 HTML 和 JavaScript 来执行类似于 FormBuilder 演示所做的操作。但是,最好克隆 open source UI 并添加您自己的组件。
至于设置操作,我建议您尝试使用 6.0 版,因为该版本对小部件和表单字段有更好的支持。但是,我们正在调查字段操作的错误,该错误会在下载文档时引发错误。您应该能够使用此代码使其首先运行:
docViewer.on('annotationsLoaded', () => {
const annotations = annotManager.getAnnotationsList();
annotations.forEach(annot => {
const action = new instance.Actions.JavaScript({ javascript: 'alert("Hello World!")' });
// C cor Calculate, and F for Format
annot.addAction('K', action);
});
});
错误解决后,您应该可以正确下载文档。
否则,您将不得不使用完整的 API,这可能不太理想。完整的 API 会有点复杂,如果上述功能很快就会得到修复,我不会推荐它。
让我知道这是否有帮助,或者您是否需要有关使用完整 API 来完成此操作的更多信息!
编辑
这是完整的 API 代码!由于完整的 API 在低级别上工作并且非常接近 PDF 规范,因此要使其工作确实需要更多的时间。您仍然需要使用我之前提供的代码更新注释,我将再次包含它。
docViewer.on('documentLoaded', async () => {
// This part requires the full API: https://www.pdftron.com/documentation/web/guides/full-api/setup/
const doc = docViewer.getDocument();
// Get document from worker
const pdfDoc = await doc.getPDFDoc();
const pageItr = await pdfDoc.getPageIterator();
while (await pageItr.hasNext()) {
const page = await pageItr.current();
// Note: this is a PDF array, not a JS array
const annots = await page.getAnnots();
const numAnnots = await page.getNumAnnots();
for (let i = 0; i < numAnnots; i++) {
const annot = await annots.getAt(i);
const subtypeDict = await annot.findObj('Subtype');
const subtype = await subtypeDict.getName();
const actions = await annot.findObj('AA');
// Check to make sure the annot is of type Widget
if (subtype === 'Widget') {
// Create the additional actions dictionary if it does not exist
if (!actions) {
actions = await annot.putDict('AA');
}
let calculate = await actions.findObj('C');
// Create the calculate action (C) if it does not exist
if (!calculate) {
calculate = await actions.putDict('C');
await Promise.all([calculate.putName('S', 'JavaScript'), calculate.putString('JS', 'app.alert("Hello World!")')]);
}
// Repeat for keystroke (K) and format (F)
}
}
pageItr.next();
}
});
docViewer.on('annotationsLoaded', () => {
const annotations = annotManager.getAnnotationsList();
annotations.forEach(annot => {
const action = new instance.Actions.JavaScript({ javascript: 'app.alert("Hello World!")' });
// K for Keystroke, and F for Format
annot.addAction('C', action);
});
});
您或许可以在 documentLoaded 事件下将它们放在一起,但是一旦修复准备就绪,您可以使用完整的 API.[=13= 删除该部分]
我目前正在评估 WebViewer 5.2.8 版。 我需要设置一些 javascript function/code 作为触发器的操作,例如通过 WebViewer UI 计算触发器、格式化触发器和击键触发器。 请帮助我如何在 WebViewer UI.
中为表单字段触发器配置 javascript 代码提前致谢,
赛义德
抱歉回复晚了!
您必须自己创建 UI 组件,这些组件将包含 JavaScript 代码。您可以仅使用 HTML 和 JavaScript 来执行类似于 FormBuilder 演示所做的操作。但是,最好克隆 open source UI 并添加您自己的组件。
至于设置操作,我建议您尝试使用 6.0 版,因为该版本对小部件和表单字段有更好的支持。但是,我们正在调查字段操作的错误,该错误会在下载文档时引发错误。您应该能够使用此代码使其首先运行:
docViewer.on('annotationsLoaded', () => {
const annotations = annotManager.getAnnotationsList();
annotations.forEach(annot => {
const action = new instance.Actions.JavaScript({ javascript: 'alert("Hello World!")' });
// C cor Calculate, and F for Format
annot.addAction('K', action);
});
});
错误解决后,您应该可以正确下载文档。
否则,您将不得不使用完整的 API,这可能不太理想。完整的 API 会有点复杂,如果上述功能很快就会得到修复,我不会推荐它。
让我知道这是否有帮助,或者您是否需要有关使用完整 API 来完成此操作的更多信息!
编辑
这是完整的 API 代码!由于完整的 API 在低级别上工作并且非常接近 PDF 规范,因此要使其工作确实需要更多的时间。您仍然需要使用我之前提供的代码更新注释,我将再次包含它。
docViewer.on('documentLoaded', async () => {
// This part requires the full API: https://www.pdftron.com/documentation/web/guides/full-api/setup/
const doc = docViewer.getDocument();
// Get document from worker
const pdfDoc = await doc.getPDFDoc();
const pageItr = await pdfDoc.getPageIterator();
while (await pageItr.hasNext()) {
const page = await pageItr.current();
// Note: this is a PDF array, not a JS array
const annots = await page.getAnnots();
const numAnnots = await page.getNumAnnots();
for (let i = 0; i < numAnnots; i++) {
const annot = await annots.getAt(i);
const subtypeDict = await annot.findObj('Subtype');
const subtype = await subtypeDict.getName();
const actions = await annot.findObj('AA');
// Check to make sure the annot is of type Widget
if (subtype === 'Widget') {
// Create the additional actions dictionary if it does not exist
if (!actions) {
actions = await annot.putDict('AA');
}
let calculate = await actions.findObj('C');
// Create the calculate action (C) if it does not exist
if (!calculate) {
calculate = await actions.putDict('C');
await Promise.all([calculate.putName('S', 'JavaScript'), calculate.putString('JS', 'app.alert("Hello World!")')]);
}
// Repeat for keystroke (K) and format (F)
}
}
pageItr.next();
}
});
docViewer.on('annotationsLoaded', () => {
const annotations = annotManager.getAnnotationsList();
annotations.forEach(annot => {
const action = new instance.Actions.JavaScript({ javascript: 'app.alert("Hello World!")' });
// K for Keystroke, and F for Format
annot.addAction('C', action);
});
});
您或许可以在 documentLoaded 事件下将它们放在一起,但是一旦修复准备就绪,您可以使用完整的 API.[=13= 删除该部分]