#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-файл, но, похоже, он оставляет что-то в памяти.
Я попробовал три метода удаления…
- unloadModel()
- viewer.tearDown()
- полная инициализация программы просмотра с нуля (удаление строк 39-46)
но… «Ничего из этого не сработало»!!!
исходный код: https://github.com/wallabyway/offline-pdf-markup
Итак…
глядя на ошибки консоли, похоже, что эти чертежи имеют некоторые сложные перекрытия путей, которые слишком сложны для библиотеки «Poly2Tri», что приводит к сбою. К сожалению, затем он оставляет что-то в памяти и не загружается корректно при последующих попытках загрузки.
Я зарегистрировал ошибку (LMV-4525)
Комментарии:
1. Лучше позвонить
finish
, чемtearDown
напрямую —finish
официально задокументировано, покаtearDown
нет. И на вашем месте я бы поместил это в комментарий вместо ответа, потому что на самом деле это ни на что не отвечает…