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的更多相关文章

  1. Git for Windows v2.11.0 Release Notes

    homepage faq contribute bugs questions Git for Windows v2.11.0 Release Notes Latest update: December ...

  2. 写的cursor demo仅作记录

    declare @objectID int; declare objcur cursor for object_id from m_object open objcur fetch next from ...

  3. 如何使用npm构建一个react demo项目

    方法一: 1) 安装node.js环境  点我进入nodejs官网 1.1) 下载LTS(Long term support)版本,安装 1.2) 在cmd中使用以下命令查看node是否安装成功 no ...

  4. 最近写了一个demo,想看看java和go语言是怎么写的

    最近写了一个demo:demo的github地址 一. 简单介绍 1. Server端 它是一个WebApi服务,把它当成一个黑盒就行了. 2. MiddleServer端 是重点,它是一个WebAp ...

  5. 写一个react hook:useLoading

    在写业务的过程中,我们总是会遇到这样的需求,在请求时显示一个 loading,然后请求结束后展示数据.以一个是不是 vip 的场景为例,如果不加入 loading 状态,页面可能在未请求的时候显示非 ...

  6. python爬虫学习(11) —— 也写个AC自动机

    0. 写在前面 本文记录了一个AC自动机的诞生! 之前看过有人用C++写过AC自动机,也有用C#写的,还有一个用nodejs写的.. C# 逆袭--自制日刷千题的AC自动机攻克HDU OJ HDU 自 ...

  7. 如何写好react组件

    react 组件方面: 总结 React 组件的三种写法 及最佳实践 [涨经验] React组件编写思路(一) 使用react-router实现单页面应用时设置页面间过渡的两种方式 [翻译]基于 Cr ...

  8. [翻译]怎么写一个React组件库(二)

    本文同步发布于知乎专栏 https://zhuanlan.zhihu.com/p/27434018,喜欢本文的就去知乎点个赞支持下吧- 引言 该系列文章将通过创建一个组件库来引导你学习如何构建自己的组 ...

  9. react 脚手架 立即可以写业务 react + react-router-dom + less + axios + antd

    https://github.com/cynthiawupore/wq-cli

  10. [翻译]怎么写一个React组件库(一)

    本文同步发布于知乎专栏 https://zhuanlan.zhihu.com/p/27401329,喜欢本文的就去知乎点个赞支持下吧- 引言 该系列文章将通过创建一个组件库来引导你学习如何构建自己的组 ...

随机推荐

  1. bash极简教程

    今天看到消息,来自大神阮一峰的<bash脚本教程>开源发布了, 我也借此机会来总结个bash极简教程. 本文是一个更加简化的<bash极简教程>,告诉你什么时候需要使用bash ...

  2. 延迟补偿在C/S架构游戏协议设计和优化中的应用

    延迟补偿在C/S架构游戏协议设计和优化中的应用 1 分钟读完 1.综述Permalink 第一人称角色网络游戏的设计是一项很有挑战性的工作.网络环境下的健壮性,是动作游戏能否成功的一个重要因素.另外, ...

  3. jmeter:CSV数据文件设置解析文件时中文乱码问题

    设置数据文件时可以把数据可放入csv文件或txt文件中 但是,在性能测试中,尽量把数据存放于txt文件中,txt文件消耗的资源比csv文件少,而且txt文件比csv文件更方便更改数据. 文件编码一般使 ...

  4. VUE——环境搭建

    VUE--环境搭建 npm: Nodejs下的包管理器. webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资源的合并和打包. vue-cli ...

  5. 2K star!三分钟搭建企业级后台系统,这款开源Java框架绝了!

    2K star!三分钟搭建企业级后台系统,这款开源Java框架绝了! "LikeAdmin Java是基于Spring Boot + Mybatis Plus + Vue 3的快速开发平台, ...

  6. 时间工具类之“LocalDateTime方案转换地域性时差问题->UTC时间转纽约时间”

    一.使用方法 1.获取纽约ZoneId[纽约时区的ZoneId标识为"America/New_York"] -> ZoneId.of("America/New_Yo ...

  7. 彻底掌握 PCA 降维

    PCA 这类的降维算法, 我算是接触好几年了有, 从我学营销的时候, 市场研究方面就经常会用到,相关的还有 "因子分析" 比如, 商品形象认知, 客户细分等场景. 其实多年前我就能 ...

  8. lambdo表达式

    ************************************************************************* 原作者:ioriogami 原文:https://b ...

  9. Java从小白到老白⑥

    一. 1.抽象类vs接口 相同 两者都不能实例化,不能new操作 不同 抽象类abstract 接口interface 抽象类可以用部分方法实现 接口所有方法不能有实现 一个类只能继承(extends ...

  10. mysql8忘记原始密码如何进入问题

    原文链接 http://codebay.cn/post/9447.html 再不找到今天差点要通宵 Mark起来~ 实测mysqld –skip-grant-tables这样的命令行,在mysql8中 ...