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中添加请求配置?

问题 ao instalar @pdftron/pdfnet-node

只读表格填写 - PDFTron

使用 NodeJs 在 Pdftron 中导入多个注释

PDFTron 使用硬编码密码解密 PDF

如何在Nodejs的pdftron中保存注释?