PDFTron full api 未在 WebViewer 中加载
Posted
技术标签:
【中文标题】PDFTron full api 未在 WebViewer 中加载【英文标题】:PDFTron full api is not getting loaded in WebViewer 【发布时间】:2020-01-10 09:50:36 【问题描述】:我正在尝试从 WEBViewer 获取 PDFTron 的完整 api。我按照下面链接中的步骤操作。 https://www.pdftron.com/documentation/web/guides/full-api/setup/
但是我在加载 webviewer 时在控制台中收到下面给出的错误。
Uncaught (in promise) Error: Full version of PDFNetJS has not been loaded. Please pass the "fullAPI: true" option in your WebViewer constructor to use the PDFNet APIs.
at Object.get (CoreControls.js:1694)
at z.docViewer.on ((index):43)
at CoreControls.js:398
at Array.forEach (<anonymous>)
at z.O (CoreControls.js:398)
at CoreControls.js:213
这是我的代码。
WebViewer(
path: 'WebViewer-6.0.2/lib', // path to the PDFTron 'lib' folder on your server
type: 'html5',
initialDoc: 'forms/local.pdf', // You can also use documents on your server
fullAPI: true,
, document.getElementById('viewer'))
.then(instance =>
const docViewer = instance.docViewer;
const annotManager = instance.annotManager;
const Annotations = instance.Annotations;
Annotations.ChoiceWidgetAnnotation.FORCE_SELECT=true;
const Actions = instance.Actions;
docViewer.on('documentLoaded', async () =>
const PDFNet = instance.PDFNet;
await PDFNet.Initialize();
// This part requires the full API: https://www.pdftron.com/documentation/web/guides/full-api/setup/
alert('async');
const doc = docViewer.getDocument();
// Get document from worker
const pdfDoc = await doc.getPDFDoc();
pdfDoc.getAcroForm().putBool("NeedAppearances", true);
);
docViewer.on('documentLoaded', () =>
docViewer.on('annotationsLoaded', () =>
const annotations = annotManager.getAnnotationsList();
annotations.forEach(annot =>
console.log('fieldName => '+annot.fieldName);
);
);
请帮我解决这个问题。
编辑
按照@Andy 的建议修改了代码。 index.html 文件中的更新代码如下所示,
<!DOCTYPE html>
<html>
<head>
<title>Basic WebViewer</title>
</head>
<!-- Import WebViewer as a script tag -->
<script src='WebViewer-6.0.2/lib/webviewer.min.js'></script>
<body>
<div id='viewer' style='width: 1024px; height: 600px; margin: 0 auto;'>
<script>
WebViewer(
path: 'WebViewer-6.0.2/lib', // path to the PDFTron 'lib' folder on your server
type: 'html5',
fullAPI: true,
// licenseKey: 'Insert commercial license key here after purchase',
, document.getElementById('viewer'))
.then(async instance =>
const Annotations, Tools, CoreControls, PDFNet, PartRetrievers, docViewer, annotManager = instance;
await PDFNet.Initialize();
Annotations.ChoiceWidgetAnnotation.FORCE_SELECT=true;
const Actions = instance.Actions;
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 acroFrom = await pdfDoc.getAcroForm();
acroform.putBool("NeedAppearances", true);
);
instance.loadDocument('forms/test.pdf');
);
</script>
</div>
</body>
</html>
我正在从我的项目文件夹中的 http 服务器加载文件。
http-server -a localhost -p 7080
不幸的是,我遇到了同样的错误。
Error: Full version of PDFNetJS has not been loaded. Please pass the "fullAPI: true" option in your WebViewer constructor to use the PDFNet APIs.
我们目前正在评估 PDFTron,因此未在 WebViewer 构造函数中传递 licenseKey 选项。
请帮我解决这个问题。
【问题讨论】:
【参考方案1】:我已经试用了您提供的代码,但仍然无法重现您遇到的问题。我通常会在 WebViewer 事件之外执行初始化,因此初始化只发生一次:
WebViewer(...)
.then(instance =>
const Annotations, Tools, CoreControls, PDFNet, PartRetrievers, docViewer = instance;
const annotManager = docViewer.getAnnotationManager();
await PDFNet.initialize(); // Only needs to be initialized once
docViewer.on('documentLoaded', ...);
docViewer.on('annotationsLoaded', ...);
);
另外,我注意到每次触发documentLoaded
时,您都会将一个事件处理程序附加到annotationsLoaded
。我不确定这是有意还是可取,但这可能导致处理程序触发多次(切换文档时)。
这可能无关紧要,但您可以在初始化后尝试instance.loadDocument
,而不是使用initialDoc
。
await PDFNet.initialize();
docViewer.on('documentLoaded', ...);
docViewer.on('annotationsLoaded', ...);
instance.loadDocument('http://...');
关于完整的 API,还有最后一件事要提到。 API 将在大多数情况下返回一个 Promise 作为结果,因此您大部分时间都必须await
返回值。
const acroFrom = await pdfDoc.getAcroForm();
// You can await this too. Especially if you need a reference to the new bool object that was
acroform.putBool("NeedAppearances", true);
如果这有帮助,请告诉我!
【讨论】:
非常感谢您对此进行调查。我已经更新了代码。但仍然面临这个问题。在问题帖子本身中添加了最新代码。 我们正在使用 PDFTron 网络查看器的试用版,因为我们正在对其进行评估。这会导致问题吗? 查看并试用了您提供的 HTML/javascript。我注意到您对PDFNet.Initialize
的调用有点不正确。调用应为小写:PDFNet.initialize
。 JS API 在大多数情况下应该是驼峰式的。
这里有一个例子pdftron.com/documentation/web/guides/full-api/setup以上是关于PDFTron full api 未在 WebViewer 中加载的主要内容,如果未能解决你的问题,请参考以下文章
如何在使用URL提取文档的同时在PDFTron Webviewer中添加请求配置?