当前位置: 首页 > news >正文

PDF 下载弹窗 content 区域可行性方案

需求:按钮点击下载弹窗 content 内容为 PDF

实现方案:

  • 获取弹窗 content 的 DOM 元素:通过ref获取需要截图的内容区域。

  • 将 DOM 转换为图片:使用 html2canvas 库将 DOM元素渲染为 Canvas ,在转换为图片。

  • 将图片生成PDF:使用 jspdf 库创建 PDF 文档,将图片添加到 PDF 中。

  • 触发 PDF 下载:通过 jspdf 的 API 生成 PDF 文件并触发浏览器下载。

1.安装依赖

npm install html2canvas jspdf --save

2.组件实现

核心是给弹窗的 content 区域添加和 ref,并绑定下载按钮的点击事件:

import html2canvas from 'html2canvas';
import jsPDF from 'jspdf';// 逻辑部分
// 创建ref用于获取content区域的DOM
const contentRef = useRef(null);// 下载PDF的核心函数
const downloadAsPDF = async () => {// 1. 检查content区域是否存在if (!contentRef.current) return;try {// 2. 使用html2canvas将DOM转为Canvasconst canvas = await html2canvas(contentRef.current, {useCORS: true, // 解决跨域图片问题scale: 2, // 缩放比例,提高清晰度(默认1,2表示2倍分辨率)logging: false // 关闭控制台日志});// 3. 将Canvas转为图片数据const imgData = canvas.toDataURL('image/png');// 4. 创建PDF文档(A4尺寸,纵向)const pdf = new jsPDF('p', 'mm', 'a4');// 获取A4纸的尺寸(单位:mm)const a4Width = 210; const a4Height = 297;// 获取图片的实际尺寸(单位:px)const imgWidth = canvas.width; const imgHeight = canvas.height;// 计算图片在PDF中的缩放比例(保持宽高比,适应A4宽度)const scale = a4Width / imgWidth; const pdfImgHeight = imgHeight * scale;// 5. 将图片添加到PDF(x=0, y=0,宽度为A4宽度,高度按比例计算)pdf.addImage(imgData, 'PNG', 0, 0, a4Width, pdfImgHeight);// 6. 触发下载(文件名自定义)pdf.save('弹窗内容.pdf');} catch (error) {console.error('下载PDF失败:', error);}};
// DOM部分
return (<><Modaltitle="查看AI评估"open={aiResumeModalOpen}footer={null}centeredonCancel={handleCancel}width={1000}classNames={{content: styles.myContent,header: styles.filterHeader,body: styles.filterBody,}}footer={<Button onClick={downloadAsPDF}>PDF下载</Button>}><div ref={contentRef}><Flex vertical gap={30} className={styles.filterBody}><ApplyPeopleHead applyDetail={selectApplyDetail} /><ApplyPeopleAiResume selectApplyDetail={selectApplyDetail} /></Flex></div></Modal></>
)

3.分页处理(可选)

如果 content 内容超过一页 A4 纸,可通过计算高度分割图片为多页:

// 在添加图片时判断是否需要分页
const totalPages = Math.ceil(pdfImgHeight / a4Height); // 计算总页数
let yPosition = 0; // 当前页的Y轴起始位置for (let i = 0; i < totalPages; i++) {pdf.addImage(imgData, 'PNG', 0, yPosition, a4Width, pdfImgHeight);if (i < totalPages - 1) {pdf.addPage(); // 新增一页yPosition = -a4Height * i; // 调整下一页图片的起始位置}
}

http://www.dtcms.com/a/548657.html

相关文章:

  • 读取实验室原始记录单PDF内容
  • Faster-Whisper命令和意图识别程序设计调优:上下文感知和领域词汇增强
  • 从游戏引擎到AI动力核心
  • 人机交互的软件工程方法实验报告(黑龙江大学)
  • 专题:2025机器人产业的变革与展望白皮书:人形机器人与工业机器人洞察|附130+份报告PDF、数据、绘图模板汇总下载
  • 邢台市网站制作还是网站好
  • 技术解析:CO与NO₂双气体监测如何构筑协同化安全防线
  • Rust 中的 SIMD 指令优化:从原理到实践
  • 如何通过CRM系统实现精准营销?从数据驱动到策略优化的全流程方法
  • [MySQL]数值函数
  • 从SQL Server到KingbaseES:一步到位的跨平台迁移与性能优化指南
  • UG482 (v1.9)中文版
  • 我发现了windows的tracert命令的一个bug---ICMP重定向包详尽分析
  • PowerShell 入门文档
  • Notepad++官方下载渠道
  • 【问题】Android Studio专用C盘空间过大问题:迁移相关程序文件
  • 北数云|利用Limix模型对tabular-benchmark数据集实现分类和回归任务
  • 免费建站优化外包公司能不能去
  • Fluid 正式入驻青云 KubeSphere Marketplace,共建云原生数据加速新生态
  • Chapter14—中介者模式
  • Python 教程:将 PPT(X) 转换为 PDF
  • [MySQL]字符串函数
  • h5游戏免费下载:暴打小苹果
  • Java 网络编程:TCP 与 UDP 的「通信江湖」(基于TCP回显服务器)
  • VMD-Transformer-LSTM组合模型锂电池剩余寿命预测(NASA电池数据集容量特征提取+RUL电池剩余寿命预测)MATLAB代码
  • 告别手搓PPT:实测四款免费AI生成工具
  • 如何在 iPhone 上录制屏幕 - 三大方法
  • 界面简洁,上手快!适合新手的免费PPT生成软件推荐
  • cdr做网站新乐做网站优化
  • 长沙网站建设联系电话asp网站免费模板下载