【问题标题】:Jquery - Get all canvases ready stateJquery - 获取所有画布就绪状态
【发布时间】:2014-04-28 10:24:22
【问题描述】:

我正在使用下面的代码将 pdf 文档页面写入画布。我正在使用 xpdf 的 pdfinfo 工具获取页数“$np”。最后,我需要将所有页面绑定到turn.js。但是,如果画布已经绑定到带有 turn 功能的 turn.js,则它永远不会渲染画布。在所有画布完全渲染后,我必须这样做。 div 就绪、画布就绪或文档就绪功能不起作用。我不想使用 setTimeout 执行此操作,因为渲染时间可能取决于服务器速度。还有哪些其他解决方法?

<!DOCTYPE html>
<script type="text/javascript" src="http://code.jquery.com/jquery-2.1.0.min.js"></script>
<script type="text/javascript" src="turn.min.js"></script>
<script type="text/javascript" src="compatibility.js"></script>
<script type="text/javascript" src="pdf.js"></script>
<?php 
function getPDFPages($document)
{
    $cmd = "pdfinfo"; 
    exec("$cmd $document", $output);
    $pagecount = 0;
    foreach($output as $op)
    {
        if(preg_match("/Pages:\s*(\d+)/i", $op, $matches) === 1)
        {
            $pagecount = intval($matches[1]);
            break;
        }
    }
    return $pagecount;
}
$document = 'pegasus.pdf';
$np=getPDFPages($document);
 $js='';
echo '<div id="flipbook" style="display:none;">';
for ($ii = 1; $ii <=$np; $ii++) {
echo'<div><canvas id="page'.$ii.'" style="border:1px solid black;"/></div>';}
echo '</div><script>PDFJS.workerSrc = "pdf.worker.js";"use strict";PDFJS.getDocument("'.$document.'").then( function (pdf) {
for(z=1;z<='.$np.';z++)
 wrPDF(pdf, z)

});
function wrPDF(pdf, pn) {
    pdf.getPage(pn).then(
function(page) {var scale = 1;var viewport = page.getViewport(scale);var canvas = document.getElementById("page"+pn);var context = canvas.getContext("2d");canvas.height = viewport.height;canvas.width = viewport.width;var renderContext = {canvasContext: context,viewport: viewport};page.render(renderContext)})
    }
$(document).ready(function(){
    $("#flipbook").turn({width: 1228,height: 840,autoCenter: true}).show("slow");
    $(window).bind("keydown", function(e){
        switch (e.keyCode) {
            case 37:$("#flipbook").turn("previous");break;
            case 39:$("#flipbook").turn("next");break;}
            })
    });
</script>';
?>

【问题讨论】:

    标签: jquery pdf.js


    【解决方案1】:

    参见https://github.com/mozilla/pdf.js/blob/master/src/display/api.js#L468:page.render(renderContext) 将返回一个RenderTask,其中包含promise 属性(一个Promise)。您可以调用其then 函数并提供回调来跟踪渲染完成情况。

    【讨论】:

    • 我以前见过这个,但我无法在 rendercontext 承诺之后排队等待循环。
    • 假设您在 wrPDF 有 var pagesLeft = pdf.numPages;,所以 function renderDone() { pagesLeft--; if (pagesLeft === 0) { onAllPagesRendered(); } } 将执行预期的操作。
    • 这对我帮助很大。但是最后一个画布在渲染上下文之后没有 then 。我会找到解决方法的,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 2012-12-14
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    相关资源
    最近更新 更多