При просмотре PDF в Forge Viewer не удается отобразить 2D-модель, созданную TEKLA — не удалось сопоставить шрифт Arial

#autodesk-forge

#autodesk-forge

Вопрос:

Я работаю над программой просмотра PDF, начиная с примера, опубликованного Майклом Билом https://forge.autodesk.com/blog/fast-pdf-viewingmarkup-inside-forge-viewer . Он отлично работает с большим количеством документов разного типа. Моя проблема в том, что при загрузке более одного раза многих 2d-моделей, экспортированных TEKLA в формате PDF, в первый раз все работает хорошо, но следующий сбой показывает на консоли ошибку:

 font-engine.js:51 Failed to map font Arial
value @ font-engine.js:51
value @ font-engine.js:59
value @ LmvCanvasContext.js:594
paintChar @ pdf.js:11506
showText @ pdf.js:11635
executeOperatorList @ pdf.js:11037
(anonymous) @ pdf.js:9541
_next @ pdf.js:9537
(anonymous) @ pdf.js:9528
requestAnimationFrame (async)
_scheduleNext @ pdf.js:9527
_continue @ pdf.js:9520
operatorListChanged @ pdf.js:9510
_renderPageChunk @ pdf.js:8503
(anonymous) @ pdf.js:9026
_onComObjOnMessage @ pdf.js:12705
path2d.js:676 Uncaught (in promise) TypeError: Cannot read property 'triangulationFailed' of null
    at d.fill (path2d.js:676)
    at e.value (LmvCanvasContext.js:531)
    at e.value (LmvCanvasContext.js:595)
    at e.paintChar (pdf.js:11506)
    at e.showText (pdf.js:11635)
    at executeOperatorList (pdf.js:11037)
    at pdf.js:9541
    at new Promise (<anonymous>)
    at t._next (pdf.js:9537)
    at pdf.js:9528
 

Это фрагмент кода:

 function initializeViewer(pdf) {
    if (viewer) {
      console.log('loading');
      viewer.impl.unloadCurrentModel()
      if (markup) 
        markup.hide();
      viewer.loadModel(pdf, viewer);
      return;
    }

    var options = {
        env: "Local",
        useConsolidation: true,
        useADP: false,
    }

    Autodesk.Viewing.Initializer(options, () => {
      viewer = new Autodesk.Viewing.Private.GuiViewer3D(document.getElementById('forgeViewer'));
      viewer.setTheme("light-theme");
      viewer.start();
      if (!pdf) return;


      viewer.loadExtension('Autodesk.PDF').then( () => {
            viewer.loadModel(pdf, viewer);
            viewer.loadExtension("Autodesk.Viewing.MarkupsCore")
            viewer.loadExtension("Autodesk.Viewing.MarkupsGui")
      });
    });
 

Вы можете найти некоторый PDF-файл здесь, на github

Есть идеи?

Ответ №1:

Тестировался с Viewer версии 6.5 и, к сожалению, не смог воспроизвести проблемы — смотрите Живой пример здесь.

Единственные предупреждения, которые я получил, касались неразрешимых путей к шрифтам:

Предупреждение: getPathGenerator — игнорирование символа: «Ошибка: запрос объекта, который еще не разрешен Helvetica_path_g».

Редактировать:

Для загрузки другого:

 viewer.finish(); 
Autodesk.Viewing.theExtensionManager.unregisterExtension('Autodesk.PDF');

viewer = new Autodesk.Viewing.Private.GuiViewer3D(myViewerDiv);
...//reinitialize and load the PDF again

 

Согласен, однако это должно быть обработано более изящно, чтобы вы могли сразу же загрузить другой PDF, поэтому давайте подождем, пока наши инженеры вернутся. Тем временем вы можете использовать то, что я предложил в качестве обходного пути.

Комментарии:

1. Привет, Брайан, вам нужно дважды загрузить документ в один и тот же просмотрщик, чтобы получить ошибку. В первый раз рендеринг выполняется быстро и хорошо. Во второй раз, после выгрузки предыдущего документа и загрузки нового, у вас может произойти частичный рендеринг или полное зависание.

2. Смотрите Мое редактирование — вам нужно будет выгрузить расширение

Ответ №2:

Да, это определенно ошибка!

хорошо, итак, я добавил ваши два PDF-файла на страницу образца (bug1.pdf и bug2.pdf)

демонстрация: https://wallabyway.github.io/offline-pdf-markup /

Почему он ломается…

При загрузке второго PDF-файла мой код разрывает предыдущий PDF-файл, но, похоже, он оставляет что-то в памяти.

Я попробовал три метода удаления…

  1. unloadModel()
  2. viewer.tearDown()
  3. полная инициализация программы просмотра с нуля (удаление строк 39-46)

но… «Ничего из этого не сработало»!!!

исходный код: https://github.com/wallabyway/offline-pdf-markup

Итак…

глядя на ошибки консоли, похоже, что эти чертежи имеют некоторые сложные перекрытия путей, которые слишком сложны для библиотеки «Poly2Tri», что приводит к сбою. К сожалению, затем он оставляет что-то в памяти и не загружается корректно при последующих попытках загрузки.

Я зарегистрировал ошибку (LMV-4525)

Комментарии:

1. Лучше позвонить finish , чем tearDown напрямую — finish официально задокументировано, пока tearDown нет. И на вашем месте я бы поместил это в комментарий вместо ответа, потому что на самом деле это ни на что не отвечает…