Pdf.js: PDF何时完成渲染的回调?

创建于 2014-12-30  ·  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#L225https://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 在这里用处不大,尝试学习如何使用 Promises。

@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开发人员,试图在PDF完成渲染时获取js回调,因为我遇到了一些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);

我正在这样做,但它似乎不起作用

在 viewer.js 中设置 "eventBusDispatchToDOM": true 为什么没有人告诉这个!

似乎默认已更改为在 8 月至 9 月左右不向 DOM 发送事件,查看 #10019

此页面是否有帮助?
0 / 5 - 0 等级