首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >停止pdf.js页面呈现

停止pdf.js页面呈现
EN

Stack Overflow用户
提问于 2013-08-05 23:28:40
回答 3查看 8K关注 0票数 9

我使用pdf.js创建了一个简单的pdf查看器,它与next、以前的按钮和一些其他功能并排设置了2页。我使用了pdf.js回购中可用的helloworld示例,因为viewer.js文件对像我这样的菜鸟来说太复杂了。但是,当我多次单击“前一个/下一步”按钮时,pdf.js会呈现所有页面,而不是预期的最后一个页面。它会造成混乱。pdf.js的下面示例也有同样的问题。http://jsbin.com/pdfjs-prevnext-v2/1/edit (链接似乎只适用于火狐。)

我想知道使pdf.js只呈现下一个/前一个按钮到达的最后一个页面的方法。pdf.js api对我帮助不大。希望我能在这里得到一些指导。提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-06 13:37:56

如果我能很好地理解你的问题,我可能有一个解决办法。当我在前面或下一个按钮上点击的速度太快时,画布没有时间刷新,而绘制的两个(或更多)页是不可读的。

要解决这个问题,我使用以下代码:

代码语言:javascript
复制
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);
    }
}

我还修改了pdf.js文件中的呈现函数:

代码语言:javascript
复制
 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.

(在我的pdf.js文件中,这是在第2563和2596行之间)。

因此,在完全绘制前一页之前,将不会绘制任何新的页面,即使您非常快地单击了前一个/下一个按钮!

另一种解决方案可以是取消以前的绘图:

代码语言:javascript
复制
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;
    });
}

我希望它能对你有所帮助,并为我的英语感到遗憾;)祝你今天愉快

票数 4
EN

Stack Overflow用户

发布于 2014-08-04 06:11:49

我也有同样的问题,而且更容易解决。render()方法返回一个renderTask对象,如下所示:

代码语言:javascript
复制
renderTask: {
    internarRenedrTask: {...},
    promise: {...}
}

renderTask.internalRenderTask原型采用了cancel()方法,可以停止渲染。因此,只需记住renderTask.internalRenderTask对象,并在需要时调用cancel()

代码语言:javascript
复制
render: function() {
    if (this.renderTask) {
        this.renderTask.cancel();
    }

    // some code here

    this.renderTask = page.render(...).internalRenderTask;
}
票数 7
EN

Stack Overflow用户

发布于 2013-08-07 08:05:55

关于第二个解决方案,您必须在函数之外创建变量timestamp,例如在文件的开头。如果在函数中声明timestamp,则变量只存在于函数的执行过程中,并且无法工作。你可以做以下几件事:

代码语言:javascript
复制
var timestamp;
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;
    });
}

告诉我现在还好吗

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18069448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档