From 544148eddae96db824423cd059ebecb9d13c392e Mon Sep 17 00:00:00 2001 From: xusd <330628789@qq.com> Date: Thu, 19 Jun 2025 20:52:50 +0800 Subject: [PATCH] fix:市平台项目更新 --- src/components/MyPDF/index.jsx | 159 +++++++++++++++++++++++++++++++---------------------- 1 files changed, 93 insertions(+), 66 deletions(-) diff --git a/src/components/MyPDF/index.jsx b/src/components/MyPDF/index.jsx index 0c14318..72cf13e 100644 --- a/src/components/MyPDF/index.jsx +++ b/src/components/MyPDF/index.jsx @@ -5,17 +5,20 @@ import { CloseCircleFilled, DownloadOutlined } from '@ant-design/icons'; import { IconAttachment } from '@arco-design/web-react/icon'; import { Document, Page, pdfjs } from 'react-pdf'; +import * as docx from 'docx-preview'; import * as $$ from '@/utils/utility'; +import PreviewImage from '@/components/PreviewImage'; import './index.less'; // 设置pdf.js工作器路径 pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.min.js`; const appUrl = $$.appUrl; -const MyPDF = ({ name, fileUrl }) => { +const MyPDF = ({ name, fileUrl, fileType }) => { const [visible, setVisible] = useState(false); const [numPages, setNumPages] = useState(null); const [pageNumber, setPageNumber] = useState(1); + const containerRef = useRef(null); // 成功加载PDF文件时的回调 function onDocumentLoadSuccess({ numPages }) { @@ -36,77 +39,101 @@ } return ( - <div> - {fileUrl ? ( - <div - onClick={() => { - setVisible(true); - }} - className="pdf-title" - > - <IconAttachment style={{ color: '#1A6FB8' }} /> - <div className="pdf-name">{name}</div> - </div> + <> + {fileType === 'jpg' || fileType === 'png' ? ( + <PreviewImage name={name} src={fileUrl} /> ) : ( - '-' - )} - - <Modal - style={{ width: '80%' }} - closable={false} - title={name} - footer={ - <div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center', gap: '10px' }}> - <button - type="button" - disabled={pageNumber <= 1} - onClick={previousPage} - style={{ padding: '4px 15px', cursor: pageNumber <= 1 ? 'not-allowed' : 'pointer' }} - > - 上一页 - </button> - <p style={{ margin: 0 }}> - 第 {pageNumber} 页 / 共 {numPages || '--'} 页 - </p> - <button - type="button" - disabled={pageNumber >= numPages} - onClick={nextPage} - style={{ padding: '4px 15px', cursor: pageNumber >= numPages ? 'not-allowed' : 'pointer' }} - > - 下一页 - </button> - <Button - type="primary" - icon={<DownloadOutlined />} + <div> + {fileUrl ? ( + <div onClick={() => { - window.open(`${appUrl.fileUrl}${appUrl.fileDownUrl}${fileUrl.split('/').pop()}`); + setVisible(true); + if (fileType === 'docx' || fileType === 'doc') { + const renderDocx = async () => { + try { + const response = await fetch(`${appUrl.fileUrl}/${appUrl.sys}${fileUrl}`); + const blob = await response.blob(); + await docx.renderAsync(blob, containerRef.current); + } catch (error) { + console.error('文档加载失败', error); + } + }; + renderDocx(); + } }} - style={{ marginLeft: '10px' }} + className="pdf-title" > - 下载 - </Button> - </div> - } - centered - unmountOnExit={true} - visible={visible} - onCancel={() => { - setVisible(false); - }} - > - <div style={{ width: '100%', height: 'calc(100vh - 200px)', display: 'flex', justifyContent: 'center', overflow: 'auto' }}> - <Document - file={`${appUrl.fileUrl}/${appUrl.sys}${fileUrl}`} - onLoadSuccess={onDocumentLoadSuccess} - loading={<div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center', height: '100%' }}>PDF加载中...</div>} - error={<div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center', height: '100%' }}>PDF加载失败,请稍后重试</div>} + <IconAttachment style={{ color: '#1A6FB8' }} /> + <div className="pdf-name">{name}</div> + </div> + ) : ( + '-' + )} + + <Modal + style={{ width: '80%' }} + closable={false} + title={name} + footer={ + <div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center', gap: '10px' }}> + <button + type="button" + disabled={pageNumber <= 1} + onClick={previousPage} + style={{ padding: '4px 15px', cursor: pageNumber <= 1 ? 'not-allowed' : 'pointer' }} + > + 上一页 + </button> + <p style={{ margin: 0 }}> + 第 {pageNumber} 页 / 共 {numPages || '--'} 页 + </p> + <button + type="button" + disabled={pageNumber >= numPages} + onClick={nextPage} + style={{ padding: '4px 15px', cursor: pageNumber >= numPages ? 'not-allowed' : 'pointer' }} + > + 下一页 + </button> + <Button + type="primary" + icon={<DownloadOutlined />} + onClick={() => { + window.open(`${appUrl.fileUrl}${appUrl.fileDownUrl}${fileUrl.split('/').pop()}`); + }} + style={{ marginLeft: '10px' }} + > + 下载 + </Button> + </div> + } + centered + unmountOnExit={true} + visible={visible} + onCancel={() => { + setVisible(false); + }} > - <Page pageNumber={pageNumber} renderTextLayer={false} renderAnnotationLayer={false} scale={1.2} /> - </Document> + <div style={{ width: '100%', height: 'calc(100vh - 200px)', display: 'flex', justifyContent: 'center', overflow: 'auto' }}> + {fileType === 'pdf' && ( + <Document + file={`${appUrl.fileUrl}/${appUrl.sys}${fileUrl}`} + onLoadSuccess={onDocumentLoadSuccess} + loading={<div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center', height: '100%' }}>PDF加载中...</div>} + error={ + <div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center', height: '100%' }}>PDF加载失败,请稍后重试</div> + } + > + <Page pageNumber={pageNumber} renderTextLayer={false} renderAnnotationLayer={false} scale={1.2} /> + </Document> + )} + {fileType === 'docx' && <div ref={containerRef} className="docx-container" />} + {fileType === 'doc' && <div ref={containerRef} className="docx-container" />} + </div> + </Modal> </div> - </Modal> - </div> + )} + </> ); }; -- Gitblit v1.8.0