首页 > 其他分享 >html2canvas前端生成PDF开箱即用

html2canvas前端生成PDF开箱即用

时间:2024-06-12 14:32:30浏览次数:20  
标签:canvas img height html2canvas width 开箱 let var PDF

目录

1.下载html2canvas、jspdf

2.创建工具类exportPdf 文件

3.页面中使用


需求:将页面展示的所有信息都导出一个pdf文件 

实现前端生成PDF只要3步 

1.下载html2canvas、jspdf

npm i [email protected]
npm i [email protected]

2.创建工具类exportPdf js文件 复制即用

// 导出页面为PDF格式
import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'
import $ from 'jquery'

/**
 * 单页pdf
 */
function Recurrence (el) {
  let nodes = $(el).children()
  if (nodes.length) {
    let backgroundColor = el.style.backgroundColor
    for (let i = 0; i < nodes.length; i++) {
      if (nodes[i].tagName === 'SPAN' || nodes[i].tagName === 'STRONG' || nodes[i].tagName === 'EM') {
        if (!nodes[i].style.backgroundColor && backgroundColor) {
          nodes[i].style.backgroundColor = backgroundColor
        }
        Recurrence(nodes[i])
      } else {
        Recurrence(nodes[i])
      }
    }
  }
}
export function printOut (title, id, isDownload = true, isImage = false) {
  return new Promise((resolve, reject) => {
    id = document.getElementById(id)
    window.pageYoffset = 0 // 滚动置顶
    document.documentElement.scrollTop = 0
    document.body.scrollTop = 0
    html2Canvas(id, {
      // 允许跨域图片的加载
      useCORS: true,
      dpi: 300, // 将分辨率提高到特定的DPI
      // dpi: window.devicePixelRatio, //将分辨率提高到特定的DPI
      scale: 2, // 按比例增加分辨率
      // letterRendering: true,
      height: id.scrollHeight + 600,
      width: id.scrollWidth
    }).then(function (canvas) {
      if (isImage) {
        let file = canvas.toDataURL('image/png')
        resolve(file)
      } else {
        var context = canvas.getContext('2d')
        // 【重要】关闭抗锯齿
        context.mozImageSmoothingEnabled = false
        context.webkitImageSmoothingEnabled = false
        context.msImageSmoothingEnabled = false
        context.imageSmoothingEnabled = false
        var imgData = canvas.toDataURL('image/', 1.0) // 转化成base64格式
        var img = new Image()
        img.src = imgData
        img.onload = function () {
          img.width = img.width / 2
          img.height = img.height / 2
          img.style.transform = 'scale(0.5)'
          if (this.width > this.height) {
            // 此可以根据打印的大小进行自动调节
            var doc = new JsPDF('l', 'mm', [
              this.width * 0.505,
              this.height * 0.545
            ])
          } else {
            var doc = new JsPDF('p', 'pt', [
              this.width * 0.505,
              this.height * 0.545
            ])
          }
          doc.addImage(
            imgData,
            'jpeg',
            0,
            0,
            this.width * 0.505,
            this.height * 0.545
          )

          if (isDownload) {
            doc.save(title + '.pdf')
            resolve()
          } else {
            resolve(doc.output('datauristring'))
          }
        }
      }
    }).catch(err => { reject(err) })
  })
}

/**
 * 单页pdf
 */
export function getSinglePdf (title, id, isDownload = false) {
  return new Promise((resolve, reject) => {
    id = document.getElementById(id)
    window.pageYoffset = 0 // 滚动置顶
    document.documentElement.scrollTop = 0
    document.body.scrollTop = 0
    var that = this
    var shareContent = id // 需要截图的包裹的(原生的)DOM 对象
    // 打印看有没有获取到dom
    var width = shareContent.offsetWidth // 获取dom 宽度
    var height = shareContent.offsetHeight // 获取dom 高度
    var canvas = document.createElement('canvas') // 创建一个canvas节点
    var scale = 2 // 定义任意放大倍数 支持小数
    canvas.width = width * scale // 定义canvas 宽度 * 缩放
    canvas.height = height * scale // 定义canvas高度 *缩放
    canvas.getContext('2d').scale(scale, scale) // 获取context,设置scale
    html2Canvas(id, {
      // 允许跨域图片的加载
      useCORS: true,
      dpi: window.devicePixelRatio // 将分辨率提高到特定的DPI 提高四倍
      // scale: 2, //按比例增加分辨率
    }).then(function (canvas) {
      var context = canvas.getContext('2d')
      // 【重要】关闭抗锯齿
      context.mozImageSmoothingEnabled = false
      context.webkitImageSmoothingEnabled = false
      context.msImageSmoothingEnabled = false
      context.imageSmoothingEnabled = false
      var imgData = canvas.toDataURL('image/', 1.0) // 转化成base64格式
      var img = new Image()
      img.src = imgData
      img.onload = function () {
        img.width = img.width / 2 // 因为在上面放大了2倍,生成image之后要/2
        img.height = img.height / 2
        img.style.transform = 'scale(0.5)'
        if (this.width > this.height) {
          // 此可以根据打印的大小进行自动调节
          var doc = new JsPDF('l', 'mm', [
            this.width * 0.555,
            this.height * 0.555
          ])
        } else {
          var doc = new JsPDF('p', 'mm', [
            this.width * 0.555,
            this.height * 0.555
          ])
        }
        doc.addImage(
          imgData,
          'jpeg',
          10,
          0,
          this.width * 0.505,
          this.height * 0.545
        )
        if (isDownload) {
          doc.save(title + '.pdf')
          resolve()
        } else {
          resolve(doc.output('datauristring'))
        }
      }
    }).catch(err => { reject(err) })
  })
}

/**
 * 分页pdf
 * @param {*} title 标题
 * @param {*} id 容器id
 * @param {*} isDownload  是否下载
 */
export function getPdf (title, id, isDownload = false) {
  return new Promise((resolve, reject) => {
    let dom = document.querySelector(`#${id}`)

    // 截图前去掉文字背景色 html2Cancs插件不支持内联DOM背景色区分
    let creditAnalysis = dom.getElementsByClassName('need-line-change')[0]
    if (creditAnalysis) {
      let spanBg = creditAnalysis.querySelectorAll('span')
      spanBg.forEach(item => {
        item.style.backgroundColor = 'transparent'
        item.style.border = 'none'
      })
    }

    // 截图前将包含背景色的问题拆分成单个标签 html2Cancs插件不支持内联DOM背景色区分
    // let creditAnalysis = dom.getElementsByClassName('need-line-change')[0]
    // Recurrence(creditAnalysis)
    // let spanBg = creditAnalysis.querySelectorAll('span, em, strong')
    // spanBg.forEach(item => {
    //   if (item.style.backgroundColor && item.style.backgroundColor !== 'rgb(255, 255, 255)') {
    //     let backgroundColor = item.style.backgroundColor
    //     item.style.backgroundColor = 'transparent'
    //     let word = item.firstChild.nodeValue ? item.firstChild.nodeValue.split('').reverse() : []
    //     item.firstChild.nodeValue = ''
    //     if (word.length) {
    //       word.forEach(text => {
    //         let span = document.createElement(item.tagName.toLowerCase())
    //         span.innerText = text
    //         span.style.marginLeft = '-1px'
    //         span.style.backgroundColor = backgroundColor
    //         item.prepend(span)
    //       })
    //     }
    //   } else {
    //     item.style.backgroundColor = 'transparent'
    //   }
    // })

    html2Canvas(dom, {
      allowTaint: true,
      height: dom.scrollHeight,
      width: dom.scrollWidth
    }).then(function (canvas) {
      let contentWidth = canvas.width
      let contentHeight = canvas.height
      let pageHeight = contentWidth / 592.28 * 841.89
      let leftHeight = contentHeight
      let position = 0
      let imgWidth = 595.28
      let imgHeight = 592.28 / contentWidth * contentHeight
      let pageData = canvas.toDataURL('image/jpeg', 1.0)
      let PDF = new JsPDF('', 'pt', 'a4')
      if (leftHeight < pageHeight) {
        PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
      } else {
        while (leftHeight > 0) {
          PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
          leftHeight -= pageHeight
          position -= 841.89
          if (leftHeight > 0) {
            PDF.addPage()
          }
        }
      }
      if (isDownload) {
        PDF.save(title + '.pdf')
      } else {
        resolve(PDF.output('datauristring'))
      }
    }).catch(err => { reject(err) })
  })
}
/*
  将base64转换为文件,接收2个参数,第一是base64,第二个是文件名字
  最后返回文件对象
*/
export function dataURLtoFile (dataurl, filename) {
  let arr = dataurl.split(',')
  let mime = arr[0].match(/:(.*?);/)[1]
  let bstr = atob(arr[1])
  let n = bstr.length
  let u8arr = new Uint8Array(n)
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n)
  }
  return new File([u8arr], filename, { type: mime })
}

3.页面中使用 引入exportPdf文件

import { printOut, getPdf, getSinglePdf } from 'src/utils/exportPdf' // PDF

id为需要截图的范围

触发事件调用exportPdf文件导出方法

 downloadPdf () {
      let title = 'pdf导出' // 导出文件名称
      printOut(title, 'pdfWarp').then((res) => {
        // 调用即可完成pdf导出
     
      })
    },

标签:canvas,img,height,html2canvas,width,开箱,let,var,PDF
From: https://blog.csdn.net/sh11223312/article/details/139503849

相关文章

  • vue PDF预览——vue-pdf用法
    第一步 引入vue-pdfnpminstall--savevue-pdf第二步 页面中使用<template><div><button@click="open">打开PDF</button><el-dialogtitle="PDf预览":visible.sync="dialogVisible"width="50%":......
  • 【专题】2024年中国VR游戏产业现状及发展趋势研究报告合集PDF分享(附原数据表)
    原文链接:https://tecdat.cn/?p=36445原文出处:拓端数据部落公众号随着科技的日新月异,虚拟现实(VR)游戏正逐渐崭露头角,成为游戏行业的新星。其独特的沉浸式体验为玩家们带来了前所未有的娱乐方式,让人们仿佛置身于一个全新的虚拟世界。阅读原文,获取专题报告合集全文,解锁文末103份VR游......
  • JAVA开发 PDF文件生成表格,表格根据内容自动调整高度
    1、展示效果2、相关功能实现JAVA开发使用ApachePDFBox库生成PDF文件,绘制表格3、实现代码importorg.apache.pdfbox.pdmodel.PDDocument;importorg.apache.pdfbox.pdmodel.PDPage;importorg.apache.pdfbox.pdmodel.PDPageContentStream;importorg.apache.pdfbo......
  • Python 调整PDF页面尺寸大小
    在处理PDF文件时,我们可能会遇到这样的情况:原始PDF文档不符合我们的阅读习惯,或者需要适配不同显示设备等。这时,我们就需要及时调整PDF文档中的页面尺寸,以满足不同应用场景的需求。利用Python语言的高效性和灵活性,再结合Spire.PDFforPython库的强大功能,我们可以通过Python代码轻......
  • xps格式文件怎么打开,能转换成pdf吗?
    当我们接收到一个没法打开的文件,应该说是很少接触,电脑也没有安装可以打开的程序时,想要阅览这个文件该怎么办呢?可以转换成自己可以看的文件吗?格式转换这个操作其实挺常见的,毕竟很多时候,不是经常使用的文件,我们电脑没必要安装太多的应用程序,像这种一次两次偶然的情况,直接转换格式看......
  • 针对PDF文档:印章、数字签名、编辑保护、PDF/A的Java工具类
    背景  本文是基于Java语言,引入POI从而提供将富文本编辑器内的html内容转换为docx的方式。代码  引入pom坐标<dependency><groupId>cn.net.pap</groupId><artifactId>pap4j-common-pdf</artifactId><version>0.0.1</version></......
  • Java整合FreeMarker导出Pdf文件
    引入依赖<!--Freemarkerwls--> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.30</version> </dependency> <dependency> <groupId>......
  • 三个pdf工具和浏览软件(pdftk,muppdf,epdfview)
    安装pdftkpdftk是一款功能强大的PDF处理工具,主要用于对PDF文件进行各种操作。它提供了丰富的功能,包括但不限于合并、拆分、旋转、加密、解密、添加水印、从PDF文档中解出附件等。pdftk分为图形界面版本和命令行版本,适用于不同的用户需求。安装pkginstallpdftk软件需要下......
  • pythonD盘JPG全部转成PDF
    importosfromPILimportImagefromreportlab.lib.pagesizesimportletterfromreportlab.pdfgenimportcanvasdefget_jpg_files(directory):"""获取指定目录下所有JPG文件的路径"""jpg_files=[os.path.join(directory,f)f......
  • INA128UA/2K5精密仪表放大器芯片中文资料PDF数据手册引脚图产品手册产品参数
    INA128的说明INA128和INA129(INA12x)均为具备出色精度的低功耗通用仪表放大器。这些放大器采用多功能三级运算放大器设计,尺寸小巧,适用于多种应用。即使在高增益(200kHz、G=100)情况下,电流反馈输入电路也可提供宽带宽。可通过单个外部电阻器在1到10,000范围内设置任......