Vue2.0 通过vue-pdf-signature@4.2.7和pdfjs-dist@2.5.207实现PDF预览
1.安装依赖
npm install pdfjs-dist@2.5.207 --save
npm install vue-pdf-signature@4.2.7 --save
2.在.vue文件中 script 部分引入
<script>
import * as PDFJS from 'pdfjs-dist'
PDFJS.GlobalWorkerOptions.workerSrc = require('pdfjs-dist/build/pdf.worker.js');//解决pdf.js中文乱码问题
import pdf from 'vue-pdf-signature'
// 中文PDF加载空白引入依赖
import CMapReaderFactory from 'vue-pdf-signature/src/CMapReaderFactory'export default {components: {pdf},data(){return{pdfPages: 0,//pdf页数pdfDoc: null,//pdf对象}},mounted() {this.getFileData();},methods:{//获取后台返回的文件流getFileData() {this.$http.post("/doc/docarchivemanagereceive/preview", {...this.from,}, {responseType: 'blob',}).then(({data: res}) => {//pdf-main 滚动条回到顶部this.$nextTick(() => {document.getElementsByClassName('pdf-main')[0].scrollTop = 0})const blob = new Blob([res], {type: 'application/pdf'})let fileUrl = URL.createObjectURL(blob)this.loadFile(fileUrl)})},//加载pdf文件loadFile(url) {const loadingTask = pdf.createLoadingTask({url: url,cMapPacked: true,CMapReaderFactory});loadingTask.promise.then((pdf) => {this.pdfDoc = pdf;this.pdfPages = pdf.numPages;this.$nextTick(() => {for (let i = 0; i < this.pdfPages; i++) {this.renderPage(i + 1, i) // 从第一页开始渲染}})}).catch((err) => {console.error("pdf 加载失败", err);this.$message.error("PDF文件打开失败");});},//获取分辨率getDeviceDPI() {var dpi = 96; // 默认值 96dpiif (window.screen && window.screen.deviceXDPI && window.screen.logicalXDPI) {dpi = window.screen.deviceXDPI / window.screen.logicalXDPI * dpi;} else if (window.devicePixelRatio) {dpi = dpi * window.devicePixelRatio;}return dpi;},//渲染pdf页renderPage(num, index, scale = 1.5, rotation = 0) {let deviceDPI = this.getDeviceDPI();this.pdfDoc.getPage(num).then((page) => {var viewport = page.getViewport({scale: scale,rotation: page.getViewport({scale: scale}).rotation + rotation});// Support HiDPI-screens.var outputScale = window.devicePixelRatio || 1;var canvas = document.getElementById('pdfCanvas' + index);var context = canvas.getContext('2d');canvas.width = Math.floor(viewport.width * outputScale);canvas.height = Math.floor(viewport.height * outputScale);canvas.style.width = Math.floor(viewport.width) + "px";canvas.style.height = Math.floor(viewport.height) + "px";canvas.parentNode.style.width = canvas.width + 'px';canvas.parentNode.style.height = canvas.height + 'px';var transform = outputScale !== 1? [outputScale, 0, 0, outputScale, 0, 0]: null;var renderContext = {canvasContext: context,transform: transform,viewport: viewport};page.render(renderContext);})//pdfjs-dist 2.0.945版本getViewport(scale)的传参方式/* this.pdfDoc.getPage(num).then((page) => {var scale = 816 / page.getViewport(1).width * (window.devicePixelRatio || 1);var scaledViewport = page.getViewport(scale);var canvas = document.getElementById('pdfCanvas' + index);var context = canvas.getContext('2d');canvas.width = scaledViewport.width;canvas.height = scaledViewport.height;var renderContext = {canvasContext: context,viewport: scaledViewport};page.render(renderContext);})*/},}}</script>
3.在.vue文件中 html 部分引入
<!--pdf文件预览--><div class="pdf_view" ><div class="pdf-main"> <div class="pdf_item" v-for="(item,index) in pdfPages" :key="index"><canvas :id="'pdfCanvas' + index"/></div></div></div>
4.在.vue文件中 css 部分引入
.pdf_view {height: calc(100vh - 116px);overflow: hidden;background: #F2F4F7;}.pdf-main {width: 100%;height: calc(100vh - 116px);overflow: auto;padding: 20px 0 0 20px;display: flex;flex-direction: column;align-items: center;.pdf_item {position: relative;margin: 0 auto 20px;}
}
5.最终效果

相关文章:
Vue2.0 通过vue-pdf-signature@4.2.7和pdfjs-dist@2.5.207实现PDF预览
1.安装依赖 npm install pdfjs-dist2.5.207 --savenpm install vue-pdf-signature4.2.7 --save2.在.vue文件中 script 部分引入 <script> import * as PDFJS from pdfjs-dist PDFJS.GlobalWorkerOptions.workerSrc require(pdfjs-dist/build/pdf.worker.js);//解决pdf…...
gradle的安装及其配置
1、下载网址 Gradle | Releases 2、 3、配置环境变量 4、 5、cmd输入gradle-v查看版本...
qt QImage详解
1、概述 QImage是Qt框架中用于处理图像数据的一个核心类。与QPixmap不同,QImage是在内存中直接存储图像像素数据的,这使得它适用于需要直接访问和修改像素的应用场景,比如图像处理算法、图像绘制以及图像分析等。QImage支持多种图像格式&…...
数据分析与效果评估的有效方法与实践探讨
内容概要 在现代社会中,数据分析与效果评估已成为各类项目管理和决策制定中的重要组成部分。首先,数据分析为我们提供了一种系统化的方法,以深入了解所收集数据的内涵与趋势。通过对数据进行整理、分类和分析,我们能够发现潜在的…...
Langchain调用模型使用FAISS
1.导包 from langchain_community.document_loaders import TextLoader from langchain_community.vectorstores import FAISS from langchain_openai.embeddings import OpenAIEmbeddings from langchain_text_splitters import RecursiveCharacterTextSplitter2.加载数据 l…...
双向链表的实现
一.概念与结构 双向链表区别于单链表不同的地方在于,双链表多出于一个指针能指向前面结点,使得整个链表得以首位相连。带头链表里的头结点称为哨兵位,哨兵位结点不储存任何有效元素,只是放哨功能。 二.实现双链表 2.1双链表结构…...
Charles简单压力测试
1.接口请求次数,并发量,请求延迟时间均可配置 1.1选中需要进行测试的接口,鼠标右键选中【repeat advance】 2.设置并发参数 下面的图中,选择了1个接口,每次迭代中1个接口同时请求,迭代1000次(…...
MMSegmentation测试阶段推理速度非常慢的一种可能原因
问题背景 测试集约1000张图片。训练阶段在测试集上推理时,速度正常,推理速度约为30fps;而使用tools/test.py进行推理时,速度非常慢,推理速度不到0.1fps。 解决方案 检查配置文件中是否启用了visualizer,…...
数据结构之链式结构二叉树的实现(初级版)
本文内容将主会多次用到函数递归知识!!! 本节内容需要借助画图才能更好理解!!! 和往常一样,还是创建三个文件 这是tree.h #pragma once #include<stdio.h> #include<stdlib.h> …...
day01-MybatisPlus
目录 1.快速入门 1.2.快速开始 1.2.1引入依赖 1.2.2.定义Mapper 1.2.3.测试 1.3.常见注解 1.3.1.TableName 1.3.2.TableId 1.3.3.TableField 1.4.常见配置 2.核心功能 2.1.条件构造器 2.1.1.QueryWrapper 2.1.2.UpdateWrapper 2.1.3.LambdaQueryWrapper 2.2.自…...
Postgresql源码(137)执行器参数传递与使用
参考 《Postgresql源码(127)投影ExecProject的表达式执行分析》 0 总结速查 prepare p_04(int,int) as select b from tbl_01 where a $1 and b $2为例。 custom计划中,在表达式计算中使用参数的值,因为custom计划会带参数值&…...
韩国恋爱游戏:阿西, 美女室友竟然…?百度网盘下载
故事情节/出场人物 [阿西, 美女室友竟然…?]是一款 FMV 真人视频恋爱游戏,你将以第一人称与5位美女室友一起体验别样合租生活。 在本作中,您将扮演合租公寓的房东男主 吴宥万(直译:牛奶男),一直独来独往的你,生活…...
一个运维牛人对运维规则的10个总结
一个运维牛人对运维规则的10个总结 在运维领域,经验和流程往往决定了系统的稳定性与可靠性。一个运维人,总结出了以下10条运维规则,涵盖了从基础管理到高级策略的全面内容,旨在帮助运维人员更好地应对各种挑战,确保系…...
Istio基本概念及部署
一、Istio架构及组件 Istio服务网格在逻辑上分为数据平面和控制平面。 控制平面:使用全新的部署模式:Istiod,这个组件负责处理Sidecar注入,证书颁发,配置管理等功能,替代原有组件,降低复杂度&…...
基于 Python 的 Django 框架开发的电影推荐系统
项目简介:本项目是基于 Python 的 Django 框架开发的电影推荐系统,主要功能包括: 电影信息爬取:获取并更新电影数据。数据展示:提供电影数据的列表展示。推荐系统:基于协同过滤算法实现个性化推荐。用户系…...
离线数仓开发SQL编写和调试的最佳实践(如何又快又好完成任务,学会几条就不用当很辛苦的牛马)
目录 在开发阶段对数据进行抽样 理论基础 实践应用 使用Hive进行数据采样 使用Spark进行数据采样 采用CTE模块化设计 逐步验证 逐步验证案例实践: 验证sales_data CTE: 验证ranked_sales CTE: 验证top_sales CTE: 结论 用Doris或Impala等更快查询的代替Hive …...
PostgreSQL 增量备份:保护你的数据资产
全文目录: 开篇语📜 前言📚 增量备份概述🔑 增量备份的优势 🛠️ PostgreSQL 增量备份实施步骤🌟 环境准备🚀 第一步:全量备份⏳ 第二步:定期增量备份🔄 第三…...
字节青训-寻找最大葫芦
问题描述 在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 aa 和另外两张相同牌面值的牌 bb。如果两个人同时拥有“葫芦”,我们会优先比较牌 aa 的大小,若牌 aa 相同则再比…...
el-checkbox勾选一个变成了勾选所有
问题: el-checkbox完成后勾选一个选项变成了所有选项都勾选了。非model值不正确,我的model值绑定的是数组,但是还是勾选一个变成了勾选多个。 解决 因为勾选的内容比较简单,且值不需要入库,所以我最开始定义的option为…...
ExpandingCard扩展卡片
文章目录 演示效果分析思路核心代码总结 源码 演示效果 分析思路 使用flex布局,每个卡片的宽度都由flex进行灵活调整交互可以增加和删除active,来实现宽度扩增和恢复还需要使用transition进行动画过渡,使得平滑切换 核心代码 首先创建一个…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...
机器学习复习3--模型评估
误差与过拟合 我们将学习器对样本的实际预测结果与样本的真实值之间的差异称为:误差(error)。 误差定义: ①在训练集上的误差称为训练误差(training error)或经验误差(empirical error&#x…...
