PDFJS实现PDF转图片

该篇文章介绍了一种利用JavaScript库PDF.js将PDF文档转换为canvas图片的方法,涉及引入库文件、创建DOM元素、渲染PDF页面到canvas并最终转换为base64图片的步骤。此过程解决了在浏览器端处理PDF并显示汉字的问题。
摘要由CSDN通过智能技术生成

JavaScript本身不支持PDF转换为图片的功能。但可以使用PDF.js库来将PDF转换为canvas图片,此篇记录一种写法

pdf.js官网

示例(基于jquery,vue)
1.引入js库
引入压缩包build文件夹下pdf.js和pdf.worker.js,以及web文件夹下cmaps文件夹

<script src="../../js/plugin/pdfjs-3.6.172/pdf.js"></script>
<script src="../../js/plugin/pdfjs-3.6.172/pdf.worker.js"></script>

2.创建dom用于渲染

<img :src="imageUrl" class="w-full mb-1" alt="">
<canvas id="the-canvas" style="display: none"></canvas>

3.js方法

/**
 * @param {String} url 文件路径
 * */
previewPdf(url) {
    if (url) {
        let _this = this;
        let imgArr = [];
        pdfjsLib.workerSrc = 'pdf.worker.js';
        let loadingTask = pdfjsLib.getDocument({
            scale: 1,
            url: url,
            cMapUrl: '../../js/plugin/pdfjs-3.6.172/cmaps/', // 解决图片没有汉字的问题
            cMapPacked: true // 解决图片没有汉字的问题
        })
 
        loadingTask.promise.then((pdf) => {
            console.log('PDF loaded');
            let pageNum = pdf.numPages;
            for (let i=1; i<=pageNum; i++) {
                pdf.getPage(i).then(function(page) {
                    console.log('Page loaded');
 
                    let viewport = page.getViewport({
                        scale: 1
                    });
 
                    let canvas = document.createElement("canvas");
                    let context = canvas.getContext('2d');
                    canvas.height = viewport.height;
                    canvas.width = viewport.width;
 
                    let renderContext = {
                        canvasContext: context,
                        viewport: viewport
                    };
                    let renderTask = page.render(renderContext);
                    renderTask.promise.then(function () {
                        console.log('Page rendered');
                        let imgUrl = canvas.toDataURL('image/jpeg'); //转换为base64
                        if (imgUrl) {
                            imgArr[i-1] = imgUrl;
                        }
                        //pdf全部画完结束后操作
                        if (imgArr.length===pageNum&&!isEmpty(imgArr)) {
                            let canvas2 = document.getElementById('the-canvas');
                            let context2 = canvas2.getContext('2d');
                            canvas2.height = viewport.height*pageNum;
                            canvas2.width = viewport.width;
                            let count = 0;
                            for (let j=0; j<imgArr.length; j++) {
                                let IMG = new Image();
                                IMG.src=imgArr[j];
                                IMG.width = viewport.width;
                                IMG.height = viewport.height;
                                IMG.onload = function () {
                                    context2.drawImage(IMG,0,viewport.height*j);
                                    count++;//确保所有img渲染结束后操作
                                    if (count===pageNum) {
                                        this.showCheckPdf = true
                                        let canvas = document.getElementById('the-canvas');
                                        //赋值给img
                                        _this.imgUrl = canvas.toDataURL('image/jpeg')
                                    }
                                }
                            }
                        }
                    });
                });
            }
        }, (reason) => {
            console.error(reason);
        });
 
        function isEmpty(arr) {
            for(let i=0;i<arr.length;i++) {
                if(!arr[i])
                    return true;
            }
            return false;
        }
    }
}

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,微信小程序官方并没有提供直接将pdf图片的API。但是我们可以使用第三方库来实现这个功能。以下是一种实现方式: 1.首先需要在小程序中引入pdf.js库,该库可以将pdf文件渲染为canvas。 2.然后使用canvas2image库将canvas图片。 下面是示例代码: ```javascript // 引入pdf.js库 import pdfjsLib from 'pdfjs-dist/webpack'; // 引入canvas2image库 import { saveAs } from 'file-saver'; import { fabric } from 'fabric'; // 将pdf文件渲染为canvas pdfjsLib.getDocument('example.pdf').promise.then(function(pdf) { pdf.getPage(1).then(function(page) { var scale = 1.5; var viewport = page.getViewport({ scale: scale }); // Prepare canvas using PDF page dimensions var canvas = document.getElementById('pdf-canvas'); var context = canvas.getContext('2d'); canvas.height = viewport.height; canvas.width = viewport.width; // Render PDF page into canvas context var renderContext = { canvasContext: context, viewport: viewport }; page.render(renderContext).promise.then(function() { // 将canvas图片 var imgData = canvas.toDataURL('image/jpeg', 1.0); var img = new Image(); img.src = imgData; img.onload = function() { var fCanvas = new fabric.Canvas('fabric-canvas'); var fImg = new fabric.Image(img, { left: 0, top: 0, angle: 0, opacity: 1 }); fCanvas.add(fImg); fCanvas.renderAll(); fCanvas.setWidth(img.width); fCanvas.setHeight(img.height); fCanvas.calcOffset(); fCanvas.renderAll(); fCanvas.deactivateAll().renderAll(); fCanvas.renderAll(); fCanvas.getElement().toBlob(function(blob) { saveAs(blob, 'example.jpg'); }); }; }); }); }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值