Pdf.js: Обратный вызов после завершения рендеринга PDF?

Созданный на 30 дек. 2014  ·  17Комментарии  ·  Источник: mozilla/pdf.js

Мне нужно сделать градиент, чтобы покрыть нижнюю половину визуализированного PDF-файла. Я работаю в газете, и мы делаем приложение, которое показывает газету с тизером перед подпиской.

Проблема в том, что градиент должен быть нарисован поверх PDF-файла, поэтому он должен ждать, пока PDF-файл не завершит рендеринг. На самом деле, в мобильных браузерах попытка отрисовки градиента до того, как PDF-файл будет завершен, приводит к чрезвычайно дикому поведению (холст перерисовывается и мигает каждый раз, когда страница прокручивается даже немного), что приводит к постоянным перерисовкам, и содержимое будет отображаться вверх ногами. иногда.

Итак, довольно просто, мне нужно запустить обратный вызов, когда PDF закончит рендеринг.

Можете ли вы, ребята, поддержать обратные вызовы? Или отправить событие, когда рендеринг завершен?

Самый полезный комментарий

Использование события textlayerrendered у меня работает:

document.addEventListener('textlayerrendered', function (e) {
  if (e.detail.pageNumber === PDFViewerApplication.page) {
    // finished rendering
  }
}, true);

Все 17 Комментарий

У нас есть событие pagerendered или render() возвращает обещание. Универсальное средство просмотра никогда не отображает все страницы, поэтому для средства просмотра это будет невозможно исправить, если только мы не введем режим для объекта PDFViewer, когда он отображает все страницы.

Итак, из какого объекта запускается событие pagerendered? @yurydelendik

См. https://github.com/mozilla/pdf.js/blob/master/web/pdf_viewer.js#L225 и пример использования на https://github.com/mozilla/pdf.js/blob/master/web .

Обратите внимание, что у нас нет API для просмотра. Мы выпустили только API для рендеринга ядра и холста (см. src/display/api.js).

@yurydelendik Я использую это с холстом в браузере. Я немного смущен тем, где еще PDF JS актуален. Меня это сразу смутило, но в любом случае, похоже, у вас есть то, что я ищу. Большое спасибо!

Закрытие как решено.

У меня проблемы с отслеживанием этого события.

Я слушаю (Jquery) событие pagerendered , как показано в документах выше:

$(document).bind('pagerendered', function (e) {
    console.log('Page rendering complete.');
    //do stuff
});

и визуализировать PDF на холсте:

PDFJS.getDocument('my_file.pdf').then(function(pdf) {
    pdf.getPage(1).then(function(page) {
        /* .. snip .. */
        var scaledViewport = page.getViewport(scale);
        var canvas = document.getElementById('the-canvas');
        var context = canvas.getContext('2d');
        canvas.height = scaledViewport.height;
        canvas.width = scaledViewport.width;
        var renderContext = {
            canvasContext : context,
            viewport : scaledViewport
        };
        page.render(renderContext);
});

Сам запуск события работает успешно, поэтому мой слушатель настроен правильно и подключен задолго до page.render(renderContext) .

Возможно, я неправильно понял триггер события. Когда именно должно запускаться событие pagerendered из документа?

@yurydelendik

Если вы не используете универсальное средство просмотра, событие не будет запущено. Извините, я не понял, о чем вы спрашиваете.

См. https://github.com/mozilla/pdf.js/blob/master/examples/learning/prevnext.html#L76 , чтобы узнать, как дождаться завершения рендеринга. jQuery здесь будет менее полезен, попробуйте научиться использовать промисы.

@yurydelendik Теперь я понимаю, большое спасибо за ваше время!

Использование события textlayerrendered у меня работает:

document.addEventListener('textlayerrendered', function (e) {
  if (e.detail.pageNumber === PDFViewerApplication.page) {
    // finished rendering
  }
}, true);

Используя приведенный выше фрагмент, вы просто сделаете:

page.render(renderContext).then(function() {
  console.log("FINISHED RENDERING!");
}, function() {
  console.log("ERROR");
});

@brendandahl спасибо)

Спасибо @lucdetellis ! Я пытался, чтобы кнопка, внешняя по отношению к средству просмотра, запускала функцию печати, но она никогда не работала из-за данной ошибки. Использование вашего решения внутри функции позволило мне запустить эту функцию из родительского фрейма, а затем window.focus() и window.print() после завершения рендеринга и BAM, проблема решена. :)

document.addEventListener('textlayerrendered', function (e) {
  if (e.detail.pageNumber === PDFViewerApplication.page) {
    // finished rendering
  }
}, true);

Меня никогда не звали...

Я называю это так (в конце viewer.js ):

document.addEventListener('textlayerrendered', function (e) {
      console.log("textlayerrendered event called!");
    if (e.detail.pageNumber === PDFViewerApplication.page) {
    // finished rendering
      console.log("FINISHED RENDERING!");
      Android.makeWebViewVisible();
     } else {
     console.log("NOT DONE RENDERING!");
     }
}, true);

document.addEventListener('DOMContentLoaded', webViewerLoad, true);

Пожалуйста, простите мое невежество в javascript, я разработчик Android, пытающийся получить обратные вызовы js, когда PDF-файл завершит рендеринг, потому что я сталкиваюсь с некоторыми специфическими проблемами Android... Любая помощь будет принята с благодарностью.

Обновлено:
Проблема заключалась в том, что видимость моего Android WebView не была установлена ​​​​на VISIBLE , поэтому ни одно из событий JS не запускалось.

Используя средство просмотра, предоставленное с pdf.js, у меня сработало событие pagesloaded (я открываю диалоговое окно печати, как только оно завершает загрузку):

document.addEventListener('pagesloaded', function (e) {
    window.print();
}, true);

@turquoise-turtle вы прикрепили прослушиватель событий к основному документу или к iframe, где у вас есть средство просмотра?

var iframe = document.getElementById('iframe').contentDocument;

                            iframe.addEventListener('pagesloaded', function (e) {
                                alert("loaded");
                            }, true);

я делаю это, и это, кажется, не работает

установите "eventBusDispatchToDOM": true в viewer.js, почему никто об этом не говорит!

Кажется, что значение по умолчанию было изменено, чтобы не отправлять события в DOM примерно с августа по сентябрь, глядя на # 10019.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

BrennanDuffey picture BrennanDuffey  ·  3Комментарии

timvandermeij picture timvandermeij  ·  4Комментарии

jigskpatel picture jigskpatel  ·  3Комментарии

aaronshaf picture aaronshaf  ·  3Комментарии

smit-modi picture smit-modi  ·  3Комментарии