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的接口,否则会报跨域问题,导致图片无法生成

相关推荐
草木红20 小时前
vite 安装 vue3 和 tailwindcss
vue3·vite·tailwindcss
shouchaobao1 天前
免费PDF工具:PDF转Word/Excel/图片+AI总结+合并拆分+OCR识别,多端无广告!
pdf·word·excel
南风微微吹1 天前
2026年最新国考《行测》《申论》历年真题及答案PDF电子版(2000-2025年)
pdf·国考
凯小默2 天前
vue3-10-计算属性以及get跟set
vue3
q***01772 天前
SpringBoot实战(三十二)集成 ofdrw,实现 PDF 和 OFD 的转换、SM2 签署OFD
spring boot·后端·pdf
嗯、.2 天前
使用Itext9生成PDF水印,兼容不同生成引擎的坐标系(如: Skia、OpenPDF)
java·pdf·itextpdf·openpdf·坐标变换矩阵
拓端研究室2 天前
专题:2025AI产业全景洞察报告:企业应用、技术突破与市场机遇|附920+份报告PDF、数据、可视化模板汇总下载
大数据·人工智能·pdf
南风微微吹2 天前
2026年新大纲普通话考试真题题库50套PDF电子版
pdf·普通话
Eshine、2 天前
解决前端项目中,浏览器无法正常加载带.gz名称的文件
前端·vue3·.gz·.gz名称的js文件无法被加载
Light602 天前
Vue3 关键字速查表:从入门到进阶的全景指南
vue3·前端开发·响应式编程·组合式api·ai集成