【react-pdf】实现在线pdf加载——翻页加载和下拉滚动加载

react-pdf插件地址

目录

一、安装插件

bash 复制代码
$ npm install react-pdf 
# or
$ yarn add react-pdf

二、组件引用

bash 复制代码
import { Document, Page } from "react-pdf";

三、简单使用

file可以是 URL、base64 内容、Uint8Array 等;

bash 复制代码
import { useState } from "react";
import { Document, Page } from "react-pdf";
import pdfFile from '../../../assets/探索自然之美_20250107105901.pdf'

const PdfOperate = () => {
  const [numPages, setNumPages] = useState<number>();
  const [pageNumber] = useState<number>(1);

  function onDocumentLoadSuccess({ numPages }: { numPages: number }): void {
    setNumPages(numPages);
  }

  return (
    <div>
      <Document file={pdfFile} onLoadSuccess={onDocumentLoadSuccess}>
        <Page pageNumber={pageNumber} />
      </Document>
      <p>
        Page {pageNumber} of {numPages}
      </p>
    </div>
  );
};

export default PdfOperate;

四、实现简单的上一页 / 下一页翻页加载

bash 复制代码
<Button onClick={handlePreviousPage}>上一页</Button>
<Button onClick={handleNextPage}>下一页</Button>
 
 const handlePreviousPage = () => {
    if (pageNumber > 1) {
      setPageNumber(pageNumber - 1);
    }
  };
 const handleNextPage = () => {
   if (pageNumber < numPages) {
     setPageNumber(pageNumber + 1);
   }
 };

五、实现简单的下拉滚动加载

下拉滚动加载完整代码:

bash 复制代码
import React, { useState } from "react";
import { pdfjs } from "react-pdf";
import { Document, Page } from "react-pdf";
import "react-pdf/dist/Page/AnnotationLayer.css";
import "react-pdf/dist/Page/TextLayer.css";
import pdfUrl from "../../../assets/探索自然之美_20250107105901.pdf";

type PDFFile = string | File | null;

const maxWidth = 800;

const options = {
  cMapUrl: `https://unpkg.com/pdfjs-dist@${pdfjs.version}/cmaps/`,
  standardFontDataUrl: `https://unpkg.com/pdfjs-dist@${pdfjs.version}/standard_fonts`,
};

pdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.mjs`;

export default function CeshiOperate() {
  const [file] = useState<PDFFile>(pdfUrl);
  const [numPages, setNumPages] = useState<number | undefined>();
  const [containerWidth] = useState<number>(800);

  const onDocumentLoadSuccess = ({ numPages }: { numPages: number }): void => {
    setNumPages(numPages);
  };


  return (
    <div>
      <Document
        file={file}
        onLoadSuccess={onDocumentLoadSuccess}
        options={options}
      >
        {Array.from(new Array(numPages), (el, index) => (
          <Page
            key={`page_${index + 1}`}
            pageNumber={index + 1}
            width={
              containerWidth ? Math.min(containerWidth, maxWidth) : maxWidth
            }
          />
        ))}
      </Document>
    </div>
  );
}

不同的点也就是在这里对当前的numpages页进行了遍历。numPages是总页数,设置唯一标识key,也可以用index。

这里是我的一个简单使用,详解可看点击上方查看react-pdf插件地址的一些其他用法;

相关推荐
killerbasd6 小时前
牧苏苏传 我不装了 4/7
前端·javascript·vue.js
橘子编程7 小时前
JavaScript与TypeScript终极指南
javascript·ubuntu·typescript
叫我一声阿雷吧7 小时前
JS 入门通关手册(45):浏览器渲染原理与重绘重排(性能优化核心,面试必考
javascript·前端面试·前端性能优化·浏览器渲染·浏览器渲染原理,重排重绘·reflow·repaint
大家的林语冰8 小时前
《前端周刊》尤大开源 Vite+ 全家桶,前端工业革命启动;尤大爆料 Void 云服务新产品,Vite 进军全栈开发;ECMA 源码映射规范......
前端·javascript·vue.js
jiayong238 小时前
第 8 课:开始引入组合式函数
前端·javascript·学习
天若有情6739 小时前
【C++原创开源】formort.h:一行头文件,实现比JS模板字符串更爽的链式拼接+响应式变量
开发语言·javascript·c++·git·github·开源项目·模版字符串
软件工程师文艺9 小时前
从0到1:Claude Code如何用React构建CLI应用
前端·react.js·前端框架
M ? A9 小时前
Vue 迁移 React 实战:VuReact 一键自动化转换方案
前端·vue.js·经验分享·react.js·开源·自动化·vureact
yuki_uix9 小时前
重排、重绘与合成——浏览器渲染性能的底层逻辑
前端·javascript·面试
止观止10 小时前
拥抱 ESNext:从 TC39 提案到生产环境中的现代 JS
开发语言·javascript·ecmascript·esnext