vue中将elementUI和echarts转成pdf文件

若要将包含 ElementUI 组件数据和多个 ECharts 图表的数据转换为 PDF 文档,可结合 html2canvas、jspdf 以及 dom-to-image 来实现。其中,html2canvas 和 dom-to-image 可将 ECharts 图表转换为图片,jspdf 则用于生成 PDF 文档。对于 ElementUI 组件数据,可直接使用 HTML 内容添加到 PDF 中。

实现思路

  1. 准备 HTML 结构:创建包含 ElementUI 组件数据和 ECharts 图表的 HTML 结构。
  2. 转换 ECharts 图表为图片 :使用 html2canvas 或 dom-to-image 将 ECharts 图表转换为图片。
  3. 生成 PDF 文档 :使用 jspdf 创建 PDF 文档,先添加 ElementUI 组件数据的 HTML 内容,再添加 ECharts 图表的图片。

代码示例

js 复制代码
<template>
  <div>
    <!-- ElementUI 组件数据 -->
    <div id="elementui-data">
      <el-table :data="tableData" style="width: 100%">
        <el-table-column prop="date" label="日期"></el-table-column>
        <el-table-column prop="name" label="姓名"></el-table-column>
        <el-table-column prop="address" label="地址"></el-table-column>
      </el-table>
    </div>
    <!-- ECharts 图表 -->
    <div id="echarts-charts">
      <div id="chart1" style="width: 600px; height: 400px;"></div>
      <div id="chart2" style="width: 600px; height: 400px;"></div>
    </div>
    <el-button @click="exportToPDF">导出为 PDF</el-button>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue';
import * as echarts from 'echarts';
import html2canvas from 'html2canvas';
import jsPDF from 'jspdf';
import 'element-plus/dist/index.css';
import { ElTable, ElTableColumn, ElButton } from 'element-plus';

// ElementUI 表格数据
const tableData = ref([
  {
    date: '2023-05-01',
    name: '张三',
    address: '北京市朝阳区'
  },
  {
    date: '2023-05-02',
    name: '李四',
    address: '上海市浦东新区'
  }
]);

// 初始化 ECharts 图表
onMounted(() => {
  const chart1Dom = document.getElementById('chart1');
  const chart1 = echarts.init(chart1Dom);
  const option1 = {
    xAxis: {
      type: 'category',
      data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
    },
    yAxis: {
      type: 'value'
    },
    series: [
      {
        data: [120, 200, 150, 80, 70, 110, 130],
        type: 'bar'
      }
    ]
  };
  chart1.setOption(option1);

  const chart2Dom = document.getElementById('chart2');
  const chart2 = echarts.init(chart2Dom);
  const option2 = {
    xAxis: {
      type: 'category',
      data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
    },
    yAxis: {
      type: 'value'
    },
    series: [
      {
        data: [80, 150, 120, 200, 130, 70, 110],
        type: 'bar'
      }
    ]
  };
  chart2.setOption(option2);
});

// 导出为 PDF
const exportToPDF = async () => {
  const pdf = new jsPDF();
  const elementuiData = document.getElementById('elementui-data');
  const echartsCharts = document.getElementById('echarts-charts');

  // 添加 ElementUI 数据到 PDF
  pdf.html(elementuiData, {
    callback: function (pdf) {
      // 添加分页
      pdf.addPage();
      // 转换 ECharts 图表为图片并添加到 PDF
      const convertChartsToImages = async () => {
        const chartElements = echartsCharts.querySelectorAll('[id^="chart"]');
        for (const chartElement of chartElements) {
          const canvas = await html2canvas(chartElement);
          const imgData = canvas.toDataURL('image/png');
          const imgProps = pdf.getImageProperties(imgData);
          const pdfWidth = pdf.internal.pageSize.getWidth();
          const pdfHeight = (imgProps.height * pdfWidth) / imgProps.width;
          pdf.addImage(imgData, 'PNG', 0, pdf.getCursorPosition().y, pdfWidth, pdfHeight);
          // 若图片高度超出页面,添加新页面
          if (pdf.getCursorPosition().y + pdfHeight > pdf.internal.pageSize.height) {
            pdf.addPage();
          }
        }
        // 保存 PDF
        pdf.save('mixed_content.pdf');
      };
      convertChartsToImages();
    }
  });
};
</script>    

代码解释

  1. HTML 结构:包含一个 ElementUI 表格和两个 ECharts 图表,以及一个导出按钮。
  2. 初始化 ECharts 图表 :在 onMounted 钩子中初始化两个 ECharts 图表。
  3. 导出为 PDF :
    • 创建 jsPDF 实例。
    • 使用 pdf.html 方法将 ElementUI 数据添加到 PDF 中。
    • 转换 ECharts 图表为图片,并添加到 PDF 中。
    • 若图片高度超出页面,添加新页面。
    • 保存 PDF 文件。

注意事项

  • 要确保已安装 element-plus、echarts、html2canvas 和 jspdf 依赖。
  • 可根据实际需求调整 ECharts 图表和 ElementUI 组件的配置。
相关推荐
大纽耶耶8 小时前
我把 YOLO 训练做成了网页版:需求设计与技术选型
vue.js
大纽耶耶9 小时前
开发 YOLO 训练管理平台的 23 个实践教训
vue.js
Maynor在掘金9 小时前
1.9 万 Star 的 Hypit:让 AI Agent 帮你“一键复刻”爆款视频,保姆级上手教程
vue.js·github
ym hyd 1119 小时前
门诊挂号系统源码 Java+SpringBoot+Vue3 前后分离
java·vue.js·spring boot·毕设
斯内普吖10 小时前
(开源)宠物饲养系统实战指南 基于 Java + SSM + Vue + MySQL
java·vue.js·mysql·开源·宠物
可乐鸡翅yeah_10 小时前
新手梳理:HLS 线上问题,哪些该提给 CDN,哪些该找后端切片服务
开发语言·前端·javascript·vue.js·网络协议·http·m3u8在线
Q264336502310 小时前
【有源码】基于SpringBoot+Vue的博物馆展览与服务一体化平台-java博物馆数字化展品展示与交互平台设计
java·vue.js·spring boot·spring·毕业设计·javaweb·课程设计
ym hyd 11111 小时前
汽车零部件缺陷管理系统源码 Java+SpringBoot+Vue3 前后分离
java·vue.js·spring boot·汽车·毕设
paopaokaka_luck12 小时前
高校社团管理(AI辅助任务分配、协同过滤算法推荐、ECharts数据可视化、活动参与闭环、校园交流与反馈、器材借还管理)
java·前端·javascript·spring boot·数据分析·echarts
vx_Biye_Design12 小时前
springboot小区管理系统68491-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·课程设计·express