前端将图表和表格导出为PDF

本文介绍如何使用JavaScript在前端将图表和表格转换并导出为PDF文件,涵盖关键技术和实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

let exportTime = '';

const exportPdf = {
   
  /**
   * 1.图片清晰问题
   * 2.导出图片改造
   * pdf
   * @param {配置内容} options
   * options:{
   *  elementId:'#xxx',
   *  fileName:'文件名',
   *  type: 'pdf', 导出类型 pdf || img (默认pdf)
   *  load:false //是否下载
   *  titleData: {
   *    title1: '标题1',
   *    title2: '标题2',
   *    title3: '标题3',
   *  },
   *  exportTime: '导出时间',
   * }
   */
  export(options, eventFn) {
   
    if (!options.elementId) return;
    exportTime = options.exportTime || null;

    // 如果这个页面有左右移动,canvas 也要做响应的移动,不然会出现canvas 内容不全
    const xOffset = window.pageXOffset
    // 避免笔下误 灯下黑 统一写
    const A4_WIDTH = 592.28;
    const A4_HEIGHT = 841.89;

    const element = document.querySelector(options.elementId);
    // 根据A4的宽高计算DOM页面一页应该对应的高度
    let pageHeight = element.offsetWidth / A4_WIDTH * A4_HEIGHT;
    // 将所有不允许被截断的元素进行处理
    let wholeNodes = document.querySelectorAll('.export-chart-cont');
    for (let i = 0; i < wholeNodes.length; i++) {
   
      //1、 判断当前的不可分页元素是否在两页显示
      const topPageNum = Math.ceil((wholeNodes[i].offsetTop) / pageHeight);

      const bottomPageNum = Math.ceil((wholeNodes[i].offsetTop + wholeNodes[i].offsetHeight) / pageHeight);
      if (topPageNum !== bottomPageNum) {
   
        //说明该dom会被截断
        // 2、插入空白块使被截断元素下移
        let divParent = wholeNodes[i].parentNode
        let newBlock = document.createElement('div')
        newBlock.className = 'emptyDiv'
        newBlock.style.background = '#fff'

        // 3、计算插入空白块的高度 可以适当流出空间使得内容太靠边,根据自己需求而定
        let _H = topPageNum * pageHeight - wholeNodes[i].offsetTop
        newBlock.style.height = _H + 100 + 'px'
        divParent.insertBefore(newBlock, wholeNodes[i])
      }
    }
    let w = element.offsetWidth // 获取dom 宽度
    let h = element.offsetHeight // 获取dom 高度
    $(options.elementId).scrollTop(0);  // 只是截取可见范围以及以下的区域,所以先将滚动条置顶
    document.body.scrollTop = 0; // IE的
    document.documentElement.scrollTop = 0; // 其他
    let opts = {
   
      // x: options.x ? options.x : 400,
      // y: 100,
      width: w,
      height
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值