1.安装 pdfjs-dist
npm i pdfjs-dist --save
2.项目中引用
import PDFJS from 'pdfjs-dist'
import workerSrc from 'pdfjs-dist/build/pdf.worker.entry';
import React, { useEffect, useState } from 'react';
import { Modal, Slider, InputNumber, Row, Col } from 'antd';
import PDFJS from 'pdfjs-dist'
import workerSrc from 'pdfjs-dist/build/pdf.worker.entry';
import styles from './style.less';
PDFJS.workerSrc = workerSrc;
const PdfModal = ({ visible, onCancel, initData }) => {
const [pages, setPages] = useState([]);
const [zoomValue, setZoomValue] = useState(60)
useEffect(() => {
if (initData) {
PDFJS.getDocument(initData.url).promise.
then(async (pdf) => {
for (let i = 1; i <= pdf.numPages; i++) {
setPages((newData) => {
return newData.concat(i)
})
pdf.getPage(i).then((page) => {
const canvas = document.getElementById(`PdfCanvas${i}`)
const viewport = page.getViewport({ scale: 1 });
const ctx = canvas.getContext('2d')
canvas.height = viewport.height
canvas.width = viewport.width
const renderContext = {
canvasContext: ctx,
viewport
}
page.render(renderContext)
})
}
},
(reason) => {
console.error(reason)
}
);
}
}, [initData])
const onZoomChange = value => {
setZoomValue(value)
}
return (
<>
<Modal title={initData ? initData.title : 'Pdf查看'}
visible={visible}
centered
forceRender
bodyStyle={{ padding: 0, backgroundColor: '#c3c3c3' }}
footer={<div className={styles.modalFooter}>
<Row>
<Col span={16}>
<Slider
min={1}
max={120}
onChange={onZoomChange}
value={typeof zoomValue === 'number' ? zoomValue : 60}
/>
</Col>
<Col span={8}>
<InputNumber
min={1}
max={120}
bordered={false}
formatter={value => `${value}%`}
parser={value => value.replace('%', '')}
style={{ margin: '0 16px' }}
value={zoomValue}
onChange={onZoomChange}
/>
</Col>
</Row>
</div>}
width='80%'
onCancel={onCancel}>
<div className={styles.pdfViewer}>
{pages.map(
(res, index) =>
<canvas key={res} id={`PdfCanvas${index + 1}`} style={{ width: `${zoomValue}%` }} className={styles.myCanvas} />
)
}
</div>
</Modal>
</>
);
};
export default PdfModal
3.效果