当前位置: 首页 > news >正文

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不同&#xff0c;QImage是在内存中直接存储图像像素数据的&#xff0c;这使得它适用于需要直接访问和修改像素的应用场景&#xff0c;比如图像处理算法、图像绘制以及图像分析等。QImage支持多种图像格式&…...

数据分析与效果评估的有效方法与实践探讨

内容概要 在现代社会中&#xff0c;数据分析与效果评估已成为各类项目管理和决策制定中的重要组成部分。首先&#xff0c;数据分析为我们提供了一种系统化的方法&#xff0c;以深入了解所收集数据的内涵与趋势。通过对数据进行整理、分类和分析&#xff0c;我们能够发现潜在的…...

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…...

双向链表的实现

一.概念与结构 双向链表区别于单链表不同的地方在于&#xff0c;双链表多出于一个指针能指向前面结点&#xff0c;使得整个链表得以首位相连。带头链表里的头结点称为哨兵位&#xff0c;哨兵位结点不储存任何有效元素&#xff0c;只是放哨功能。 二.实现双链表 2.1双链表结构…...

Charles简单压力测试

1.接口请求次数&#xff0c;并发量&#xff0c;请求延迟时间均可配置 1.1选中需要进行测试的接口&#xff0c;鼠标右键选中【repeat advance】 2.设置并发参数 下面的图中&#xff0c;选择了1个接口&#xff0c;每次迭代中1个接口同时请求&#xff0c;迭代1000次&#xff08;…...

MMSegmentation测试阶段推理速度非常慢的一种可能原因

问题背景 测试集约1000张图片。训练阶段在测试集上推理时&#xff0c;速度正常&#xff0c;推理速度约为30fps&#xff1b;而使用tools/test.py进行推理时&#xff0c;速度非常慢&#xff0c;推理速度不到0.1fps。 解决方案 检查配置文件中是否启用了visualizer&#xff0c;…...

数据结构之链式结构二叉树的实现(初级版)

本文内容将主会多次用到函数递归知识&#xff01;&#xff01;&#xff01; 本节内容需要借助画图才能更好理解&#xff01;&#xff01;&#xff01; 和往常一样&#xff0c;还是创建三个文件 这是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源码&#xff08;127&#xff09;投影ExecProject的表达式执行分析》 0 总结速查 prepare p_04(int,int) as select b from tbl_01 where a $1 and b $2为例。 custom计划中&#xff0c;在表达式计算中使用参数的值&#xff0c;因为custom计划会带参数值&…...

韩国恋爱游戏:阿西, 美女室友竟然…?百度网盘下载

​ 故事情节/出场人物 [阿西, 美女室友竟然…&#xff1f;]是一款 FMV 真人视频恋爱游戏&#xff0c;你将以第一人称与5位美女室友一起体验别样合租生活。 在本作中&#xff0c;您将扮演合租公寓的房东男主 吴宥万(直译:牛奶男)&#xff0c;一直独来独往的你&#xff0c;生活…...

一个运维牛人对运维规则的10个总结

一个运维牛人对运维规则的10个总结 在运维领域&#xff0c;经验和流程往往决定了系统的稳定性与可靠性。一个运维人&#xff0c;总结出了以下10条运维规则&#xff0c;涵盖了从基础管理到高级策略的全面内容&#xff0c;旨在帮助运维人员更好地应对各种挑战&#xff0c;确保系…...

Istio基本概念及部署

一、Istio架构及组件 Istio服务网格在逻辑上分为数据平面和控制平面。 控制平面&#xff1a;使用全新的部署模式&#xff1a;Istiod&#xff0c;这个组件负责处理Sidecar注入&#xff0c;证书颁发&#xff0c;配置管理等功能&#xff0c;替代原有组件&#xff0c;降低复杂度&…...

基于 Python 的 Django 框架开发的电影推荐系统

项目简介&#xff1a;本项目是基于 Python 的 Django 框架开发的电影推荐系统&#xff0c;主要功能包括&#xff1a; 电影信息爬取&#xff1a;获取并更新电影数据。数据展示&#xff1a;提供电影数据的列表展示。推荐系统&#xff1a;基于协同过滤算法实现个性化推荐。用户系…...

离线数仓开发SQL编写和调试的最佳实践(如何又快又好完成任务,学会几条就不用当很辛苦的牛马)

目录 在开发阶段对数据进行抽样 理论基础 实践应用 使用Hive进行数据采样 使用Spark进行数据采样 采用CTE模块化设计 逐步验证 逐步验证案例实践: 验证sales_data CTE: 验证ranked_sales CTE: 验证top_sales CTE: 结论 用Doris或Impala等更快查询的代替Hive …...

PostgreSQL 增量备份:保护你的数据资产

全文目录&#xff1a; 开篇语&#x1f4dc; 前言&#x1f4da; 增量备份概述&#x1f511; 增量备份的优势 &#x1f6e0;️ PostgreSQL 增量备份实施步骤&#x1f31f; 环境准备&#x1f680; 第一步&#xff1a;全量备份⏳ 第二步&#xff1a;定期增量备份&#x1f504; 第三…...

字节青训-寻找最大葫芦

问题描述 在一场经典的德州扑克游戏中&#xff0c;有一种牌型叫做“葫芦”。“葫芦”由五张牌组成&#xff0c;其中包括三张相同牌面值的牌 aa 和另外两张相同牌面值的牌 bb。如果两个人同时拥有“葫芦”&#xff0c;我们会优先比较牌 aa 的大小&#xff0c;若牌 aa 相同则再比…...

el-checkbox勾选一个变成了勾选所有

问题&#xff1a; el-checkbox完成后勾选一个选项变成了所有选项都勾选了。非model值不正确&#xff0c;我的model值绑定的是数组&#xff0c;但是还是勾选一个变成了勾选多个。 解决 因为勾选的内容比较简单&#xff0c;且值不需要入库&#xff0c;所以我最开始定义的option为…...

ExpandingCard扩展卡片

文章目录 演示效果分析思路核心代码总结 源码 演示效果 分析思路 使用flex布局&#xff0c;每个卡片的宽度都由flex进行灵活调整交互可以增加和删除active&#xff0c;来实现宽度扩增和恢复还需要使用transition进行动画过渡&#xff0c;使得平滑切换 核心代码 首先创建一个…...

保姆级教程:手把手教你用ONNX Runtime部署YOLOv8-OBB旋转框检测模型(附完整代码)

从零实现YOLOv8-OBB旋转框检测&#xff1a;ONNX Runtime部署全流程实战 旋转目标检测在遥感图像、文档分析等场景中具有独特优势。YOLOv8-OBB作为Ultralytics推出的旋转框检测版本&#xff0c;其部署过程与传统水平框检测存在显著差异。本文将彻底拆解从模型导出到推理优化的完…...

4步打造高效能开源路由器:OpenWrt固件安装指南

4步打造高效能开源路由器&#xff1a;OpenWrt固件安装指南 【免费下载链接】openwrt openwrt编译更新库X86-R2C-R2S-R4S-R5S-N1-小米MI系列等多机型全部适配OTA自动升级 项目地址: https://gitcode.com/GitHub_Trending/openwrt5/openwrt OpenWrt固件安装是提升R5S设备性…...

3分钟零基础入门:GPU加速MediaPipe TouchDesigner插件完整指南

3分钟零基础入门&#xff1a;GPU加速MediaPipe TouchDesigner插件完整指南 【免费下载链接】mediapipe-touchdesigner GPU Accelerated MediaPipe Plugin for TouchDesigner 项目地址: https://gitcode.com/gh_mirrors/me/mediapipe-touchdesigner 你是否曾想过在TouchD…...

一文搞懂 Spring Cloud:从入门到实战的微服务全景指南(建议收藏)

如果你正在做后端开发&#xff0c;或者正在准备找实习/秋招&#xff0c;那你一定绕不开一个关键词&#xff1a;微服务。 而在 Java 技术栈中&#xff0c;微服务的“标配方案”&#xff0c;就是今天的主角——Spring Cloud。 很多同学第一次接触 Spring Cloud 时&#xff0c;都…...

Ostrakon-VL-8B与传统算法对比展示:在复杂背景下的菜品分割

Ostrakon-VL-8B与传统算法对比展示&#xff1a;在复杂背景下的菜品分割 不知道你有没有遇到过这样的烦恼&#xff1a;想给美食拍张照&#xff0c;结果背景里堆满了杂乱的餐具、餐巾纸&#xff0c;甚至还有手机和钥匙&#xff0c;想单独把菜品抠出来&#xff0c;用传统的修图工…...

nuScenes数据集深度解析:从传感器融合到3D目标检测的完整数据流

nuScenes数据集工程化实战&#xff1a;多传感器时空对齐与3D检测数据流优化 在自动驾驶研发领域&#xff0c;数据是算法迭代的基石。当我们谈论nuScenes数据集时&#xff0c;多数讨论停留在基础功能介绍层面&#xff0c;却鲜有从工程实现角度剖析其数据流设计的精妙之处。本文将…...

MT5中文增强工具多场景落地:保险条款通俗化改写与消费者理解度提升实践

MT5中文增强工具多场景落地&#xff1a;保险条款通俗化改写与消费者理解度提升实践 1. 项目概述与核心价值 MT5中文增强工具是一个基于Streamlit和阿里达摩院mT5模型构建的本地化NLP工具&#xff0c;专门针对中文文本进行语义改写和数据增强。这个工具的最大特点是能够在保持…...

SUNFLOWER MATCH LAB在CSDN技术社区的分享:从部署到创新的完整旅程

SUNFLOWER MATCH LAB在CSDN技术社区的分享&#xff1a;从部署到创新的完整旅程 最近在CSDN上看到不少关于AI模型部署和应用的讨论&#xff0c;其中SUNFLOWER MATCH LAB这个项目引起了我的注意。它不是一个简单的模型调用工具&#xff0c;更像是一个围绕特定AI能力构建的完整实…...

BGE Reranker-v2-m3开发者案例:为LangChain添加本地重排序节点的5步集成法

BGE Reranker-v2-m3开发者案例&#xff1a;为LangChain添加本地重排序节点的5步集成法 1. 项目背景与核心价值 在构建检索增强生成&#xff08;RAG&#xff09;系统时&#xff0c;文本相关性排序是决定最终效果的关键环节。传统的基于向量相似度的检索往往无法准确捕捉查询与…...

告别窗口拖拽:用Loop实现Mac高效分屏的5个核心技巧

告别窗口拖拽&#xff1a;用Loop实现Mac高效分屏的5个核心技巧 【免费下载链接】Loop MacOS窗口管理 项目地址: https://gitcode.com/GitHub_Trending/lo/Loop 每天在Mac上工作时&#xff0c;你是否经常被这些问题困扰&#xff1a;窗口太多找不到想要的那个&#xff1f;…...