vue项目纯前端把PDF转成图片并下载

embedded/2025/3/10 21:18:46/

项目需求是把一个pdf转成图片,并在最后添加上二维码,然后下载下来。

经过一番研究以后,作此记录。

主要用到了pdfjs-dist这个包,我用的是2.16.105版本。

废话不多说,直接上代码。

先下载node_modules包

npm i pdfjs-dist -S

然后在vue页面中引入:

import * as pdfjsLib from "pdfjs-dist/legacy/build/pdf.js";
import * as pdfjsWorker from "pdfjs-dist/legacy/build/pdf.worker.entry.js";
pdfjsLib.GlobalWorkerOptions.workerSrc = pdfjsWorker;

下面是在methods里面写的方法:

// 通过前台用pdf转图片async pdfForImage(pdf) {this.isExportLoad = true; // 控制加载中const pdfurl = pdf; // 传过来的是pdf的连接console.log(pdfurl, "pdf地址");if (pdfurl) {try {// 读取pdf文件const pdfDoc = await pdfjsLib.getDocument(pdfurl).promise;const pageNum = pdfDoc.numPages;console.log(pageNum, "pdf页数");const promiseArr = [];// 循环pdf每一页for (let i = 1; i <= pageNum; i++) {const page = await pdfDoc.getPage(i);const viewport = page.getViewport({ scale: 1.5 }); // 设置合适的缩放比例// 创建canvas画布const canvas = document.createElement("canvas");const ctx = canvas.getContext("2d");canvas.width = viewport.width;canvas.height = viewport.height;// 把每一页Pdf画到canvas中const renderTask = page.render({canvasContext: ctx,viewport: viewport,});// 因为有好多页,所以通过promise完成每一页的canvas画布以后再统一合并图片const promise = new Promise((resolve, reject) => {// 等待渲染完成renderTask.promise.then(() => {resolve({canvas,width: canvas.width,height: canvas.height,});}).catch((error) => {reject({error,canvas: null,width: 0,height: 0,});});});promiseArr.push(promise);}// 等所有pdf页面渲染完成Promise.all(promiseArr).then((res) => {console.log(res, "res");if (res.length > 0) {// 合并canvas并生成图片const canvas = document.createElement("canvas");const ctx = canvas.getContext("2d");// 获取最大宽度let width = Math.max(...res.map((item) => item.width));// 获取高度总和let height = res.reduce((total, item) => total + item.height, 0);let num = 0, qrCanvasHeight = 136; // qrCanvasHeight是二维码图片的高度上下预留出20px的间距canvas.width = width;canvas.height = height + qrCanvasHeight; // 高度要加上二维码图片的高度ctx.fillStyle = "#ffffff"; // 给画布加上白色背景,这个色值可以随便更换ctx.fillRect(0, 0, width, height + qrCanvasHeight);res.forEach((item) => {if (item.canvas && item.height > 0) {// 画图片信息ctx.drawImage(item.canvas, 0, num, item.width, item.height);num += item.height;}});// 添加二维码图片const img = new Image();img.src = require("@/assets/qrcode.png"); // 二维码图片地址img.width = 320; // 二维码宽度img.height = 96; // 二维码高度img.onload = () => {ctx.drawImage(img,width / 2 - 160, // 为了让图片左右剧中num + 20, // 让二维码与上方多20px的间距img.width,img.height);// 把canvas生成图片const imageUrl = canvas.toDataURL("image/jpeg", 1); // 我这里是生成为jpg了,也可以传image/png// ctx.scale(2, 2); // 可选:放大图像以便查看(根据需要调整)// console.log(imageUrl, "imageUrl"); // 生成的base64图片地址,可以输出查看// 下载图片const link = document.createElement("a");link.href = imageUrl;link.download = `分析报告.jpg`;document.body.appendChild(link);link.click();document.body.removeChild(link);this.isExportLoad = false;};}});} catch (err) {console.log(err);this.$message.error("pdf文件加载失败");}}},


http://www.ppmy.cn/embedded/171580.html

相关文章

网络安全rt是什么意思

1.什么时EDR :完全不同以往的端点被防护思路&#xff0c;而是通过云端威胁情报&#xff0c;机器学习&#xff0c;异常行为分析&#xff0c;攻击指示器等方式&#xff0c;主动发现来自外部或内部的安全威胁 。并进行自动化的阻止&#xff0c;取证&#xff0c;补救和溯源从而有效…

pt-archiver删除数据库的数据表/各种报错类型

这篇帖子是前面文的一部分延申 mysqlimport导入一亿数据的csv文件/一行命令删除表-CSDN博客 如需转载&#xff0c;标记出处 目录 pt-archiver命令格式 如果执行后出现下面报错 1&#xff09;Cannot find an ascendable index in table at /usr/bin/pt-archiver line 3233. …

[MERN] 使用 socket.io 实现即时通信功能

[MERN] 使用 socket.io 实现即时通信功能 效果实现如下&#xff1a; MERN-socket.io 实现即时聊天 Github 项目地址:https://github.com/GoldenaArcher/messenger-mern 项目使用了 MERN(MongoDB, Express, React, Node.js) socket.io 实现即时通信功能&#xff0c;并且使用了…

仿函数 greater less

仿函数 仿函数是一个类或结构体&#xff0c;通过重载 operator() 实现函数调用的效果。仿函数是一个对象&#xff0c;可以包含成员变量&#xff0c;用于存储状态。仿函数可以结合模板使用&#xff0c;使其支持多种类型。仿函数通常是内联的&#xff08;inline&#xff09;&…

Rubick:基于Electron的开源插件化桌面工具箱

Rubick 是一款基于 Electron 构建的开源桌面工具箱&#xff0c;专为追求高效办公和个性化体验的用户设计。它通过自由集成丰富的插件&#xff0c;让用户能够根据自己的需求打造极致的桌面端效能工具。 软件命名的由来Rubick 的名字来源于《DOTA2》中的英雄 Rubick&#xff08;…

探索低空经济,无人机及载人直升机低空应用技术详解

探索低空经济时&#xff0c;无人机及载人直升机低空应用技术是核心要素。以下是对这两类技术的详细解析&#xff1a; 一、无人机低空应用技术 1. 飞行控制技术 无人机需要强大的飞行控制系统&#xff0c;这涉及传感器融合、飞行器稳定性控制、自动化飞行和紧急情况下的自动避…

【蓝桥杯单片机】第十二届省赛

一、真题 二、模块构建 1.编写初始化函数(init.c) void Cls_Peripheral(void); 关闭led led对应的锁存器由Y4C控制关闭蜂鸣器和继电器 由Y5C控制 2.编写LED函数&#xff08;led.c&#xff09; void Led_Disp(unsigned char ucLed); 将ucLed取反的值赋给P0 开启锁存器…

第三十天:Scrapy 框架-分布式

文章目录 一、介绍scrapy-redis框架 二、分布式原理 三、分布式爬虫的实现 四、scrapy-redis框架的安装 五、部署scrapy-redis 六、给爬虫增加配置信息 七、运行程序 八、数据导入到mongodb中 九、数据导入到MySQL中 十、setting文件配置 一、介绍scrapy-redis框架 …