pdfjs-dist v2.11.338写个react demo
app.jsx
import './App.css'
import * as pdfjs from "pdfjs-dist";
import "pdfjs-dist/web/pdf_viewer.css";
import { useEffect, useRef, useState } from 'react'
import { PDFViewer, PDFLinkService, EventBus } from 'pdfjs-dist/web/pdf_viewer';
pdfjs.GlobalWorkerOptions.workerSrc = 'https://cdn.bootcdn.net/ajax/libs/pdf.js/2.11.338/pdf.worker.min.js'
function App() {
useEffect(() => {
initPdfView();
}, [])
// pdfView自动缩放
const autoScale = (viewer) => {
// 缩放模式: "page-fit" ,"auto" ,"page-width"
viewer.currentScaleValue = 'page-width';
}
// 监听pdfView外部容器变化,主要是配合自动缩放
const onResize = (viewer) => {
const resizeObserver = new ResizeObserver(entries => { // 创建观察对象
autoScale(viewer) // entries[0].contentRect
});
resizeObserver.observe(containerRef.current); // 指定要观察的dom
}
// 定义一些页面所需变量
const [viewer, setViewer] = useState({});
const [page, setPage] = useState(1);
const [pages, setPages] = useState(0);
const containerRef = useRef(null);
/**
* 初始化pdfView
*/
const initPdfView = () => {
const pdfUrl = 'https://cos.dingshaohua.cn/aegis/1.pdf';
const linkService = new PDFLinkService();
const eventBus = new EventBus();
eventBus.on("pagesinit", (e) => {
onResize(e.source) // 同一次轮回 是拿不到view的,所以只能通过e.source取出
});
const newViewer = new PDFViewer({
container: containerRef.current, // 显示PDF的容器dom
linkService,
eventBus,
textLayerMode: 2,
renderer: "canvas",
});
linkService.setViewer(newViewer);
pdfjs.getDocument(pdfUrl).promise.then((pdf) => {
linkService.setDocument(pdf);
newViewer.setDocument(pdf);
setPages(pdf.numPages);
})
setViewer(newViewer)
}
/**
* 下一页
*/
const onNext = () => {
if (viewer.currentPageNumber < pages) {
viewer.currentPageNumber++;
setPage(viewer.currentPageNumber)
}
}
/**
* 跳转页面
*/
const onSkip = () => {
if (viewer.currentPageNumber < pages) {
viewer.currentPageNumber = page;
}
}
return (
<>
<div className='skip'>
<input type="number" value={page} onChange={(e) => { setPage(Number(e.target.value)) }} />/{pages}
<div onClick={onSkip}>跳转</div> <div onClick={onNext}>下一页</div>
</div>
<div ref={containerRef} className='container'>
<div id="viewer" className="pdfViewer"></div>
</div>
</>
)
}
export default App
app.css
.container{
position: absolute;
margin: auto;
left: 0;
right: 0;
width: 50%;
height: 100%;
overflow: auto;
}
.skip{
background-color: aqua;
width: 180px;
position: fixed;
right: 0;
top: 0;
padding: 10px;
display: flex;
z-index: 3;
}
.skip input{
width:20%;
}
.skip div{
background-color: gray;
cursor: pointer;
user-select: none;
margin-left: 10px;
}
效果

pdfjs-dist v2.11.338写个react demo的更多相关文章
- Git for Windows v2.11.0 Release Notes
homepage faq contribute bugs questions Git for Windows v2.11.0 Release Notes Latest update: December ...
- 写的cursor demo仅作记录
declare @objectID int; declare objcur cursor for object_id from m_object open objcur fetch next from ...
- 如何使用npm构建一个react demo项目
方法一: 1) 安装node.js环境 点我进入nodejs官网 1.1) 下载LTS(Long term support)版本,安装 1.2) 在cmd中使用以下命令查看node是否安装成功 no ...
- 最近写了一个demo,想看看java和go语言是怎么写的
最近写了一个demo:demo的github地址 一. 简单介绍 1. Server端 它是一个WebApi服务,把它当成一个黑盒就行了. 2. MiddleServer端 是重点,它是一个WebAp ...
- 写一个react hook:useLoading
在写业务的过程中,我们总是会遇到这样的需求,在请求时显示一个 loading,然后请求结束后展示数据.以一个是不是 vip 的场景为例,如果不加入 loading 状态,页面可能在未请求的时候显示非 ...
- python爬虫学习(11) —— 也写个AC自动机
0. 写在前面 本文记录了一个AC自动机的诞生! 之前看过有人用C++写过AC自动机,也有用C#写的,还有一个用nodejs写的.. C# 逆袭--自制日刷千题的AC自动机攻克HDU OJ HDU 自 ...
- 如何写好react组件
react 组件方面: 总结 React 组件的三种写法 及最佳实践 [涨经验] React组件编写思路(一) 使用react-router实现单页面应用时设置页面间过渡的两种方式 [翻译]基于 Cr ...
- [翻译]怎么写一个React组件库(二)
本文同步发布于知乎专栏 https://zhuanlan.zhihu.com/p/27434018,喜欢本文的就去知乎点个赞支持下吧- 引言 该系列文章将通过创建一个组件库来引导你学习如何构建自己的组 ...
- react 脚手架 立即可以写业务 react + react-router-dom + less + axios + antd
https://github.com/cynthiawupore/wq-cli
- [翻译]怎么写一个React组件库(一)
本文同步发布于知乎专栏 https://zhuanlan.zhihu.com/p/27401329,喜欢本文的就去知乎点个赞支持下吧- 引言 该系列文章将通过创建一个组件库来引导你学习如何构建自己的组 ...
随机推荐
- App自动化环境部署
1.所需工具 Android-SDK:自行百度下载 Appium-Desktop:自行百度下载 真机或模拟器:自行准备 2.部署步骤 1)配置Android-SDK 解压Android-SDK压缩包 ...
- Java连接Redis常用操作
1.去重 package Data; import redis.clients.jedis.Jedis; public class TestRedisUniq { public static Jedi ...
- Java 中的强引用、软引用、弱引用和虚引用分别是什么?
Java 中的引用类型:强引用.软引用.弱引用和虚引用 Java 中的引用类型主要分为 强引用.软引用.弱引用 和 虚引用,它们对对象的生命周期和垃圾回收(GC)行为产生不同的影响. 1. 强引用(S ...
- 使用xxxbase应付CRUD后端任务
很多的后端CRUD开发任务都是毫无意义的, 如果使用firebase/supabase/pocketbase这些工具快速应付这些任务才是重要的. 如果是一位研究生, 在面对导师的垃圾横向的时候, 这种 ...
- 超越代码生成:AI 如何重塑软件开发全生命周期 (SDLC)? (需求、测试到部署)
引言:AI 不止写代码,软件开发的"全链路"变革已至 各位技术圈的朋友们,提到 AI 在软件开发中的应用,恐怕大多数人首先想到的还是 GitHub Copilot.DeepSeek ...
- latex常用符号及模板
\le \ge \in \mathbb{M} a \qquad b \ne \forall \exists \left \lfloor \right \rfloor \nmid \varnothing ...
- Web前端入门第 54 问:JavaScript 3 种书写位置及 script 标签的正确存放位置
JS 的代码并没有强制规定放在 HTML 中的某个位置,如果您有使用过开发者工具查看过网页源码,那么您会看到很多 JS 代码都以 .js 文件的形式存放,并且放在了 HTML 文件最后,也就是 < ...
- AI写程序: 多线程网络扫描网段ip工具
IP Scanner - 多线程网络扫描工具 项目简介 IP Scanner 是一个基于 Python 开发的网络扫描工具,它能够快速扫描指定网段内的活动 IP 地址.该工具采用多线程技术提高扫描效率 ...
- Android studio虚拟机黑屏
1.冷启动 cold boot now 2.新建一个 另外今天下午起来的比较晚,就在宿舍上的机,然后效果就比较差,我有罪,我下次要学习一定不在宿舍,今晚也是早早的吃了饭就来自习了,这就是成果.卡了我一 ...
- ChatMoney智能体高情商接话神器
本文由 ChatMoney团队出品 会说话是一个人的优势,而会接话才是一个人的本事.现实中很多人有这样的困扰:朋友聚会.上门拜访以及和人聊天.是不是完全不知道如何回应,只会说"嗯" ...