React PDF转为图片显示

本文介绍了如何在React应用中利用pdfjs-dist库将PDF转换为图片。内容包括引入pdfjs库,实现拖拽上传,自定义上传方法生成canvas,解决在canvas中显示图片的问题,以及遇到的字体缺失等坑。

React PDF转为图片显示

使用pdfjs-dist解析pdf,配合antd上传pdf,并转化为png格式图片。

引入pdfjs-dist

import * as PDFJS from 'pdfjs-dist';
import pdfjsWorker from 'pdfjs-dist/build/pdf.worker.entry';
PDFJS.GlobalWorkerOptions.workerSrc = pdfjsWorker;

拖拽上传

    return <div>
        <Dragger  id="upload" beforeUpload={file => {
            customUpload(file);
            return false
        }}>
            <p className="ant-upload-text">点击或将文件拖拽到这里上传</p>
            <p className="ant-upload-hint">支持扩展名:.pdf</p>
        </Dragger>
        <div id='pdf-container' ></div>
    </div>

自定义上传方法并生成canvas

    const customUpload = (file) => {
        const reader = new FileReader();
        reader.readAsArrayBuffer(file);
        reader.onload = (e) => {
            const typearray = new Uint8Array(e.target.result);
            const loadingTask = PDFJS.getDocument(typearray);
            loadingTask.promise.then((pdf) => {
                if(pdf){
                    const pageNumber = pdf.numPages;
                    for(let i=1;i<=pageNumber;i++){
                        const canvas = document.createElement('canvas');
                        canvas.id = 'pageNum' + i;
                        document.getElementById('pdf-container').append(canvas);
                        const context = canvas.getContext('2d');
                        openPage(pdf,i,context)
                    }
                }
            })
        }
    }

在canvas中展示图片

    const openPage = (pdfFile,pageNumber,context) => {
        pdfFile.getPage(pageNumber).then((page) => {
            const viewport = page.getViewport(2);
            const canvas = context.canvas;
            canvas.width = viewport.width;
            canvas.height = viewport.height;
            canvas.style.width = '100%';
            canvas.style.height = '100%';
            const renderContext = {
                canvasContext:context,
                viewport,
            }
            page.render(renderContext).then(() => {
                const dom = document.getElementById('pdf-container');
                dom.children.forEach((value,index) => {
                    const canvas = document.getElementById('pageNum'+(index+1));
                    const base64ImgUrl = canvas.toDataURL('image/png');
                })
            })
        })
    }

踩得那些坑

引入pdfjs-dist报错

解决办法:pdfjs-dist版本太高无法支持,降为2.2.228版本即可;

内容空白不展示

原因:pdfjs缺少字体。
解决办法:在node_modules/pdfjs-dist/build/pdf.js增加字体配置,大概9960行。

  params.cMapPacked = true
  params.cMapUrl = 'https://cdn.jsdelivr.net/npm/pdfjs-dist@2.2.228/cmaps/'

在这里插入图片描述

完整代码

import React from "react";
import * as PDFJS from 'pdfjs-dist';
import pdfjsWorker from 'pdfjs-dist/build/pdf.worker.entry';
import { Upload } from 'antd'
PDFJS.GlobalWorkerOptions.workerSrc = pdfjsWorker;
const PDF2image = () => {

    const {Dragger} = Upload;

    const openPage = (pdfFile,pageNumber,context) => {
        pdfFile.getPage(pageNumber).then((page) => {
            const viewport = page.getViewport(2);
            const canvas = context.canvas;
            canvas.width = viewport.width;
            canvas.height = viewport.height;
            canvas.style.width = '100%';
            canvas.style.height = '100%';
            const renderContext = {
                canvasContext:context,
                viewport,
            }
            page.render(renderContext).then(() => {
                const dom = document.getElementById('pdf-container');
                dom.children.forEach((value,index) => {
                    const canvas = document.getElementById('pageNum'+(index+1));
                    const base64ImgUrl = canvas.toDataURL('image/png');
                })
            })
        })
    }

    const customUpload = (file) => {
        const reader = new FileReader();
        reader.readAsArrayBuffer(file);
        reader.onload = (e) => {
            const typearray = new Uint8Array(e.target.result);
            const loadingTask = PDFJS.getDocument(typearray);
            loadingTask.promise.then((pdf) => {
                if(pdf){
                    const pageNumber = pdf.numPages;
                    for(let i=1;i<=pageNumber;i++){
                        const canvas = document.createElement('canvas');
                        canvas.id = 'pageNum' + i;
                        document.getElementById('pdf-container').append(canvas);
                        const context = canvas.getContext('2d');
                        openPage(pdf,i,context)
                    }
                }
            })
        }
    }

    return <div>
        <Dragger  id="upload" beforeUpload={file => {
            customUpload(file);
            return false
        }}>
            <p className="ant-upload-text">点击或将文件拖拽到这里上传</p>
            <p className="ant-upload-hint">支持扩展名:.pdf</p>
        </Dragger>
        <div id='pdf-container' ></div>
    </div>
}

export default PDF2image;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值