pdf流文件轉圖片


需求:將后台返回的pdf流文件轉換成圖片與頁面其他內容一起打印
pdf流文件不能直接在前台顯示,需要借助pdf.js+viewer.js。

一般情況下,如果要打印pdf流文件,可以直接在新打開的viewer.html頁面點擊打印,但現在想跟頁面其他內容一塊打印,界面如下圖所示,選擇打印附件,再點擊打印時,需要將pdf文件跟當前頁面一起打印出來,當前頁面的內容,可以根據html()方法獲取,但是pdf內容應該怎么加入到html里呢??


 

 我們可以借助pdf.js,worker.js, 當選擇打印附件的時候,調用loadPDF()方法,傳入流文件地址,在頁面中將pdf轉換成canvas,然后將canvas保存成圖片,將轉換成的img圖片地址添加到頁面里,這時候點擊打印,獲取html()就可以將pdf內容一並打印出來了。

function renderPDF(pdf,i,id) {
    console.log(pdf);
    pdf.getPage(i).then(function(page) {
        var scale = 1.5;
        var viewport = page.getViewport(scale);
        //  准備用於渲染的 canvas 元素
        var canvas = document.getElementById(id);
        var context = canvas.getContext('2d');
        canvas.height = viewport.height;
        canvas.width = viewport.width;

        // 將 PDF 頁面渲染到 canvas 上下文中
        var renderContext = {
            canvasContext: context,
            viewport: viewport
        };
        page.render(renderContext);
        setTimeout(function(){  //當canvas渲染完成之后,將canvas內容轉換成圖片,添加到頁面上
            var img=new Image();
            img.src=canvas.toDataURL("image/jpeg");
            $("div[name=divImage]").append("<div style=\"page-break-before:always;text-align:left;\">" +
                "<p style=\"width:100%;text-align:left;font-size:13px;display:inline\">"+langConfig.finance.applyDetailNum+" :" + $("#container").attr("applyCode") + "</p>" +
                "</div>").append(img);
            // $("#imgList").append(img);
        },1000);

    })

};
function loadPDF(fileURL) {
    pdfjsLib.getDocument(fileURL).then(function(pdf) {
        //用 promise 獲取頁面
        var id = '';
        var idTemplate = 'cw-pdf-';
        var pageNum = pdf.numPages;
        //根據頁碼創建畫布
        createSeriesCanvas(pageNum,idTemplate);
        //將pdf渲染到畫布上去
        for (var i = 1; i <= pageNum; i++) {
            id = idTemplate + i;
            renderPDF(pdf,i,id);
        }
    });
}
//創建和pdf頁數等同的canvas數
function createSeriesCanvas(num,template) {
    var id = '';
    for(var j = 1; j <= num; j++){
        id = template + j;
        createPdfContainer(id,'pdfClass');
    }
}
function createPdfContainer(id,className) {
    var pdfContainer = document.getElementById('container');
    var canvasNew =document.createElement('canvas');
    canvasNew.id = id;
    canvasNew.className = className;
    pdfContainer.appendChild(canvasNew);
};

缺點:如果pdf頁數較多時,canvas轉換過程耗時太長,頁面會有卡住的情況。
參考鏈接:https://www.jianshu.com/p/07943cbf2ecf


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM