Render .pdf to single Canvas using pdf.js and ImageData

前端 未结 3 1151
没有蜡笔的小新
没有蜡笔的小新 2020-12-13 16:15

I am trying to read an entire .pdf Document using PDF.js and then render all the pages on a single canvas.

My idea: render each page onto a canvas and get the ImageD

3条回答
  •  一个人的身影
    2020-12-13 17:16

    You can pass the number page to the promises , get that page canvas data and render in the right order on canvas

        var renderPageFactory = function (pdfDoc, num) {
            return function () {
    
                var localCanvas = document.createElement('canvas');
    
                ///return pdfDoc.getPage(num).then(renderPage);
                return  pdfDoc.getPage(num).then((page) => {
                    renderPage(page, localCanvas, num);
                });
    
    
            };
        };
    
        var renderPages = function (pdfDoc) {
            var renderedPage = $q.resolve();
            for (var num = 1; num <= pdfDoc.numPages; num++) {
                // Wait for the last page t render, then render the next
                renderedPage = renderedPage.then(renderPageFactory(pdfDoc, num));
            }
        };
    
        renderPages(pdf);
    

    Complete example

       function renderPDF(url, canvas) {
    
    
    
        var pdf = null;
        PDFJS.disableWorker = true;
        var pages = new Array();
    
        var context = canvas.getContext('2d');
        var scale = 1;
    
        var canvasWidth = 256;
        var canvasHeight = 0;
        var pageStarts = new Array();
        pageStarts[0] = 0;
    
    
    
    
    
        var k = 0;
    
        function finishPage(localCanvas, num) {
            var ctx = localCanvas.getContext('2d');
    
            pages[num] = ctx.getImageData(0, 0, localCanvas.width, localCanvas.height);
    
            // calculate the accumulated with of the final display canvas
            canvasHeight += localCanvas.height;
            // save the "Y" starting position of this pages[i]
            pageStarts[num] = pageStarts[num -1] + localCanvas.height;
    
            if (k + 1 >= pdf.numPages)
            {
    
    
                canvas.width = canvasWidth;
                canvas.height = canvasHeight;  // this auto-clears all canvas contents
                for (var i = 0; i < pages.length; i++) {
                    context.putImageData(pages[i+1], 0, pageStarts[i]);
                }
    
                var img = canvas.toDataURL("image/png");
                $scope.printPOS(img);
            }
    
            k++;
    
    
        }
    
        function renderPage(page, localCanvas, num) {
    
            var ctx = localCanvas.getContext('2d');
    
            var viewport = page.getViewport(scale);
    
    
            // var viewport = page.getViewport(canvas.width / page.getViewport(1.0).width);
            // changing canvas.width and/or canvas.height auto-clears the canvas
            localCanvas.width = viewport.width;
    
            /// viewport.width = canvas.width;
            localCanvas.height = viewport.height;
    
            var renderTask = page.render({canvasContext: ctx, viewport: viewport});
    
    
            renderTask.then(() => {
                finishPage(localCanvas, num);
            });
    
    
        }
    
    
    
    
    
        PDFJS.getDocument(url).then(function getPdfHelloWorld(_pdf) {
    
            pdf = _pdf;
    
    
    
            var renderPageFactory = function (pdfDoc, num) {
                return function () {
    
                    var localCanvas = document.createElement('canvas');
    
                    ///return pdfDoc.getPage(num).then(renderPage);
                    return  pdfDoc.getPage(num).then((page) => {
                        renderPage(page, localCanvas, num);
                    });
    
    
                };
            };
    
            var renderPages = function (pdfDoc) {
                var renderedPage = $q.resolve();
                for (var num = 1; num <= pdfDoc.numPages; num++) {
                    // Wait for the last page t render, then render the next
                    renderedPage = renderedPage.then(renderPageFactory(pdfDoc, num));
                }
            };
    
            renderPages(pdf);
    
    
    
    
    
    
        });
    
    
    
    
    
    }
    

提交回复
热议问题