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

相关推荐
SamChan905 小时前
用Python+Requests批量翻译PDF:从脚本到调度
后端·python·microsoft·ai·pdf·机器翻译
SamChan9017 小时前
PDF翻译API的JWT签名鉴权与速率限制设计:安全实战指南
网络·安全·pdf
AmyLin_200121 小时前
PDF 脱敏技术【1】:PDF 脱敏不是盖黑框:为什么敏感信息仍能被复制,正确的保护方式是什么?
安全·pdf·sdk·脱敏·文档安全·pdf 脱敏·智能脱敏
gis开发之家1 天前
《Vue3 从入门到大神50篇》Vue3 源码详解(二十):生命周期钩子源码解析 —— onMounted / onUpdated 如何实现?
前端·javascript·前端框架·vue3·vue3源码
denggun123451 天前
PDF解析 Mineru
pdf
10mAh1 天前
【PaddleOCR】扫描版 PDF 无法复制、RAG 检索为空怎么解决?——OCR 解析与版面还原实战
前端·pdf·ocr
慧都小妮子2 天前
PDF图片提取总“褪色“?Aspose.PDF 多层级提取能力详解
pdf·c#·.net·图片处理·文档处理·色彩空间
SamChan902 天前
PDF翻译中的并发控制:用Semaphore防止API限流与资源耗尽
java·jvm·pdf
ilvcn3 天前
在线 PDF 翻译工具实测:整份翻译保留表格版式,长文档处理方案
pdf
accept 99%3 天前
python版提取 PDF 的常用第三方库与工具
开发语言·python·pdf