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

被折叠的 条评论
为什么被折叠?



