我需要渲染一个渐变来覆盖渲染 PDF 的下半部分。 我正在为一家报纸工作,我们正在做一个应用程序,在订阅前用预告片显示报纸。
问题是,渐变需要在 PDF 上绘制,所以必须等到 PDF 完成渲染。 事实上,在移动浏览器上尝试在 PDF 完成之前进行渐变渲染会导致极其疯狂的行为(每次页面滚动时画布都会重新渲染并闪烁)导致不断的重新绘制,并且内容将呈现颠倒有时。
很简单,当 PDF 完成渲染时,我需要运行一个回调。
你们能支持回调吗? 或者在渲染完成时发送一个事件?
我们有 '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 在这里用处不大,尝试学习如何使用 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
最有用的评论
使用
textlayerrendered
事件对我有用: