浏览器通过js将局部dom生成pdf实现:下载、打印

安装依赖

yarn add html2canvas@1.0.0 jspdf
html2canvas建议固定为1.0.0(tip:最新版本button会出现文字偏下)

工具文件:

htmll-to-pdf.js:

import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'

/**
 * 获取pdf实例对象
 * @param elementSelector
 * @returns {Promise<unknown>}
 */
const getPdfInfo = elementSelector => {
  const targetElement = typeof elementSelector === 'string' ? document.querySelector(elementSelector) : elementSelector
  if (!targetElement) {
    throw new Error('Target element not found')
  }

  return new Promise(resolve => {
    html2Canvas(targetElement, {
      allowTaint: true, // 允许跨域图片
      scale: 2, // 提升清晰度(可选)
    })
      .then(canvas => {
        const contentWidth = canvas.width
        const contentHeight = canvas.height
        const pageHeight = (contentWidth / 592.28) * 841.89 // A4 纸比例
        let leftHeight = contentHeight
        let position = 0
        const imgWidth = 595.28 // A4 宽度
        const imgHeight = (imgWidth / contentWidth) * contentHeight
        const pageData = canvas.toDataURL('image/jpeg', 1.0)

        const pdf = new JsPDF('p', 'pt', 'a4')

        // 多页处理
        if (leftHeight < pageHeight) {
          pdf.addImage(pageData, 'JPEG', 20, 20, imgWidth - 40, imgHeight - 40)
        } else {
          while (leftHeight > 0) {
            pdf.addImage(pageData, 'JPEG', 20, position, imgWidth - 40, imgHeight - 40)
            leftHeight -= pageHeight
            position -= 841.89 // A4 高度
            if (leftHeight > 0) pdf.addPage()
          }
        }

        resolve(pdf)
      })
      .catch(() => {})
  })
}

/**
 * 生成blob 可用来上传
 * @param elementSelector
 * @returns {Promise<*>}
 */
export const htmlToPdfBlob = async elementSelector => {
  const pdf = await getPdfInfo(elementSelector)
  return pdf.output('blob')
}

/**
 * 生成pdf文件 下载到本地
 * @param elementSelector
 * @param fileName
 * @returns {Promise<void>}
 */
export const exportPDF = async (elementSelector, fileName = 'filename') => {
  const pdf = await getPdfInfo(elementSelector)
  pdf.save(`${fileName}.pdf`)
}

/**
 * 生成pdf文件 浏览器打印
 * @param elementSelector
 * @returns {Promise<void>}
 */
export const htmlToPdfPrint = async elementSelector => {
  const pdf = await getPdfInfo(elementSelector)
  pdf.autoPrint()
  window.open(pdf.output('bloburl')) // 新窗口打开
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容