pdfjs-dist 实现pdf文件在线预览

news/2024/11/25 21:42:35/

pdfjs-dist 实现pdf文件在线预览

    • 实现效果
    • 实现过程
      • (1)安装pdfjs-dist
      • (2)代码部分
      • (3)原理

项目要求实现pdf文件在线预览,并且pdf预览通过上下页滚动pdf,且兼容ie浏览器
浏览器兼容参照了 这位博主的文章,选择用pdfjs-dist 实现

实现效果

这是我随便写的一个pdf(一共2页),可通过点击上下换页
谷歌浏览器
在这里插入图片描述

ie11
在这里插入图片描述

实现过程

(1)安装pdfjs-dist

npm install --save pdfjs-dist@2.0.943

这里需要指定2.0.943的版本,试过其他版本的都会多多少少在引入,执行行数时报错

(2)代码部分


<template><div class="main-container"><input type="file" ref="fielinput" @change="uploadFile" /><div class="canvas-container"><canvas ref="myCanvas" class="pdf-container"> </canvas></div><div class="pagination-wrapper"><button @click="clickPre">上一页</button><span>{{ pageNo }} / {{ pdfPageNumber }}</span><button @click="clickNext">下一页</button></div></div>
</template><script>
const pdfJS = require("pdfjs-dist");pdfJS.GlobalWorkerOptions.workerSrc = require("pdfjs-dist/build/pdf.worker.entry");
export default {mounted() {},data() {return {pageNo: null,pdfPageNumber: null,pdfTotalPages: 1,renderingPage: false,pdfData: null, // PDF的base64scale: 1, // 缩放值};},methods: {uploadFile() {let inputDom = this.$refs.fielinput;let file = inputDom.files[0];let reader = new FileReader();reader.readAsDataURL(file);reader.onload = () => {let data = atob(reader.result.substring(reader.result.indexOf(",") + 1));this.loadPdfData(data);};},loadPdfData(data) {// 引入pdf.js的字体let CMAP_URL = "https://unpkg.com/pdfjs-dist@2.0.943/cmaps/";//读取base64的pdf流文件this.pdfData = pdfJS.getDocument({data: data, // PDF base64编码cMapUrl: CMAP_URL,cMapPacked: true,});console.log(this.pdfData);this.renderPage(1);this.renderScrollPdf();},// 根据页码渲染相应的PDFrenderPage(num) {this.renderingPage = true;this.pdfData.promise.then((pdf) => {this.pdfPageNumber = pdf.numPages;pdf.getPage(num).then((page) => {// 获取DOM中为预览PDF准备好的canvasDOM对象let canvas = this.$refs.myCanvas;let viewport = page.getViewport(this.scale);canvas.height = viewport.height;canvas.width = viewport.width;let ctx = canvas.getContext("2d");let renderContext = {canvasContext: ctx,viewport: viewport,};page.render(renderContext).then(() => {this.renderingPage = false;this.pageNo = num;});});});},clickPre() {if (!this.renderingPage && this.pageNo && this.pageNo > 1) {this.renderPage(this.pageNo - 1);}},clickNext() {if (!this.renderingPage &&this.pdfPageNumber &&this.pageNo &&this.pageNo < this.pdfPageNumber) {this.renderPage(this.pageNo + 1);}},renderScrollPdf() {this.pdfData.promise.then((pdf) => {this.pdfTotalPages = pdf.numPages;this.renderScrollPdfPage(1);});},},
};
</script><style scoped>
.main-container {display: flex;flex-direction: column;align-items: center;
}
.canvas-container {width: 400px;height: 500px;border: 1px dashed black;position: relative;display: flex;justify-content: center;
}
.scroll-pdf-contanier {width: 400px;height: 500px;border: 1px dashed black;position: relative;display: flex;flex-direction: column;overflow-y: scroll;
}
.pdf-container {width: 100%;height: 100%;
}
.scroll-pdf-container {width: 350px;
}
.pagination-wrapper {display: flex;justify-content: center;align-items: center;
}
</style>

(3)原理

首先是要传递给pdfjs-dist展示的是以base64的方式传递,这里用了上传文件,将文件流转化成base64进行模拟,一般是由后台传给前端base64数据直接渲染

    uploadFile() {let inputDom = this.$refs.fielinput;let file = inputDom.files[0];let reader = new FileReader();reader.readAsDataURL(file);reader.onload = () => {let data = atob(reader.result.substring(reader.result.indexOf(",") + 1));this.loadPdfData(data);};},

loadPdfData函数接受到base64数据后,调用pdf-dist的方法将pdf转换成canvas,相当于用图片的方式展示pdf,而各个浏览器都支持图片,那么就少了很多兼容的问题了
再配合pdf的页数,点击按钮上下切换,功能基本实现


http://www.ppmy.cn/news/539410.html

相关文章

【顺序表插入操作的实现】943

文章目录 题目描述输入输出样例输入样例输出贴个代码块思路 题目描述 建立长度为n的顺序表&#xff0c;在指定的数据元素item之前插入数据元素data。如果指定的数据元素item不存在&#xff0c;则将data插入到顺序表的尾端。&#xff08;数据类型为整型&#xff09; 输入 第一…

SWUST OJ 943: 顺序表插入操作的实现

题目描述 建立长度为n的顺序表&#xff0c;在指定的数据元素item之前插入数据元素data。如果指定的数据元素item不存在&#xff0c;则将data插入到顺序表的尾端。&#xff08;数据类型为整型&#xff09; 输入 第一行为顺序表的长度n&#xff1b; 第二行为顺序表中的数据元素&…

943c语言,考研备战:华南理工大学943计算方法(含C语言)复试大纲_跨考网

一、考试目的&#xff1a; 《计算方法(含C语言)》作为全日制计算数学专业研究生入学复试考试的主要科目&#xff0c;其目的是考察考生是否具备在计算数学专业继续深造的数学基础和程序设计水平。 二、考试性质与范围&#xff1a; 本考试是一种测试应试者是否具备数值分析基础和…

924

你肯定用了Annotation来配置hibernate映射吧&#xff0c;那么spring的sessionfactory就不能用localsessionfactorybean了&#xff0c;使用如下配置即可&#xff0c; 注意啊要用spring2.5 <bean id"sessionFactory" class"org.springframework.orm.hibernate…

943数据结构勘误表

大家好&#xff0c;我是登登学长。很高兴你购买我的资料。由于时间仓促和水平有限&#xff0c;个人整理的资料难免有遗漏或者错误的地方。故 设此勘误表&#xff0c;用以改正资料中的不足。每条 勘误信息都有日期&#xff0c;如果你收到资料的日期在此之后&#xff0c;可以忽略…

中南大学计算机943考研真题,中南大学-943-2007-2012-真题.pdf

各个学校计算机/软件专业考研真题 免费分享 /csseky/cskaoyan 王道论坛( )友情分享&#xff01;请勿用于商业用途&#xff01; 微 信 公 众 号 计 算 机 与 软 件 考 研 获取 考研经验/复试资料/考研资讯 关注微信公众号 计算机与软件考研 各个学校计算机/软件专业考研真题 免费…

vue通过url方式展示PDF方法总结

最近vue项目中遇到预览pdf出现乱码问题&#xff0c;尝试了各种办法受尽折磨&#xff0c;以此记录一下使用的几种方法 官网下载地址&#xff1a;https://mozilla.github.io/pdf.js/getting_started/#download 1.使用pdfjs-dist 插件&#xff0c;通过iframe标签显示 首先 npm …

【Leetcode】943. Find the Shortest Superstring

题目地址&#xff1a; https://leetcode.com/problems/find-the-shortest-superstring/description/ 给定一个长 n n n的单词数组 A A A&#xff0c; 1 ≤ n ≤ 12 1\le n\le 12 1≤n≤12&#xff0c;每个单词长度不超过 20 20 20。求最短的字符串 s s s&#xff0c;使得 A A…