前端 JavaScript js PDF转img PDF转base64 PDF转图片

需求是将前端加载的PDF转化到base64上传服务器

<html>
<head>
</head>
<body>
</body>
<!--<script src="https://cdn.bootcdn.net/ajax/libs/pdf.js/2.5.207/pdf.min.js"></script>-->
<!--<script src="https://cdn.bootcdn.net/ajax/libs/pdf.js/2.5.207/pdf.worker.min.js"></script>-->
<script src="https://cdn.jsdelivr.net/npm/pdfjs-dist@2.0.943/build/pdf.min.js"></script>
<script type="text/javascript">

    pdfjsLib.getDocument("./2a.pdf").then((pdf) => {
        const numPages = pdf.numPages;
        const allPromise = [];
        for (let i = 1; i <= numPages; i++) {
            allPromise.push(pdf.getPage(i))
        }
        return Promise.all(allPromise)
    }).then((allPDF) => {
        return renderPDFS(allPDF)
    }).then(allRender => {
        console.log(allRender)
        const allCanvasOKPromises = allRender.map(render => render.renderPromise);
        const allCanvas = allRender.map(render => render.canvas);
        return Promise.all(allCanvasOKPromises).then(val => {
            return allCanvas.map(canvas => {
                return canvas.toDataURL();
            })
        })
    }).then(allBase64 => {
        allBase64.forEach(base64 => {
            const image = new Image();
            image.src = base64;
            document.body.appendChild(image);
        })
    })

    function renderPDFS(allPDF) {
        return allPDF.map(eachPDF => {
            return renderPDF2Canvas(eachPDF)
        })
    }

    function renderPDF2Canvas(eachPDF) {
        const viewport = eachPDF.getViewport(2);
        const canvas = document.createElement("canvas");
        const context = canvas.getContext('2d');
        canvas.height = viewport.height;
        canvas.width = viewport.width;
        const renderPromise = eachPDF.render({canvasContext: context, viewport: viewport})
        return {canvas, renderPromise}
    }
</script>

</html>

太久了已经忘记怎么写,下面是vue的参考代码

function renderPDF2Canvas(eachPDF) {
    const viewport = eachPDF.getViewport(2);
    const canvas = document.createElement("canvas");
    const context = canvas.getContext('2d');
    canvas.height = viewport.height;
    canvas.width = viewport.width;
    const renderPromise = eachPDF.render({canvasContext: context, viewport: viewport})
    return {canvas, renderPromise}
}

function renderPDFS(allPDF) {
    return allPDF.map(eachPDF => {
        return renderPDF2Canvas(eachPDF)
    })
}


export function pdf2img(pdfFile) {
    // eslint-disable-next-line
    return pdfjsLib.getDocument(pdfFile).then((pdf) => {
        const numPages = pdf.numPages;
        const allPromise = [];
        for (let i = 1; i <= numPages; i++) {
            allPromise.push(pdf.getPage(i))
        }
        return Promise.all(allPromise)
    }).then((allPDF) => {
        return renderPDFS(allPDF)
    }).then(allRender => {
        console.log(allRender)
        const allCanvasOKPromises = allRender.map(render => render.renderPromise);
        const allCanvas = allRender.map(render => render.canvas);
        return Promise.all(allCanvasOKPromises).then(() => {
            return allCanvas.map(canvas => {
                return canvas.toDataURL();
            })
        })
    }).then(allBase64 => {
        // console.log(allBase64)
        return allBase64
    })
}

本地调用:
    handleFiles1: function (filePDF, fileList) {
      console.log(filePDF)
      this.companyName = filePDF.name.split(".")[0];
      const reader = new FileReader();
      reader.readAsArrayBuffer(filePDF.raw);
      reader.onload = (e) => {
        const myData = new Uint8Array(e.target.result)
        const docInitParams = {data: myData};
        pdf2img(docInitParams).then(allImages => {
          this.sourceImages = allImages
          this.showUpload1 = false;
          this.$nextTick(() => {
            this.judgeLoadTwoPDF();
          })
        })
      }
    },

       <el-upload
             accept="application/pdf"
             class="upload-demo"
             drag
             action=""
             :auto-upload="false"
             :show-file-list="false"
             :on-change="handleFiles1"
         >
           <i class="el-icon-upload"></i>
           <div class="el-upload__text">将原文件拖到此处,或<em>点击加载</em></div>
           <div class="el-upload__tip" slot="tip">只能上传pdf文件</div>
         </el-upload>
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值