当前位置: 首页 > news >正文

pc端pdf预览

react语法

import React, { useState } from 'react'
import { Modal, Spin, Alert } from 'antd'
import { Document, Page, pdfjs } from 'react-pdf'
import 'react-pdf/dist/esm/Page/AnnotationLayer.css'
import 'react-pdf/dist/esm/Page/TextLayer.css';// 配置 PDF.js 的 worker 文件
pdfjs.GlobalWorkerOptions.workerSrc = new URL('pdfjs-dist/build/pdf.worker.min.js', import.meta.url).toString()interface PDFPreviewModalProps {fileName: string | nullfileUrl: string | null // 传入的 PDF 文件地址onCancel: () => void // 关闭弹框的回调
}const PDFPreviewModal: React.FC<PDFPreviewModalProps> = ({ fileName, fileUrl, onCancel }) => {const [numPages, setNumPages] = useState<number | null>(null)const [pdfWidth, setPdfWidth] = useState<number>(600) // 默认宽度为 600pxconst [loading, setLoading] = useState<boolean>(true) // 控制加载状态const [error, setError] = useState<boolean>(false) // 控制加载错误状态// 当 PDF 加载成功时,设置页面数量const onDocumentLoadSuccess = ({ numPages }: { numPages: number }) => {setNumPages(numPages)setLoading(false) // 加载成功后,隐藏 loading}// 加载失败时,设置错误状态const onDocumentLoadError = () => {setLoading(false)setError(true) // 出错时显示错误提示}// 获取 PDF 页面加载后的宽度const onPageLoadSuccess = ({ width }: { width: number }) => {setPdfWidth(width)}return (<Modaltitle={`${fileName}】预览`}openonCancel={onCancel}footer={null}width={pdfWidth + 100}style={{ top: 20 }}>{error ? (<Alert message="加载 PDF 文件失败" type="error" showIcon />) : (<>{loading && (<div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center', height: '80vh' }}><Spin size="large" /></div>)}{fileUrl && (<><div style={{ height: '88vh', overflowY: 'auto', padding: '24px' }}><Document//file={new URL('/public/temp/DXF文件要求.pdf',import.meta.url).toString()}file={fileUrl}onLoadSuccess={onDocumentLoadSuccess}onLoadError={onDocumentLoadError}>{Array.from(new Array(numPages), (el, index) => (<Page key={`page_${index + 1}`} pageNumber={index + 1} onLoadSuccess={onPageLoadSuccess} />))}</Document></div></>)}</>)}</Modal>)
}export default PDFPreviewModal
http://www.dtcms.com/a/461030.html

相关文章:

  • 网站建设衤金手指花总十五wordpress电商主题数据
  • 【STM32项目开源】基于STM32的智能天然气火灾监控
  • Git 补丁完整指南:创建、发送和应用补丁详解
  • python中f-string详解
  • C++网络编程(十三)epoll如何设置边缘模式
  • 一流的高端企业网站网站建设与维护是什么意思
  • 上海做响应式网站的公司做后台系统的网站
  • 服务端与客户端的简单链接
  • Ubuntu24.04系统安装图形化桌面并使用xrdp远程桌面
  • 无人机通信链路技术要点与难点
  • 计算机二级45天通关秘籍:高效备考策略与编程语言选择指南​
  • 测试基础01
  • 东莞住建局官网网站宁波网站建站
  • 网上的彩票网站是怎么做的网站建设基本问题
  • 微信小程序执行onPullDownRefresh 之后 下拉刷新后刷新标志不消失
  • 如何在网站后台备份数据库表台州智能模板建站
  • 寻梦数据空间 | 起源篇:从数据孤岛到互联新范式的战略演进
  • Bug、Bag、Buff 到底是什么意思?一篇看懂程序员的游戏黑话
  • 攻防世界-Web-easyphp
  • js移动端开发面试题
  • LoRaWAN NS 对比分析
  • php网站开发项目实战周易起名网唯一官网免费
  • PyCharm入门级详细使用手册(Python新手快速上手篇)
  • 建一个网站大约花多少钱一键生成app制作器
  • Qt C++ :XML文件处理工具 <QXml>模块
  • 门诊场景评测深度分析报告:医生-病人-测量代理交互对诊断影响机制研究(上)
  • 海康威视 2DC 系列球机手机直连实用教程
  • MyBatis Mapper XML 核心详解
  • 加强局网站建设网站建设域名多少钱
  • 记录最新 Neo4j 安装过程(截图实操)、使用、踩坑 Neo4j 5.26.13、JDK 17安装