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. AI时代:开源大模型选择

    https://docs.llamaindex.ai/en/stable/module_guides/models/llms.html 可以按参数和评分来选择模型: https://huggingfa ...

  2. Python+Appium+unittest案例

    代码如下: # coding=utf-8 import time import unittest from appium import webdriver class MyTestCase(unitt ...

  3. 🎀SpringBoot项目打包jar 并打包为exe启动

    简介 将SpringBoot项目打包jar并打包为exe启动,在无jdk环境下直接运行. 操作 SpringBoot打包为可执行jar(这里使用maven install) 注:如果存在前端页面需同时 ...

  4. Git的基础使用(一)

    Git版本管理工具的作用: (1)完整的记录项目代码变化的过程 (2)备份每一个变化过程的代码版本 (3)多人协同开发 1.配置全局变量 (1)配置用户名 git config --global us ...

  5. eolinker取数组数据合并成一个数据的方法

    有时候遇到数据存在某一个数组中,类似下图结构,而用到这些数据的接口又需要一个数据集合,比如这样[14224, 14223]. 思路使用后置脚本,创建一个集合,把这两项数据取出来来,然后放到集合里,脚本 ...

  6. Sentinel源码—3.ProcessorSlot的执行过程

    大纲 1.NodeSelectorSlot构建资源调用树 2.LogSlot和StatisticSlot采集资源的数据 3.Sentinel监听器模式的规则对象与规则管理 4.AuthoritySlo ...

  7. 2.7K star!这个汉字工具库让中文处理变得超简单,开发者必备!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 cnchar 是一个功能全面的汉字工具库,提供拼音转换.笔画动画.偏旁查询.成语接龙.语音合 ...

  8. Java--事务,操作数据库,实现转账

    更新:2019/3/29 目录 简介 事务的四个特性 一个小Demo 目录结构 jdbc.properties JDBCUtil.java TestTransaction.java[核心代码] 数据库 ...

  9. Rust 在 Linux 下的安装

    Rust 在 Linux 下的安装 我感觉, Rust 这个语言, 集 C, C++, Java, Scala, JavaScript, TypeScript, Python ... 等语言的优势于一 ...

  10. Web前端入门第 52 问:JavaScript 的应用领域

    截至目前,您应该对前端的 HTML + CSS 应该有了很清楚的认知,至少实现一个静态网页已经完全不在话下了. 当然,CSS 功能绝不止这些,一些不太常用的 CSS 相关知识,后续将通过案例进行分享. ...