首页 > 其他分享 >pdfjs-dist v2.11.338写个react demo

pdfjs-dist v2.11.338写个react demo

时间:2023-08-25 14:33:26浏览次数:47  
标签:dist 338 viewer demo pdf pdfjs page const

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;
}

效果

标签:dist,338,viewer,demo,pdf,pdfjs,page,const
From: https://www.cnblogs.com/dingshaohua/p/17656844.html

相关文章

  • 服务拆分-案例Demo
        ......
  • DistilBertModel模型的简单解释
    DistilBertModel((embeddings):Embeddings((word_embeddings):Embedding(30522,768,padding_idx=0)(position_embeddings):Embedding(512,768)(LayerNorm):LayerNorm((768,),eps=1e-12,elementwise_affine=True)(dropout):Dropout(p=0.1,in......
  • 学习笔记:什么是Wasserstein distance
    简单地说,就是衡量两个概率分布之间的差异。也可以说是将一个概率分布转换成另一个概率分布要花费多少代价。图1:在一维空间中的三个概率分布比如,上图中有三个概率分布f,g,h,我们可以说f与g之间的距离比f与h之间的距离更小。上述只是感性上的认知,那么如何计算出准确......
  • springboot之RedisTemplate的访问单机,哨兵,集群模式
    springboot2默认已经使用了lettuce-core,没有使用jedis和Redisson,springboot1使用的是jedis。我使用的springboot版本是2.6.14。(对应的lettuce版本为6.1.10.RELEASE,对应jedis版本为3.7.1)<dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactI......
  • [LeetCode][72]edit-distance
    ContentGiventwostringsword1andword2,returntheminimumnumberofoperationsrequiredtoconvertword1toword2.Youhavethefollowingthreeoperationspermittedonaword:InsertacharacterDeleteacharacterReplaceacharacter Example1:In......
  • flask接收json,开启服务demo
    demofromflaskimportFlask,render_template,request,jsonifyapp=Flask(__name__)@app.route('/',methods=['GET','POST'])defindex():processed_data=Noneifrequest.method=='POST':try......
  • ios开发之--从相机或相册选取图片,并带删除操作的demo
    多选图片的一个效果,如下图:附带有删除操作,比较方便!选取图片使用的是:ZYQAssetPickerController这个第三方类图片压缩用的是自己写的类别:UIImage+ImageSimple附一个demo的下载地址:https://github.com/hgl753951/changeTest.git具体代码就不上传了!可以直接从demo里面看!在此仅做记录用!作......
  • NSQ demo
    Dockerdockerpullnsqio/nsqnsqd​nsqd​是接收、队列和向客户端传递消息的守护进程。它可以独立运行,但通常在具有nsqlookupd​实例的集群中进行配置(这种情况下,他将会发布主题和频道以便发现)配置及api:https://nsq.io/components/nsqd.htmldockerrun--namensqd-p4150......
  • LeetCode338.比特位计数
    先以2,3为例,它们的二进制分别是10、11,可以看到,忽略其二进制中最高位的1之后,这组数中二进制位为1的数量分别和数字0,1中二进制位为1的数量相同,再以4,5,6,7为例,他们的二进制分别是100、101、110、111,忽略其二进制中最高位的1之后,这组数中二进制位为1的数量分别和数字0,1,2,3中二进制位为1的......
  • hibernate_demo
    参考:ORM----hibernate入门Demo(无敌详细版)-Old-凯-博客园(cnblogs.com)Hibernate-基础入门详解_51CTO博客_hibernate入门hmb.xml:Hibernate框架之hbm.xml映射文件(详解)_hibernate映射文件详解_hestyle的博客-CSDN博客 新建testdb数据库,创建tb_users表: 模块整体目录......