在react中预览pdf文件插件之react-pdf(react-pdf)
相信大家都知道pdf,那么我们怎么能在浏览器中直接预览pdf格式的文件呢?
react-pdf
插件git地址:https://github.com/intelllex/react-pdf?tab=readme-ov-file,详细的安装请参考。
但是作者本人并不是用的这个
而且另外一个
https://www.npmjs.com/package/react-pdf。
话不多说:直接上代码。
import React, { useRef, useState } from 'react';
import PropTypes from 'prop-types';
import { Document, Page } from 'react-pdf/dist/esm/entry.webpack';
import { InputNumber, Space, Spin, Tooltip } from 'antd';
import { LeftOutlined, RightOutlined, ZoomInOutlined, ZoomOutOutlined } from '@ant-design/icons';
import './index.less';
const prefixCls = 'xt-knowledge-upload-file-preview-pdf';
const FilePreviewPdf = props => {
const { fileInfo } = props;
const [pageCurrent, setPageCurrent] = useState(1);
const pageCurrentRef = useRef(pageCurrent);
const [pageWidth, setPageWidth] = useState(760);
const pageWidthRef = useRef(pageWidth);
const [pageTotal, setPageTotal] = useState(1);
const pageTotalRef = useRef(pageTotal);
const onDocumentLoadSuccess = args => {
setPageTotal(args.numPages);
pageTotalRef.current = args.numPages;
};
const prevPage = () => {
if (pageCurrentRef.current === 1) {
return false;
}
setPageCurrent(pageCurrentRef.current - 1);
pageCurrentRef.current = pageCurrentRef.current - 1;
};
const nextPage = () => {
if (pageCurrentRef.current === pageTotalRef.current) {
return;
}
setPageCurrent(pageCurrentRef.current + 1);
pageCurrentRef.current = pageCurrentRef.current + 1;
};
const pageNumChange = e => {
setPageCurrent(e);
pageCurrentRef.current = e;
};
const toPage = e => {
const value = Number(e.target.value);
let valueCopy = value;
if (value <= 0) {
valueCopy = 1;
} else if (value >= pageTotalRef.current) {
valueCopy = pageTotalRef.current;
} else {
valueCopy = value;
}
setPageCurrent(valueCopy);
pageCurrentRef.current = valueCopy;
};
const pageZoomOut = () => {
if (pageWidthRef.current <= 560) {
return false;
}
const pageWidth = pageWidthRef.current * 0.8;
setPageWidth(pageWidth);
pageWidthRef.current = pageWidth;
};
const pageZoomIn = () => {
const pageWidth = pageWidthRef.current * 1.2;
setPageWidth(pageWidth);
pageWidthRef.current = pageWidth;
};
return (
<div className={`${prefixCls}`}>
<div className={`${prefixCls}-pageContainer`}>
<Document file={fileInfo?.pdfUrl} onLoadSuccess={onDocumentLoadSuccess} loading={<Spin size='large' />}>
<Page pageNumber={pageCurrent} width={pageWidth} loading={<Spin size='large' />} />
</Document>
</div>
<div className={`${prefixCls}-pageTool`}>
<Space>
<Tooltip title={pageCurrent === 1 ? '已是第一页' : '上一页'}>
<LeftOutlined onClick={prevPage} />
</Tooltip>
<InputNumber
type='number'
value={pageCurrent}
onChange={pageNumChange}
onPressEnter={toPage}
min='1'
max={pageTotal}
/>{' '}
/ {pageTotal}
<Tooltip title={pageCurrent === pageTotal ? '已是最后一页' : '下一页'}>
<RightOutlined onClick={nextPage} />
</Tooltip>
<Tooltip title='放大'>
<ZoomInOutlined onClick={pageZoomIn} />
</Tooltip>
<Tooltip title='缩小'>
<ZoomOutOutlined onClick={pageZoomOut} />
</Tooltip>
</Space>
</div>
</div>
);
};
FilePreviewPdf.propTypes = {
fileInfo: PropTypes.object,
};
export default FilePreviewPdf;
我这里是链接地址,返回的是pdf流,直接放在插件上就能预览了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了