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

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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将 echarts 图表导出为 PNG 格式,然后将 PNG 转换为 PDF 格式,您可以使用以下步骤: 1. 创建一个 `div` 元素用于容纳 echarts 图表。 2. 使用 `echarts.init` 方法初始化图表实例,并将其绑定到该 `div` 元素上。 3. 配置图表数据和样式。 4. 使用 `echarts.getDataURL` 方法将图表导出为 PNG 格式的数据URL。 5. 创建一个 `canvas` 元素,并将 PNG 数据URL 绘制到该 `canvas` 上。 6. 使用 `canvas.toDataURL` 方法将 `canvas` 元素的内容导出为 PNG 格式的数据URL。 7. 使用第三方库(如 `pdf-lib` 或 `jspdf`)将 PNG 数据URL 转换为 PDF 格式的数据URL。 8. 将 PDF 数据URL 下载或保存为文件。 下面是一个示例代码,使用了 `pdf-lib` 库来将 PNG 转换为 PDF: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>ECharts 导出 PNG 转 PDF</title> <script src="https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/echarts/dist/extension/export.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/pdf-lib/dist/pdf-lib.js"></script> </head> <body> <div id="chart" style="width: 600px; height: 400px;"></div> <script> var chart = echarts.init(document.getElementById('chart')); // 配置图表数据和样式 var option = { // ... }; // 使用 getDataURL 方法将图表导出为 PNG 数据URL var pngDataURL = chart.getDataURL({ pixelRatio: 2, // 可选,提高图表的像素比例,以获得更高的清晰度 backgroundColor: '#fff' // 可选,设置背景颜色 }); // 创建一个 canvas 元素,并将 PNG 数据URL 绘制到 canvas 上 var canvas = document.createElement('canvas'); var ctx = canvas.getContext('2d'); var img = new Image(); img.onload = function() { canvas.width = img.width; canvas.height = img.height; ctx.drawImage(img, 0, 0); // 使用 pdf-lib 将 PNG 转换为 PDF const pdfDoc = await PDFLib.PDFDocument.create(); const pngImage = await pdfDoc.embedPng(canvas.toDataURL('image/png')); const page = pdfDoc.addPage(); page.drawImage(pngImage, { x: 0, y: 0, width: img.width, height: img.height, }); // 将 PDF 数据URL 下载或保存为文件 const pdfBytes = await pdfDoc.save(); const blob = new Blob([pdfBytes], { type: 'application/pdf' }); const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = 'chart.pdf'; link.click(); }; img.src = pngDataURL; </script> </body> </html> ``` 请注意,上述示例中使用了 `pdf-lib` 库来进行 PNG 到 PDF 的转换。您需要在页面中引入 `pdf-lib.js` 文件。此外,示例中使用的 `await` 关键字需要在支持异步函数的环境中使用,或者可以将代码包装在 `async` 函数中。如果您希望使用其他库来进行 PNG 到 PDF 的转换,可以按照该库的文档进行操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值