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

这篇具有很好参考价值的文章主要介绍了批量打印-----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格式,不支持tif
          let id = x.ID
          let 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 = imgUrl
          
          let 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;
            }
            
          };
          // 添加图片到 PDF
          //pdf.addImage(imgUrl, 'JPEG', 10, 10, finalWidth, finalHeight, null, 'SLOW')
          //图片居中显示
          pdf.addImage(imgUrl, 'JPEG', (pdf.internal.pageSize.getWidth() - finalWidth) / 2, 20, 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 = false
          alert('错误信息为:'+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 = url

      console.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元素文章来源地址https://www.toymoban.com/news/detail-639737.html

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

到了这里,关于批量打印-----jsPDF将图片转为pdf,并合并pdf的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【jspdf】前端html生成pdf的两种办法 以及 引入中文字体

    1、使用canvas把html生成图片,然后使用jspdf生成pdf。优点:生成的pdf 样式还原度极高,缺点:图片形式的pdf无法编辑 2、直接使用jspdf的html方法直接把html生成pdf。优点:可编辑,缺点:只是把文本内容搂出来生成pdf,也就是说样式基本无,而且jspdf不支持中文字体的,如果有中

    2024年02月10日
    浏览(45)
  • Html转PDF,前端JS实现Html页面导出PDF(html2canvas+jspdf)

    一、背景介绍 ​ 当我们在不想改变后端代码的同时想是纯html页面导出PDF,那么(html2canvas+jspdf)就是无疑最好的选择,导出时它不占用我们服务器的资源,而是由用户本地自行执行js文件下载PDF,不占用我们系统的带宽,所以这无非是最好的选择方式。 二、疑问 1、为什么要

    2024年01月23日
    浏览(56)
  • 前端vue基于html2canva jspdf 实现前端页面加水印 并导出页面PDF

    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随

    2024年02月03日
    浏览(45)
  • 使用Python批量将Word文件转为PDF文件

    说明:在使用Minio服务器时,无法对word文件预览,如果有需要的话,可以将word文件转为pdf文件,再存储到Minio中,本文介绍如何批量将word文件,转为pdf格式的文件; 首先,需要安装一个库, pywin32 ; 可以在cmd窗口敲下面的命令安装,使用阿里云镜像: 如果你使用的是pycha

    2024年02月12日
    浏览(58)
  • html2Canvas+jsPDF 下载PDF 遇到跨域的对象存储的图片无法显示

        一、问题原因  对象存储的域名和你网址的域名不一样,此时用Canvas相关插件 将DOM元素转化为PDF,就会出现跨域错误。 二、解决办法  两步 1. 图片元素上设置属性  crossorigin=\\\"anonymous\\\"  支持原生img和eleme组件  2. 存储桶设置资源跨域访问 阿里腾讯云为例:↓ 阿里云OS

    2024年02月15日
    浏览(47)
  • Python实现Word、Excel、PPT批量转为PDF

    今天看见了一个有意思的脚本Python批量实现Word、EXCLE、PPT转PDF文件。 因为我平时word用的比较的多,所以深有体会,具体怎么实现的我们就不讨论了,因为这个去学了也没什么提升,不然也不会当作脚本了。这里我将其放入了pyzjr库中,也方便大家进行调用。 你可以去下载p

    2024年02月10日
    浏览(62)
  • 纯前端--原生js将html页面变成pdf文件(html2canvas+jsPDF)

    1、将文档放在本地,用原生js进行引用和使用。 ① 新建一个名为 html2canvas.min.js 的文件,并且将线上的内容进行复制。 ② 引入 js 文件: 2、使用 npm 进行安装使用: 待续。。。 github 中文网站 CDN Jspdf.es.js:ES 2015 模块格式。 Jspdf.umd.js:UMD模块格式,用于 AMD 或脚本标签加载

    2024年02月08日
    浏览(57)
  • 多张图片转为pdf怎么弄?

        多张图片转为pdf怎么弄?在网络传输过程中,为了避免图片格式文件出现差错,并确保图片的清晰度和色彩不因不同设备而有所改变,常见的做法是将图片转换为PDF格式。然而,当涉及到多张图片时,逐一转换将会变得相当繁琐,这时候我们可以将多张图片同时间转换成

    2024年02月10日
    浏览(61)
  • Word转为PDF后图片模糊怎么办?Word转为PDF的技巧介绍

    将Word文档转为PDF是我们日常办公和文档处理中常见的需求。PDF格式的优势在于跨平台兼容性、保留原始格式、文档保护以及方便共享和分发等方面。本文将探讨Word转为PDF后图片模糊怎么办?Word转为PDF的技巧有哪些?通过这些问题的答案,可以帮助您更好的利用文件转换工具。

    2024年02月10日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包