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

news/2025/3/9 21:18:41/

项目需求是把一个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/news/1577904.html

相关文章

恢复IDEA的Load Maven Changes按钮

写代码的时候不知道点到什么东西了&#xff0c;pom文件上的这个弹窗就是不出来了&#xff0c;重启IDEA&#xff0c;reset windos都没用&#xff0c;网上搜也没收到解决方案 然后开打开其他项目窗口时&#xff0c;看到那个的功能名叫 Hide This Notification 于是跑到Setting里…

Java虚拟机之垃圾收集(一)

目录 一、如何判定对象“生死”&#xff1f; 1. 引用计数算法&#xff08;理论参考&#xff09; 2. 可达性分析算法&#xff08;JVM 实际使用&#xff09; 3. 对象的“缓刑”机制 二、引用类型与回收策略 三、何时触发垃圾回收&#xff1f; 1. 分代回收策略 2. 手动触发…

大语言模型(LLM)和嵌入模型的统一调用接口

ChatModelFactory、EmbeddingModelFactory 讲解代码&#xff1a;import os from dotenv import load_dotenv, find_dotenv_ load_dotenv(find_dotenv())from langchain_openai import ChatOpenAI, OpenAIEmbeddings, AzureChatOpenAI, AzureOpenAIEmbeddingsclass ChatModelF…

【GPT入门】第1课准备环境

【GPT入门】第1课 准备环境 1.安装conda环境 参考我的安装文档&#xff1a;https://blog.csdn.net/spark_dev/article/details/145071250 2.安装idea,或其它开发软件 3.idea中选择conda的python idea会为每个项目配置一个独立的python环境&#xff0c;方便python版本管理 新建…

学单片机能从事什么工作?

学单片机能从事什么工作&#xff1f; 学习单片机技术可以为你打开多个职业方向的大门&#xff0c;尤其是在电子工程、自动化控制和嵌入式系统开发领域。以下是学习单片机后可以从事的一些工作&#xff1a; 嵌入式软件工程师&#xff1a;负责编写、测试和维护嵌入式系统的软件。…

【电控笔记z29】扰动估测器DOB估测惯量J-摩擦系数B

基本原理 扰动估测器的核心思想是通过向电机系统施加特定的扰动信号&#xff0c;观察系统响应的变化&#xff0c;然后利用系统的动态模型和控制理论来估计未知参数&#xff0c;如惯量和摩擦系数 。一般基于电机的运动方程建立数学模型&#xff0c;结合观测到的电机实际运行数据…

c语言笔记 标准输入缓冲区

在C语言中&#xff0c;标准输入缓冲区&#xff08;如键盘输入&#xff09;的行为与是否按下回车键有关&#xff0c;但 按下回车键并不会直接“清空”缓冲区&#xff0c;而是会触发缓冲区的数据提交给程序处理。以下是关键点的详细解释&#xff1a; 1. 缓冲区的类型 行缓冲&…

UI自动化测试Selenium安装教程(1)

Selenium是广泛使用的web自动化测试工具。它使用的是Python语言&#xff0c;通过模拟用户在浏览器中的操作来测试web应用程序。Selenium提供了丰富的API接口&#xff0c;使得开发人员可以方便地编写自动化测试脚本。同时&#xff0c;Selenium还支持多种浏览器和操作系统&#x…