我使用pdf.js创建了一个简单的pdf查看器,它有2个页面并排显示下一个,前一个按钮和一些其他功能.我使用了pdf.js repo提供的helloworld示例,因为viewer.js文件对于像我这样的noob来说太复杂了.但是,当我多次单击上一个/下一个按钮时,pdf.js将呈现所有页面而不是预期的最后一页.它造成了一团糟.pdf.js的以下示例具有相同的问题. http://jsbin.com/pdfjs-prevnext-v2/1/edit(链接似乎只适用于firefox.)
我想知道是什么方法使pdf.js只渲染下一个/上一个按钮到达的最后一页.pdf.js api对我帮助不大.希望我能在这里得到一些指导.提前致谢.
小智 6
我有同样的问题,解决它更容易.该render()方法返回一个如下所示的renderTask对象:
renderTask: {
internarRenedrTask: {...},
promise: {...}
}
Run Code Online (Sandbox Code Playgroud)
renderTask.internalRenderTaskhas cancel()方法的原型可以停止渲染.所以只需记住renderTask.internalRenderTask对象并cancel()在需要时调用:
render: function() {
if (this.renderTask) {
this.renderTask.cancel();
}
// some code here
this.renderTask = page.render(...).internalRenderTask;
}
Run Code Online (Sandbox Code Playgroud)
如果我很好地理解你的问题,我可能会有解决方案。当我在上一个或下一个按钮上单击得太快时,画布没有时间刷新,并且绘制了两个(或更多)页面,因此无法读取。
为了解决这个问题,我使用以下代码:
var stop = false;
function goPrevious() {
if (pageNum > 1 && !stop)
{
stop = true;
pageNum--;
renderPage(pageNum);
}
}
function goNext() {
if (pageNum < pdfDoc.numPages && !stop)
{
stop = true;
pageNum++;
renderPage(pageNum);
}
}
Run Code Online (Sandbox Code Playgroud)
我还修改了 pdf.js 文件中的渲染函数:
render: function PDFPageProxy_render(params) {
this.renderInProgress = true;
var promise = new Promise();
var stats = this.stats;
stats.time('Overall');
// If there is no displayReadyPromise yet, then the operatorList was never
// requested before. Make the request and create the promise.
if (!this.displayReadyPromise) {
this.displayReadyPromise = new Promise();
this.destroyed = false;
this.stats.time('Page Request');
this.transport.messageHandler.send('RenderPageRequest', {
pageIndex: this.pageNumber - 1
});
}
var self = this;
function complete(error) {
self.renderInProgress = false;
stop = false;
if (self.destroyed || self.cleanupAfterRender) {
delete self.displayReadyPromise;
delete self.operatorList;
self.objs.clear();
}
if (error)
promise.reject(error);
else
promise.resolve();
}
var continueCallback = params.continueCallback;
//etc.
Run Code Online (Sandbox Code Playgroud)
(在我的 pdf.js 文件中,它位于第 2563 行和第 2596 行之间)。
因此,即使您非常非常快地单击上一页/下一页按钮,直到上一页完全绘制完成后,才会绘制新页面!
另一种解决方案可能是取消之前的绘图:
function renderPage(num) {
pdfDoc.getPage(num).then(function(page) {
// canvas resize
viewport = page.getViewport(ratio);
canvas.height = viewport.height;
canvas.width = viewport.width;
// draw the page into the canvas
var pageTimestamp = new Date().getTime();
timestamp = pageTimestamp;
var renderContext = {
canvasContext: ctx,
viewport: viewport,
continueCallback: function(cont) {
if(timestamp != pageTimestamp) {
return;
}
cont();
}
};
page.render(renderContext);
// update page numbers
document.getElementById('page_num').textContent = pageNum;
document.getElementById('page_count').textContent = pdfDoc.numPages;
});
}
Run Code Online (Sandbox Code Playgroud)
我希望它能帮助你,抱歉我的英语;)祝你有美好的一天
| 归档时间: |
|
| 查看次数: |
5429 次 |
| 最近记录: |