前端将Html中某一个Dom节点转换为pdf格式文件、前端生成pdf(vue)

本文介绍了如何在前端使用html2canvas和jspdf库将HTML内容转换为PDF,并通过window.print()方法打印指定DOM节点。示例代码展示了如何选择并处理特定DOM元素,以及在打印过程中避免事件丢失的问题。
摘要由CSDN通过智能技术生成

前端Html生成PDF

npm install html2canvas -S
npm install jspdf -S
import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'
htmlToPdf (dom, pdfTitle) {
  let PDF = new JsPDF('', 'pt', 'a4')
  html2Canvas(document.querySelector(dom), {
    allowTaint: true,
    useCORS: true
  })
    .then(function (canvas) {
      let contentWidth = canvas.width
      let contentHeight = canvas.height
      console.log(contentHeight, 'contentHeight')
      let pageHeight = contentWidth / 592.28 * 841.89
      let leftHeight = contentHeight
      let position = 20
      let imgWidth = 595.28
      let imgHeight = 592.28 / contentWidth * contentHeight
      let pageData = canvas.toDataURL('image/jpeg', 1)
      if (leftHeight < pageHeight) {
        PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
      } else {
        while (leftHeight > 0) {
          PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
          leftHeight -= pageHeight
          position -= 841.89
          if (leftHeight > 0) {
            PDF.addPage()
          }
        }
      }
      PDF.save(pdfTitle + ".pdf");
    }
    )
}
<div id="pdfTest">测试前端生成pdf文件</div>
//调用
this.htmlToPdf('#pdfTest','测试文件')

在这里插入图片描述

js使用window.print()打印某一个Dom节点

直接使用window.print()会调用浏览器的打印,打印内容是整个页面(body)的内容,如果采用生成新元素替换原来body 在替换回去的话会导致原有的事件丢失掉,可以使用新元素遮罩原来的打印完成移除元素。

    printPdf(){
        let newDiv= document.createElement('div')//创建一个新的div
        newDiv.innerHTML = document.getElementById("pdfTest").innerHTML//把要打印的内容放到一个新的div里
        newDiv.style.position = 'fixed'//div宽高设置100%;position设为fixed或者absolute占满屏幕,把当前页面内容全部覆盖住
        newDiv.style.left = '0'
        newDiv.style.top = '0'
        newDiv.style.width = '794px'
        newDiv.style.height = '100%'
        newDiv.style.zIndex = '100000'
        newDiv.style.background = '#fff'
        newDiv.style.overflow = 'auto'
        document.body.appendChild(newDiv)//在body中添加创建的新结点
        window.print()
        document.body.removeChild(newDiv)
      },

还有不妥之处望大佬指出。一起进步

你可以使用 jsPDFpdf-lib 库来实现将多个 PDF 合并为一个的功能。以下是一个简单的示例: 首先安装依赖: ``` npm install jspdf pdf-lib ``` 然后在你的 Vue 组件导入依赖: ```javascript import jsPDF from 'jspdf'; import { PDFDocument, StandardFonts } from 'pdf-lib'; ``` 接下来编写一个方法,用于将多个 PDF 合并为一个: ```javascript mergePDFs(pdfs) { // 创建一个新的 PDFDocument 对象 const mergedPdf = await PDFDocument.create(); // 遍历每个 PDF 文件 for (let i = 0; i < pdfs.length; i++) { const pdf = pdfs[i]; // 将 PDF 文件转换为数组缓冲区 const pdfBytes = await pdf.arrayBuffer(); // 将 PDF 文件添加到合并的 PDF const pdfDoc = await PDFDocument.load(pdfBytes); const copiedPages = await mergedPdf.copyPages( pdfDoc, pdfDoc.getPageIndices() ); copiedPages.forEach((page) => { mergedPdf.addPage(page); }); } // 生成合并的 PDF 文件 const mergedPdfFile = await mergedPdf.save(); // 使用 jsPDF生成PDF 文件添加到页面上 const doc = new jsPDF(); const totalPages = pdfs.length; for (let pageNum = 1; pageNum <= totalPages; pageNum++) { const pdfBytes = await mergedPdfFile.arrayBuffer(); const pdfDoc = await PDFDocument.load(pdfBytes); const pdfPage = pdfDoc.getPage(pageNum); const { width, height } = pdfPage.getSize(); const pngData = await pdfPage.renderAsPNG({ scale: 1 }); doc.addImage(pngData, 'PNG', 0, 0, width, height); if (pageNum < totalPages) { doc.addPage(); } } // 保存生成PDF 文件 doc.save('merged.pdf'); } ``` 在这个方法,我们首先创建了一个新的 PDFDocument 对象。然后,我们遍历每个 PDF 文件,并将它们添加到合并的 PDF 。最后,我们使用 jsPDF 将合并的 PDF 文件添加到页面上,并保存生成PDF 文件。 你可以在你的 Vue 组件调用这个方法,并将需要合并的 PDF 文件作为参数传递给它: ```javascript const pdfs = [ '/path/to/pdf1.pdf', '/path/to/pdf2.pdf', '/path/to/pdf3.pdf', ]; this.mergePDFs(pdfs); ``` 注意,这个方法是异步的,因此你需要使用 async/await 或 Promise 来处理它的返回值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

codernmx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值