vue3 antd modal对话框里的前端html导出成pdf并下载

1.安装html2canvas和jspdf:

javascript 复制代码
npm install html2canvas jspdf

2.新建exportToPDF.ts

javascript 复制代码
import html2canvas from 'html2canvas';
import jsPDF from 'jspdf';

const exportToPDF = async (element, filename = 'export.pdf')  => {
  const pdf = new jsPDF('p', 'mm', 'a4');
  const pageHeight = pdf.internal.pageSize.getHeight();  // A4高度(841.89mm)
  const pageWidth = pdf.internal.pageSize.getWidth();    // A4宽度(210mm)
  // const pixelsPerMM = 3.78; // 像素与毫米转换系数(96dpi)
   const pixelsPerMM = 5.5
 
  // 获取DOM实际高度
  const contentHeight = element.scrollHeight; 
  // 计算总页数 
  const totalPages = Math.ceil(contentHeight  / (pageHeight * pixelsPerMM)); // 3.8为像素-mm转换系数 
 
  let position = 0;
  for (let i = 0; i < totalPages; i++) {
    // 分段渲染Canvas 
    const canvas = await html2canvas(element, {
      scale: 2,
      y: position,              // 起始位置 
      height: pageHeight * pixelsPerMM, // 当前页高度 
      useCORS: true 
    });
 
    const imgData = canvas.toDataURL('image/jpeg',  0.92);
    const imgWidth = pageWidth - 20; // 留页边距 
    const imgHeight = (canvas.height  * imgWidth) / canvas.width; 
 
    // 添加新页(首页除外)
    if (i > 0) pdf.addPage();  
    
    pdf.addImage(imgData,  'JPEG', 10, 10, imgWidth, imgHeight);
    position += pageHeight * pixelsPerMM; // 更新截取位置
  }
  pdf.save(filename); 

}

export { exportToPDF }

pixelsPerMM这个值可以自行调节

3.在DownloadReport.vue内使用:

javascript 复制代码
<script lang='ts' setup>   
<a-modal 
    v-model:visible="status.visible" 
    title="企业报告" 
    centered 
    :forceRender="true"
    style="width:1200px">
    <div class="tools">
      <a-button type="primary" @click="exportPDF">
        报告导出
      </a-button>
    </div>
    <div ref="pdfRef" id="content-to-pdf">
        // 报告内容
    </div>
   </a-modal>      
    
    import { exportToPDF } from "@/utils/exportToPDF"
    
    // 报告导出
const exportPDF = async () => {
  const element = document.getElementById('content-to-pdf');
  exportToPDF(element, 'report.pdf'); 
}
</script>

需要注意的是,如果报告内容里有外链形式的图片,最好让后端同时进行转发或加个获取图片base64的接口,否则会报跨域问题,导致图片无法生成

相关推荐
Sheldon一蓑烟雨任平生15 小时前
Vue3 列表渲染
vue.js·vue3·v-for·列表渲染·vue3 列表渲染·v-for 循环对象·v-for与计算属性
2501_9293826515 小时前
MobiOffice解锁高级功能版 v15.9.57971 安卓手机doc, docx ppt, .pptx pdf办公软件
智能手机·pdf·powerpoint·wps
CodeCraft Studio1 天前
国产化PDF处理控件Spire.PDF教程:如何在 C# 中从 HTML 和 PDF 模板生成 PDF
pdf·c#·html·.net·spire.pdf·pdf文档开发·html创建模板pdf
duansamve1 天前
TS在Vue3中的使用实例集合
typescript·vue3
ღ᭄ꦿ࿐Never say never꧂1 天前
微信小程序 Button 组件 open-type 完全指南:从用户信息获取到客服分享的实战应用
spring boot·微信小程序·小程序·uni-app·vue3
E_ICEBLUE1 天前
高效压缩 PDF 文件大小(3 大实用的 Python 库)
python·pdf
技术钱1 天前
vue3 封装图片上传预览组件支持docx、excel、pdf、图片、txt格式
vue.js·pdf·excel
xingxing_F2 天前
PDF Protector for mac PDF文档加密解密工具
macos·pdf
985小水博一枚呀2 天前
【AI大模型学习路线】第三阶段之RAG与LangChain——第十九章(实战基于Advanced RAG的PDF问答)系统部署与测试?
人工智能·学习·langchain·pdf
励志成为美貌才华为一体的女子2 天前
本地用docling实现pdf转markdown操作笔记
笔记·pdf