Полный API PDFTron не загружается в WebViewer - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь получить полный API PDFTron, работающий от WEbViewer. Я следовал за шагами в ссылке ниже. https://www.pdftron.com/documentation/web/guides/full-api/setup/

Но я получаю сообщение об ошибке, приведенное ниже в консоли при загрузке веб-браузера.

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

enter image description here

enter image description here

Это мой код.

         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.

enter image description here

В настоящее время мы оцениваем PDFTron, поэтому опция licenseKey не передается в конструктор WebViewer.

Пожалуйста, помогите мне в этом.

1 Ответ

0 голосов
/ 10 января 2020

Я опробовал предоставленный вами код и все еще не смог воспроизвести проблему, с которой вы столкнулись. Обычно я выполняю инициализацию вне событий 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', ...);
});

Кроме того, я заметил, что вы подключаете обработчик событий к annotationsLoaded каждый раз, когда срабатывает documentLoaded. Я не уверен, является ли это намеренным или желательным, но это может привести к многократному запуску обработчика (при переключении документов).

Это может не иметь значения, но вместо использования initialDoc, вы можете попробовать instance.loadDocument вместо инициализации.

await PDFNet.initialize();

docViewer.on('documentLoaded', ...);
docViewer.on('annotationsLoaded', ...);

instance.loadDocument('http://...');

Еще одна вещь, которую стоит упомянуть о полном API. В результате API в большинстве случаев будет возвращать обещание, поэтому большую часть времени вам придется 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);

Дайте мне знать, если это поможет!

...