Commit 22f91f0c by weiw

fix:修改pdf的预览方式

parent 643d1d7d
// src/components/FilePreviewModal/PdfPreview.tsx // src/components/FilePreviewModal/PdfPreview.tsx
import React, { useState } from 'react' import React from 'react'
import { Document, Page, pdfjs } from 'react-pdf'
// 设置 PDF.js worker
pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.min.js`
interface PdfPreviewProps { interface PdfPreviewProps {
src: string src: string
...@@ -12,85 +8,31 @@ interface PdfPreviewProps { ...@@ -12,85 +8,31 @@ interface PdfPreviewProps {
onError?: (error: any) => void onError?: (error: any) => void
} }
export const PdfPreview: React.FC<PdfPreviewProps> = ({ src, className = '', onLoaded, onError }) => { export const PdfPreview: React.FC<PdfPreviewProps> = ({
const [numPages, setNumPages] = useState<number | null>(null) src,
const [pageNumber, setPageNumber] = useState<number>(1) className = '',
const [containerWidth, setContainerWidth] = useState<number>(800) onLoaded,
onError,
function onDocumentLoadSuccess({ numPages }: { numPages: number }) { }) => {
setNumPages(numPages) const handleLoad = () => {
setPageNumber(1)
onLoaded?.() onLoaded?.()
} }
function changePage(offset: number) { const handleError = (_e: React.SyntheticEvent) => {
setPageNumber(prevPageNumber => prevPageNumber + offset) onError?.(new Error('PDF加载失败'))
}
function previousPage() {
changePage(-1)
}
function nextPage() {
changePage(1)
} }
return ( return (
<div className={`${className} flex flex-col h-full`}> <div className={`${className} h-full flex flex-col`}>
<div className="flex-grow overflow-auto flex items-center justify-center bg-gray-50 p-2"> <div className="flex-grow overflow-hidden bg-gray-100">
<div <embed
className="w-full flex justify-center" src={src}
ref={(el) => { type="application/pdf"
if (el) { className="w-full h-full border-0"
setContainerWidth(el.clientWidth) onLoad={handleLoad}
} onError={handleError}
}} />
>
<Document
file={src}
onLoadSuccess={onDocumentLoadSuccess}
onLoadError={onError}
className="flex flex-col items-center"
>
<Page
pageNumber={pageNumber}
width={Math.min(containerWidth - 32, 800)} // 减去padding
className="shadow-md"
/>
</Document>
</div>
</div> </div>
{numPages !== null && numPages > 1 && (
<div className="pdf-navigation flex justify-center items-center py-3 bg-white border-t">
<button
type="button" // 添加 type 属性
onClick={previousPage}
disabled={pageNumber <= 1}
className="px-3 py-1 mx-1 bg-gray-200 rounded disabled:opacity-50 text-sm"
>
上一页
</button>
<span className="mx-3 text-sm">
{' '}
{pageNumber}
{' '}
页,共
{' '}
{numPages}
{' '}
</span>
<button
type="button" // 添加 type 属性
onClick={nextPage}
disabled={pageNumber >= numPages}
className="px-3 py-1 mx-1 bg-gray-200 rounded disabled:opacity-50 text-sm"
>
下一页
</button>
</div>
)}
</div> </div>
) )
} }
...@@ -20,17 +20,22 @@ export const FilePreviewModal: React.FC<FilePreviewModalProps> = ({ isOpen, onCl ...@@ -20,17 +20,22 @@ export const FilePreviewModal: React.FC<FilePreviewModalProps> = ({ isOpen, onCl
useEffect(() => { useEffect(() => {
if (doc?.documentAlias) { if (doc?.documentAlias) {
const name = doc.documentAlias.toLowerCase() const name = doc.documentAlias.toLowerCase()
if (name.endsWith('.docx')) // 添加更严格的文件类型判断
setFileType('docx') if (name.endsWith('.pdf')) {
else if (name.endsWith('.doc')) setFileType('pdf')
setFileType('doc') }
else if (name.endsWith('.xlsx')) else if (name.endsWith('.docx')) {
setFileType('xlsx') setFileType('docx')
else if (name.endsWith('.xls')) }
setFileType('xls') else if (name.endsWith('.doc')) {
else if (name.endsWith('.pdf')) setFileType('doc')
setFileType('pdf') }
else setFileType('') else if (name.endsWith('.xlsx') || name.endsWith('.xls')) {
setFileType('xlsx')
}
else {
setFileType('')
}
} }
}, [doc]) }, [doc])
...@@ -169,8 +174,7 @@ setFileType('pdf') ...@@ -169,8 +174,7 @@ setFileType('pdf')
)} )}
{renderPreview()} {renderPreview()}
</ModalBody> </ModalBody>
<ModalFooter className="flex justify-end gap-2"> <ModalFooter className="flex justify-end gap-2"></ModalFooter>
</ModalFooter>
</ModalContent> </ModalContent>
</Modal> </Modal>
) )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment