vue print.js pdf文件批量打印

需求

项目中打印使用的是print.js,但是printjs在打印pdf时一次只能打印一个pdf,需要支持打印多个pdf

解决方式

将多个pdf合并成一个,然后打印

实现

1、安装依赖
 npm install print-js
 npm install pdf-lib
2、代码
import printJS from 'print-js'
import * as pdfLib from 'pdf-lib'

// 打印方法
async print() {
   // 创建一个pdf文档用来保存合并后的文件
     const pdfDocument = await pdfLib.PDFDocument.create()

      // 循环pdf数据,这里后端返回的文件是base64格式
      for (const data of pdfBase64Data) {
        // 将base64格式转换成二进制
        // 格式转换的时候,记得把data:application/pdf;base64,去掉
        const arrayBuffer = await this.base64ToArrayBuffer(data) // 得到二进制格式数据

        // 复制pdf中的页面到新pdf中
        const pdfDoc = await pdfLib.PDFDocument.load(arrayBuffer)
        const copyPage = await pdfDocument.copyPages(pdfDoc, pdfDoc.getPageIndices())
        copyPage.forEach(item => {
          pdfDocument.addPage(item)
        })
      }

      // 保存合并后的pdf文件,得到的是一个二进制数据
      const pdf = await pdfDocument.save()

      // 将二进制的数据转换为base64,因为打印pdf时用的是base64格式
      const pdfFile = await this.arrayBufferToBase64(pdf)

      // 如果文件太大,打开的预览页面有可能会出现是空白的情况,加个setTimeout可以解决
      printJS({
        printable: pdfFile,
        type: 'pdf',
        base64: true
      })
 }

// base64转二进制
base64ToArrayBuffer(base64) {
  let binaryString = ''
  if (base64.indexOf('data:') === 0) {
    const arr = base64.split(',')
    binaryString = window.atob(arr[1])
  } else {
    binaryString = window.atob(base64)
  }

  const len = binaryString.length
  const bytes = new Uint8Array(len)
  for (let i = 0; i < len; i++) {
    bytes[i] = binaryString.charCodeAt(i)
  }
  return bytes.buffer
},

// 二进制转base64
 arrayBufferToBase64(buffer) {
  let binary = ''
  const bytes = new Uint8Array(buffer)
  const len = bytes.byteLength
  for (let i = 0; i < len; i++) {
    binary += String.fromCharCode(bytes[i])
  }
  // 对二进制字符串进行Base64编码
  return window.btoa(binary)
},

其他

1、printjs提供了一个回调,在预览弹窗关闭时触发,不闲弹窗多的情况下也可以用这种方式实现批量打印
2、如果批量打印时的数据有图片也有pdf,就可以使用onPrintDialogClose去分别调用

printJS({
   printable: pdf,
   type: 'pdf',
   base64: true,
   onPrintDialogClose: this.LoopPrintPdf // 需要传参就写成箭头函数() => this.LoopPrintPdf(data)
 })
### 使用 `pdf2` 实现在 Vue 中的打印功能 在 Vue 项目中使用 `pdf2` 进行打印并非直接通过名为 `pdf2` 的库完成,因为并不存在这样的命名库。然而,假设意图是指利用 JavaScript 或其他相关技术来处理 PDF 并实现其打印功能,则可以通过多种方式达成目标。 一种方法是借助 HTML5 和 Canvas 来渲染 PDF 页面,并结合浏览器原生 API 完成打印操作。这涉及到使用像 `pdf.js` 这样的工具包来解析和显示 PDF 文档,在此基础上添加自定义逻辑以支持打印需求[^1]。 对于更集成化的解决方案,可以考虑采用专门为此目的设计的 npm 插件,例如 `vue-to-pdf` 或者 `vue-easy-printer`,这些插件提供了更加简便的方式来进行 PDF 导出以及打印工作[^2]。 如果希望基于现有组件进一步扩展功能至包含打印选项,那么可以从已有案例获得灵感,比如针对多个PDF或图像文件创建批量打印机制的例子[^4]。值得注意的是,虽然这里提到的技术不是严格意义上的 "pdf2" 库的应用,但是它们能够满足相似的需求——即允许开发者轻松地将 PDF 处理能力融入到 Vue 应用程序当中去。 为了具体展示如何在一个简单的 Vue 组件里加入 PDF 打印的功能,下面给出了一段示范代码: ```html <template> <div id="app"> <!-- 显示区域 --> <canvas ref="myCanvas"></canvas> <!-- 控制按钮 --> <button @click="printDocument()">Print</button> </div> </template> <script> import * as pdfjsLib from 'pdfjs-dist'; // 如果需要中文支持或其他字体资源,记得引入相应的 CMap 资源 import pdfWorker from 'worker-loader!pdfjs-dist/build/pdf.worker.entry'; export default { mounted() { this.loadAndRenderPage(); }, methods: { async loadAndRenderPage() { try { const loadingTask = pdfjsLib.getDocument('path/to/your/document.pdf'); const pdf = await loadingTask.promise; const page = await pdf.getPage(1); let scale = 1.5; let viewport = page.getViewport({ scale }); // 获取 canvas 上下文对象用于绘图 var canvas = this.$refs.myCanvas; var context = canvas.getContext('2d'); canvas.height = viewport.height; canvas.width = viewport.width; // 渲染页面内容到画布上 var renderContext = { canvasContext: context, viewport: viewport }; await page.render(renderContext).promise; } catch (error) { console.error(error); } }, printDocument(){ window.print(); // 触发默认打印机对话框 } } } </script> ``` 此示例展示了怎样加载一个 PDF 文件并通过 Canvas 将第一页的内容呈现出来;同时提供了一个 “Print” 按钮触发浏览器内置的打印流程。当然实际应用可能还需要根据业务场景调整细节部分,如多页处理、样式定制等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值