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

批量打印-----jsPDF将图片转为pdf,并合并pdf

安装依赖并引入

import jsPDF from 'jspdf';
import { PDFDocument,  } from 'pdf-lib';

注意一、
使用jspdf将图片(jpg/jpeg/png/bmp)转pdf(记为pdfA),得到的pdf(pdfA)和需要合并的pdf(记为pdfB)类型不一致,需要将pdfA转为pdfB类型,才能合并,使用arraybuffer转,具体如下

// pdf--pdfA--是使用jspdf将图片生成的pdf
// file--pdfB--是合并pdf需要的pdf格式
const jsPdfBytes = pdf.output('arraybuffer');
const file = await PDFDocument.load(jsPdfBytes);

注意二、
jspdf 可转pdf的图片类型有jpg、jpeg、png、bpm,
不支持 tif 和 tiff 图片类型

.tif和.tiff格式的文件需要通过安装依赖
“tiff.js”: “^1.0.0”,
也是使用arrayBuffer,将图片格式转为base64,(jpg/jpeg格式,然后将该格式通过jspdf转为pdf文件)

if(x.FILE_TYPE == '.tif' || x.FILE_TYPE == '.tiff' ){const response = await fetch(imgUrl);const buffer = await response.arrayBuffer();const Tiff = require("tiff.js");const tiff = new Tiff({ buffer });imgUrl = tiff.toDataURL();
}

注意三、
async/await 和 new Promise 控制异步任务顺序执行,执行完imgToPdf()方法,再执行合并pdf 方法

注意四、
jspdf 将图片转为pdf,注意图片大小的自适应,可以通过设置图片的最大宽度来控制图片自适应的大小
const imageWidth = 100;

注意五、
因为异步任务执行可能导致批量选择文件的顺序与实际获得的文件顺序不一致,所以获取到的this.pdfFileArr,需要通过id 调整为正确的pdf文件打印顺序

图片转pdf代码:

async imgToPdf(arr) {const promises = [];arr.forEach(async (x)=>{const promise = new Promise(async (resolve,reject)=>{//jsPdf 仅支持JPG/JPEG/PNG/BMP格式,不支持tiflet id = x.IDlet imgUrl = window.URL.createObjectURL(x.FILE)//如果是tif或者tiff文件,需要转化后再进行 图片转pdf操作if(x.FILE_TYPE == '.tif' || x.FILE_TYPE == '.tiff' ){const response = await fetch(imgUrl);const buffer = await response.arrayBuffer();const Tiff = require("tiff.js");const tiff = new Tiff({ buffer });imgUrl = tiff.toDataURL();}const pdf = new jsPDF();//添加header//pdf.text('PDF Header', 10, 10);// 将图片绘制到pdf中const imageWidth = 100; // 设定图片的最大宽度const imageHeight = 0; // 设置为 0,将根据宽度等比例计算高度const img = new Image();img.src = imgUrllet finalWidth = imageWidth;let finalHeight = imageHeight;img.onload = function () {const width = img.width;const height = img.height;// 计算图片适应 PDF 页面的尺寸const aspectRatio = width / height;if (finalHeight === 0) {finalHeight = finalWidth / aspectRatio;} else if (finalWidth === 0) {finalWidth = finalHeight * aspectRatio;}};// 添加图片到 PDFpdf.addImage(imgUrl, 'JPEG', 10, 10, finalWidth, finalHeight, null, 'SLOW')const jsPdfBytes = pdf.output('arraybuffer');const file = await PDFDocument.load(jsPdfBytes);//const blob = new Blob([file], { type: 'application/PDF' })let obj = {ID: id,FILE: file}console.log("执行了------imgToPdf")resolve(obj)}).then((obj)=>{this.pdfFileArr.push(obj)}).catch((error)=>{this.loadLoading = falsealert('错误信息为:'+error)})promises.push(promise);})return Promise.all(promises)},

合并pdf代码

async mergePdf(sortList) {console.log('最终需要合并的pdf数组', sortList)let files = sortList// 创建一个新的PDF文档const mergedPdf = await PDFDocument.create();// 遍历选择的每个文件for (let i = 0; i < files.length; i++) {/**这里为.pdf 文件的遍历操作通过FileReader 读取.pdf文件,转为合并pdf所需要的pdf类型const file = files[i];const url = window.URL.createObjectURL(file)const reader = new FileReader();// 读取文件内容const fileContents = await new Promise((resolve, reject) => {reader.onload = function (event) {resolve(event.target.result);};reader.onerror = function (event) {reject(new Error("文件读取错误。"));};reader.readAsArrayBuffer(file); //blob});// 将PDF文件添加到合并的PDF文档中const pdf = await PDFDocument.load(fileContents);console.log("合并pdf---", pdf)**/const pdf = files[i];const copiedPages = await mergedPdf.copyPages(pdf,pdf.getPageIndices());copiedPages.forEach((page) => {mergedPdf.addPage(page);});}const uint8Array = await mergedPdf.save();let mergeBuffer = Buffer.from(uint8Array);const url = window.URL.createObjectURL(new Blob([mergeBuffer], { type: 'application/pdf;charset=utf-8' }));this.mergePdfUrl = urlconsole.log("pdf合并完成")console.log("新合并的pdf--", url)console.log("新合并的pdf--", mergedPdf)},

将获得的pdf文件url给iframe即可预览,iframe 自带toolbar工具栏打印

<iframe ref="printPdf"  id="printIframe" style="overflow:hidden;filter: Chroma(Color=white);border: none;width: 100%; height: 100%":src="item.url + '#toolbar=0'"></iframe><!-- #view=FitH,top -->

如果自己编写打印接口,可以通过id获取到该iframe,
调起 contentWindow.print() 即可打印该dom元素

document.getElementById('printIframe').contentWindow.print();

相关文章:

批量打印-----jsPDF将图片转为pdf,并合并pdf

安装依赖并引入 import jsPDF from jspdf; import { PDFDocument, } from pdf-lib;注意一、 使用jspdf将图片&#xff08;jpg/jpeg/png/bmp&#xff09;转pdf&#xff08;记为pdfA&#xff09;&#xff0c;得到的pdf&#xff08;pdfA&#xff09;和需要合并的pdf(记为pdfB)类…...

【Git】版本控制器详解之git的概念和基本使用

版本控制器git 初始Gitgit的安装git的基本使用初始化本地仓库配置本地仓库三区协作添加---add修改文件--status|diff版本回退--reset撤销修改删除文件 初始Git 为了能够更⽅便我们管理不同版本的⽂件&#xff0c;便有了版本控制器。所谓的版本控制器&#xff0c;就是⼀个可以记…...

C语言 棱形图案

目录 一、问题分析 上部分&#xff1a; 下部分&#xff1a; 二、代码演示 一、问题分析 如上图所示&#xff0c;我们可以将棱形进行拆解&#xff0c;分为上下两个部分。 上部分&#xff1a; 通过观察&#xff0c;我们得到 单边空格数 上半部分总行数 - 行数 - 1 …...

在idea使用GitHub账号、Copilot异常

登录GitHub显示这样的信息&#xff1a; Invalid authentication data.Connection refused: connect Failed to initiate the GitHub login process. Please try again. 修改hosts&#xff08;C:\Windows\System32\drivers\etc\hosts&#xff09;&#xff0c;添加以下参数即可…...

面试热题(反转字符串中的单词)

给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&#xff1a;输入字符串 s中可能会存在前导空格、尾随空格…...

Stable Diffusion WebUI 从零基础到入门

本文主要介绍Stable Diffusion WebUI的实际操作方法&#xff0c;涵盖prompt推导、lora模型、vae模型和controlNet应用等内容&#xff0c;并给出了可操作的文生图、图生图实战示例。适合对Stable Diffusion感兴趣&#xff0c;但又对Stable Diffusion WebUI使用感到困惑的同学&am…...

【uniapp】一文读懂app端安装包升级

一、前言 首先&#xff0c;在app端开发上线的过程中&#xff0c;会面临一个问题&#xff0c;就是关于app端的版本升级的问题。如果不做相关处理来引导用户的话&#xff0c;那么app就会出现版本没有更新出现的各种问题&#xff0c;我们常见的有在线升级和去指定地址下载安装两种…...

【算法题】2518. 好分区的数目

题目&#xff1a; 给你一个正整数数组 nums 和一个整数 k 。 分区 的定义是&#xff1a;将数组划分成两个有序的 组 &#xff0c;并满足每个元素 恰好 存在于 某一个 组中。如果分区中每个组的元素和都大于等于 k &#xff0c;则认为分区是一个好分区。 返回 不同 的好分区的…...

编写守护进程

守护进程是一个后台进程&#xff0c;当操作系统启动时就可以运行的进程&#xff0c;当操作系统结束时结束的进程&#xff0c;与终端无关。 结果 不想要了就杀死...

stable-diffusion-webui启动No Python at ‘C:\xxx\xxx\python.exe‘

打开webui.bat 把 if not defined VENV_DIR (set "VENV_DIR%~dp0%venv") 中的%~dp0venv改成自己python的安装路径就行获取直接set值即可 如 set VENV_DIRD:\Users\xxx\AppData\Local\Programs\Python\Python310 另外就是直接运行webui-user.bat也可以 如果运行…...

面试热题(合并两个有序列表)

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 合并链表这类型题也是比较经典的题了&#xff0c;因为链表是由指针相互指向而确定位置&#xff0c;所以我们只需要改变某些节点的指针便可以做到对链表进行排序 今天这个方法…...

QT生成Word PDF文档

需求&#xff1a;将软件处理的结果保存为一个报告文档&#xff0c;文档中包含表格、图片、文字&#xff0c;格式为word的.doc和.pdf。生成word是为了便于用户编辑。 开发环境&#xff1a;qt4.8.4vs2010 在qt的官网上对于pdf的操作介绍如下&#xff1a;http://qt-project.org/…...

阿里云服务器搭建WordPress建站教程基于Windows系统

本教程是使用阿里云服务器镜像系统选择的是Windows操作系统&#xff0c;手动安装WordPress博客网站全过程。本教程介绍如何在Windows操作系统的ECS实例上搭建WordPress网站。 目录 准备工作 搭建WordPress网站 解析WordPress网站域名 准备工作 创建Windows操作系统的ECS实…...

动态链接(8/11)

静态链接的缺点&#xff1a;生成的可执行文件体积较大&#xff0c;当多个程序引用相同的公共代码时&#xff0c;这些公共代码会多次加载到内存&#xff0c;浪费内存资源。 为了解决这个问题&#xff0c;动态链接对静态链接做了一些优化&#xff1a;对一些公用的代码&#xff0…...

Python 之 Http 获取网页的 html 数据,并去掉 html 格式等相关信息

Python之 Http 获取网页的 html 数据,并去掉 html 格式等相关信息 目录 Python之 Http 获取网页的 html 数据,并去掉 html 格式等相关信息...

干不完根本干不完,我也不想加班,快来围观时间管理大师

时间不够用&#xff0c;怎么办&#xff1f; 成功不靠加班。生产队的驴都不加班&#xff0c;你加什么班&#xff1f;到点就下班&#xff0c;该玩玩&#xff0c;该学习认真学&#xff0c;累了就睡觉。 你可以做任何事&#xff0c;但不必做所有事。 时间管理&#xff0c;不是管…...

常见设计模式

概念 设计模式是怎么解决问题的一种方案 常见的设计模式 单例模式 概念&#xff1a;保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。 应用&#xff1a;项目封装个websocket用于大屏&#xff0c;redux&#xff0c;vuex都应用了单例模式的思想&#xff1b…...

Android之版本号、版本别名、API等级对应关系(全)(一百六十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…...

Redis的简介,安装(Linux、Windows),配置文件的修改---详细介绍

Redis基础 文章目录 Redis基础1、Redis入门1.1、Redis简介1.2、Redis下载与安装1.2.1、在Linux系统安装Redis1.2.2、在Windows系统安装Redis 1.3、Redis服务启动与停止1.3.1、在Linux中启动服务1.3.2、在Windows中启动服务1.3.3、设置密码校验1.3.4、redis的远程连接 Redis是一…...

Vscode-工具使用

Vscode &#xff0c;这玩意儿是开源的&#xff0c;以前用收费的破解版&#xff0c;过段时间就高版本不匹配&#xff0c;这次搞个不要钱的玩玩&#xff0c;记录使用心得 下载 下载地址&#xff1a;官网 点击下载&#xff0c;但是这里有个问题下载比较慢&#xff0c;解决办法&a…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

倒装芯片凸点成型工艺

UBM&#xff08;Under Bump Metallization&#xff09;与Bump&#xff08;焊球&#xff09;形成工艺流程。我们可以将整张流程图分为三大阶段来理解&#xff1a; &#x1f527; 一、UBM&#xff08;Under Bump Metallization&#xff09;工艺流程&#xff08;黄色区域&#xff…...

Python爬虫实战:研究Restkit库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...

拟合问题处理

在机器学习中&#xff0c;核心任务通常围绕模型训练和性能提升展开&#xff0c;但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正&#xff1a; 一、机器学习的核心任务框架 机…...

Linux入门课的思维导图

耗时两周&#xff0c;终于把慕课网上的Linux的基础入门课实操、总结完了&#xff01; 第一次以Blog的形式做学习记录&#xff0c;过程很有意思&#xff0c;但也很耗时。 课程时长5h&#xff0c;涉及到很多专有名词&#xff0c;要去逐个查找&#xff0c;以前接触过的概念因为时…...