pdf预览组件react-pdf,pdfjs-dist

2024-04-04 05:04

本文主要是介绍pdf预览组件react-pdf,pdfjs-dist,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

   "react": "^17.0.2" 

1.react去预览pdf文件,并且这个组件可以在移动端展示,但要注意安装版本

 "react-pdf": "^5.7.2"

直接上代码了,做了一个两页的分页,因为放在移动端有个问题,有个文件全部加载手机就卡死了,但这个分页也没解决问题,换了个文件就是好的,代码能优化的地方比较多,自行优化:

import React, { useState, useEffect, useCallback } from 'react';
import { Page, pdfjs } from "react-pdf";
import { Document } from 'react-pdf/dist/esm/entry.webpack';pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.js`;const PdfViewer = ({ file }: any) => {const [page_jsx, set_page_jsx]: [any[], React.Dispatch<React.SetStateAction<any[]>>] = useState<any[]>([]);const [totalPages, setTotalPages]: [number, React.Dispatch<React.SetStateAction<number>>] = useState(0);const [end_num, set_end_num]: [any, React.Dispatch<React.SetStateAction<any>>] = useState(6);const viewMore = useCallback(() => {let current_end_num = end_num + 5 <= totalPages ? end_num + 5: totalPages;set_end_num(current_end_num);const array = [];for (let i = current_end_num - 6; i < current_end_num; i++) {array.push(i);}let pageJsx = array?.map((a: any) => <Page scale={.5} key={`page_${a}`} pageNumber={a + 1}/>);set_page_jsx((jsx_arr: any[]) => [...jsx_arr, ...pageJsx]);}, [end_num, totalPages, set_end_num, set_page_jsx])useEffect(() => {const array = [];if (end_num === 6) {for (let i = totalPages < 6 ? 0: end_num - 6; i < (totalPages < 6 ? totalPages: end_num); i++) {array.push(i);}let pageJsx = array?.map((a: any) => <Page scale={.5} key={`page_${a}`} pageNumber={a + 1}/>);set_page_jsx((jsx_arr: any[]) => [...jsx_arr, ...pageJsx]);}}, [end_num, set_page_jsx, totalPages])return (<div style={{ width: '100%', height: '100vh', overflow: 'auto' }}><DocumentclassName={"pdf-content"}file={file}onLoadSuccess={({ numPages }: any) => setTotalPages(numPages)}>{page_jsx?.map((page: any) => page)}{totalPages > end_num && <div style={{height: '40px', lineHeight: '40px', textAlign: 'center'}} onClick={() => viewMore()}>View more</div>}</Document></div>);
};export default PdfViewer;

2.   pdfjs-dist

"pdfjs-dist": "^2.5.207",这个插件的版本尤其要记录下,网上查了好多,只把代码放上去,如果版本不对,引入文件路径是不存在的,那么还是直接放代码吧,如第一种方法自行优化下:

import React, { useCallback, useEffect, useRef, useState } from 'react';
const pdfjsLib = require('pdfjs-dist/es5/build/pdf.js');pdfjsLib.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjsLib.version}/pdf.worker.js`;const PdfViewer = ({ file }: any) => {const [totalPages, setTotalPages]: [number, React.Dispatch<React.SetStateAction<number>>] = useState(0);const [end_num, set_end_num]: [any, React.Dispatch<React.SetStateAction<any>>] = useState(6);const canvasRefs: any = useRef([]);const pageNums: any = useRef([]);const renderPage = useCallback(async (pdf: any, endNum: any) => {pageNums.current = new Array(endNum)?.fill(0).map((_, i) => i + 1);// 渲染每一页for (let i = totalPages < 6 ? 1: endNum - 5; i <= (totalPages < 6 ? totalPages: endNum); i++) {const page = await pdf.getPage(i);const viewport = page.getViewport({ scale: 1.5 });// 创建canvas元素const canvas = document.createElement('canvas');const context = canvas.getContext('2d');canvas.height = viewport.height;canvas.width = viewport.width;// 将canvas添加到DOM中const canvasContainer: any = document.getElementById('pdf-container');canvasContainer.appendChild(canvas);// 存储canvas的引用以便后续操作canvasRefs.current[i - 1] = canvas;// 渲染页面const renderContext = {canvasContext: context,viewport: viewport};await page.render(renderContext);}}, [totalPages])useEffect(() => {async function loadPdf() {const loadingTask = pdfjsLib.getDocument(file);const pdf: any = await loadingTask.promise;// 获取总页数const numPages: any = pdf.numPages;setTotalPages(numPages);renderPage(pdf, end_num);}if (file && end_num === 6) {loadPdf();}}, [file, end_num, renderPage])return (<><div id="pdf-container">{/* 在这里,canvas元素将被动态添加到这个容器中 */}</div>{totalPages > end_num && <div onClick={async () => {if (end_num < totalPages) {let current_end_num = end_num + 5 <= totalPages ? end_num + 5: totalPages;set_end_num(current_end_num);const loadingTask = pdfjsLib.getDocument(file);const pdf: any = await loadingTask.promise;renderPage(pdf, current_end_num);}}} style={{height: '40px', lineHeight: '40px', textAlign: 'center'}}>View more</div>}</>);
};export default PdfViewer;

这篇关于pdf预览组件react-pdf,pdfjs-dist的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/874857

相关文章

前端如何通过nginx访问本地端口

《前端如何通过nginx访问本地端口》:本文主要介绍前端如何通过nginx访问本地端口的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、nginx安装1、下载(1)下载地址(2)系统选择(3)版本选择2、安装部署(1)解压(2)配置文件修改(3)启动(4)

HTML中meta标签的常见使用案例(示例详解)

《HTML中meta标签的常见使用案例(示例详解)》HTMLmeta标签用于提供文档元数据,涵盖字符编码、SEO优化、社交媒体集成、移动设备适配、浏览器控制及安全隐私设置,优化页面显示与搜索引擎索引... 目录html中meta标签的常见使用案例一、基础功能二、搜索引擎优化(seo)三、社交媒体集成四、移动

HTML input 标签示例详解

《HTMLinput标签示例详解》input标签主要用于接收用户的输入,随type属性值的不同,变换其具体功能,本文通过实例图文并茂的形式给大家介绍HTMLinput标签,感兴趣的朋友一... 目录通用属性输入框单行文本输入框 text密码输入框 password数字输入框 number电子邮件输入编程框

HTML img标签和超链接标签详细介绍

《HTMLimg标签和超链接标签详细介绍》:本文主要介绍了HTML中img标签的使用,包括src属性(指定图片路径)、相对/绝对路径区别、alt替代文本、title提示、宽高控制及边框设置等,详细内容请阅读本文,希望能对你有所帮助... 目录img 标签src 属性alt 属性title 属性width/h

CSS3打造的现代交互式登录界面详细实现过程

《CSS3打造的现代交互式登录界面详细实现过程》本文介绍CSS3和jQuery在登录界面设计中的应用,涵盖动画、选择器、自定义字体及盒模型技术,提升界面美观与交互性,同时优化性能和可访问性,感兴趣的朋... 目录1. css3用户登录界面设计概述1.1 用户界面设计的重要性1.2 CSS3的新特性与优势1.

HTML5 中的<button>标签用法和特征

《HTML5中的<button>标签用法和特征》在HTML5中,button标签用于定义一个可点击的按钮,它是创建交互式网页的重要元素之一,本文将深入解析HTML5中的button标签,详细介绍其属... 目录引言<button> 标签的基本用法<button> 标签的属性typevaluedisabled

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

CSS place-items: center解析与用法详解

《CSSplace-items:center解析与用法详解》place-items:center;是一个强大的CSS简写属性,用于同时控制网格(Grid)和弹性盒(Flexbox)... place-items: center; 是一个强大的 css 简写属性,用于同时控制 网格(Grid) 和 弹性盒(F