import './App.css'
import * as pdfjsLib from "pdfjs-dist";
import { useEffect, useRef, useState } from 'react' pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdn.bootcdn.net/ajax/libs/pdf.js/3.9.179/pdf.worker.min.js' function App() {
// 定义一些页面所需变量
const [page, setPage] = useState(1);
const [pages, setPages] = useState(0);
const containerRef = useRef(null);
const [pdfDocument, setPdfDocument] = useState(null); const renderPage = async (num, pdfDoc = pdfDocument) => {
if (!pdfDoc) { return false }
const pdfPage = await pdfDoc.getPage(num);
const viewport = pdfPage.getViewport({ scale: 1.5 });
const canvas = containerRef.current;
canvas.width = viewport.width;
canvas.height = viewport.height;
const ctx = canvas.getContext("2d");
const renderTask = pdfPage.render({
canvasContext: ctx,
viewport,
}); return renderTask.promise;
} /**
* 初始化pdfView
*/
const initPdfView = async () => {
const pdfPath = 'https://cos.dingshaohua.cn/aegis/1.pdf';
const pdfDocument = await pdfjsLib.getDocument(pdfPath).promise;
setPages(pdfDocument.numPages)
setPdfDocument(pdfDocument);
renderPage(page, pdfDocument);
} /**
* 下一页
*/
const onNext = () => {
if (page < pages) {
setPage(page + 1)
}
}
const onPrev = () => {
if (page > 1) {
setPage(page - 1)
}
} /**
* 一些钩子
*/
useEffect(() => {
initPdfView();
}, []) useEffect(() => {
renderPage(page);
}, [page])
return (
<div className='app'>
<div className='skip'>
<input type="number" min={1} max={pages} value={page} onChange={(e) => { setPage(Number(e.target.value)) }} />/{pages}
<div onClick={onNext}>下一页</div> <div onClick={onPrev}>上一页</div>
</div>
<canvas ref={containerRef}></canvas>
</div>
)
} export default App
.app{
position: absolute;
margin: auto;
left: 0;
right: 0;
width: 50%;
height: 90%;
overflow: auto;
} .skip{
background-color: aqua;
width: 260px;
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;
}

注意点:这里并没有使用pdf_viewer模式的渲染方式,和pdf_viewer比起来 这里要计算缩放度,而且比较糊,据说有svg模式 但是没有还没试

pdfjs-dist v3.x渲染pdf的更多相关文章

  1. 使用pdfjs插件在线预览PDF文件

    前言 本文介绍在html中使用 pdfjs插件在线预览PDF文件的方法. 实现步骤 下载 pdfjs 并引入项目中 到PDFJS官网 http://mozilla.github.io/pdf.js/g ...

  2. Asp.net Core 3.1 Razor视图模版动态渲染PDF

    Asp.net Core 3.1 Razor视图模版动态渲染PDF 前言 最近的线上项目受理回执接入了电子签章,老项目一直是html打印,但是接入的电子签章是仅仅对PDF电子签章,目前还没有Html电 ...

  3. Asp.net MVC Razor视图模版动态渲染PDF,Razor模版生成静态Html

    Asp.net MVC Razor视图模版动态渲染PDF,Razor模版生成静态Html 1.前言 上一篇文章我开源了轮子,Asp.net Core 3.1 Razor视图模版动态渲染PDF,然后,很 ...

  4. xhtmlrenderer渲染pdf,中文换行

    在实际开发中,发现在table中显示中文,渲染出来的pdf,中文内容不自动换行.经过搜索发现了一种解决方案,如下: 重写Breaker,修改right计算方式 /* * Breaker.java * ...

  5. 实战动态PDF在线预览及带签名的PDF文件转换

    开篇语: 最近工作需要做一个借款合同,公司以前的合同都是通过app端下载,然后通过本地打开pdf文件,而喜欢创新的我,心想着为什么不能在线H5预览,正是这个想法,说干就干,实践过程总是艰难的,折腾了3 ...

  6. pdf.js pdfdom.js使用(转)

    开篇语: 最近工作需要做一个借款合同,公司以前的合同都是通过app端下载,然后通过本地打开pdf文件,而喜欢创新的我,心想着为什么不能在线H5预览,正是这个想法,说干就干,实践过程总是艰难的,折腾了3 ...

  7. pdf.js使用教程

    pdf.js框架的魅力所在,为其为HTML5实现的,无需任何本地支持,而且对浏览器的兼容性也是比较好,要求只有一个:浏览器支持HTML5就好了!(不过对于低版本的IE,就只能节哀了!) 据说IE9以上 ...

  8. 动态PDF在线预览

    实战动态PDF在线预览及带签名的PDF文件转换 开篇语: 最近工作需要做一个借款合同,公司以前的合同都是通过app端下载,然后通过本地打开pdf文件,而喜欢创新的我,心想着为什么不能在线H5预览,正是 ...

  9. vue2.0全局组件之pdf

    目的:像elementUI那样注册全局组件 预览pdf文件 技术支持:使用火狐的pdf.js http://mozilla.github.io/pdf.js/ 准备:新建一个CPdf.vue文件,把火 ...

  10. H5拖拽 构造拖拽及缩放 pdf展示

    前言: 协助项目需要实现一个签名的功能. 功能说明:1.有文本签名和头像签名.2.头像签名需要实现可拖拽功能.3.需要展示的是pdf的文件并需要获取签名位于pdf文件的相对位置. 功能一:实现拖拽 思 ...

随机推荐

  1. yolov5常用命令记录

    一.准备深度学习环境 首先,确保你的计算机上已经安装了Python.PyTorch以及CUDA等必要的深度学习框架和库.YOLOv5对Python版本和PyTorch版本有一定的要求,通常建议使用Py ...

  2. 判断页面是否存在指定内容,校验结果(page should contain element指令的用法)

    会员调整成分销商后,分销商列表寻找该记录的方法

  3. CSP-S 17天冲刺计划

    var code = "91461527-5e0b-458f-ae4b-db46cf2a11c8" D1~D3(树专题复习)(OK\color{green}OKOK) 树基础(OK ...

  4. 2025AI应用全景图谱报告

    提供AI咨询+AI项目陪跑服务,有需要回复1 加粉丝群获取报告 模型基础能力的提升加上自媒体的各种活跃,为AI应用提供了成长的温床,所以25年被称为了AI应用爆发的元年,这是有道理的,至少老板们在投钱 ...

  5. C#/.NET/.NET Core优秀项目和框架2025年4月简报

    前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的详细介绍.功能特点.使用方式以及部分功能 ...

  6. vue3 基础-条件渲染 v-if 和 v-show

    本篇讲 vue 中对 dom 元素节点进行 "显示和隐藏" 的实现方式指令, 即 v-if 和 v-show. 其实一句话就能说明白, v-if 的底层是从 dom 树中增删节点; ...

  7. PyYaml简单学习

    YAML是一种轻型的配置文件的语言,远比JSON格式方便,方便人类读写,它通过缩进来表示结构,很具有Python风格. 安装:pip insall pyyaml YAML语法 文档 YAML数据流是0 ...

  8. 物联网之使用Vertx实现TCP最佳实践【响应式】

    小伙伴们,你们好呀,我是老寇,跟我一起学习使用Vertx实现TCP-Server 实现TCP-Server[响应式] Vertx-Core地址 实现过程 查看源码 代码比较简单,懒得讲解啦 代码比较简 ...

  9. codeup之等腰梯形

    Description 请输入高度h,输入一个高为h,上底边长为h 的等腰梯形(例如h=4,图形如下). **** ****** ******** ********** Input 输入第一行表示样例 ...

  10. the server time zone value ‘�й���׼ʱ��‘ is unrecognized or represents more than one time zone.

    分析:数据库和系统时区差异造成 解决:在jdbc连接的url后面加上 &serverTimezone=GMT