import { Button, message, Modal, Spin } from "antd"; import { useState } from "react"; import { Document, Page, pdfjs } from "react-pdf"; import { getFileUrl } from "../../utils/index"; /** * PDF查看组件 */ function Pdf(props) { const { visible = false, onCancel, file, inline = false, style = {}, } = props; const fileUrl = getFileUrl(); const [numPages, setNumPages] = useState(0); const [pdfWidth, setPdfWidth] = useState(600); const [loading, setLoading] = useState(true); pdfjs.GlobalWorkerOptions.workerSrc = new URL( "pdfjs-dist/build/pdf.worker.min.mjs", import.meta.url, ).toString(); const onDocumentLoadSuccess = ({ numPages }) => { setNumPages(numPages); setLoading(false); }; const onDocumentLoadError = () => { setLoading(false); message.error("加载 PDF 文件失败"); if (onCancel) onCancel(); }; const onPageLoadSuccess = ({ width }) => { setPdfWidth(width); }; // 内联模式的PDF内容 const renderPdfContent = () => ( <> {loading && (
)}
{ Array.from({ length: numPages }).map((el, index) => ( )) }
); // 如果是内联模式,直接返回PDF内容 if (inline) { return renderPdfContent(); } // 默认弹窗模式 return ( 关闭} > {renderPdfContent()} ); } export default Pdf;