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

前端实现把整个页面转成PDF保存到本地(DOM转PDF)

一、问题
遇到一个需求,就是要把整个看板页面导出成PDF用在汇报,也就是要把整个DOM生成一个PDF保存到本地。

二、解决方法
1、解决思路:使用插件 jspdf 和 html2canvas,我用的版本如下图
在这里插入图片描述
2、代码实现

import  { jsPDF }  from 'jspdf'
import html2canvas from 'html2canvas'


// 封装成一个公共的方法(核心代码)
export const htmlToPDF = async (htmlId: string, title: string, bgColor = "#fff") => {
  const pdfDom = document.getElementById(htmlId) as HTMLElement | null;
  if (!pdfDom) {
    console.error('Element not found');
    return '';
  }

  const scale = window.devicePixelRatio || 1; // 使用设备像素比来提高清晰度
  const canvas = await html2canvas(pdfDom, {
    scale: scale,
    useCORS: true,
    backgroundColor: bgColor,
  });

  const imgProps = canvas.toDataURL('image/png'); // 使用PNG格式提高质量
  const pdf = new jsPDF({
    orientation: 'portrait',
    unit: 'px',
    format: [595.28, 841.89], // A4尺寸(以像素为单位)
  });

  const imgPropsObj = pdf.getImageProperties(imgProps);
  const pdfWidth = 576; // A4宽度减去一些边距
  // 控制页面展示 调整这个98 防止出现空白页
  const pdfHeight = (imgPropsObj.height * pdfWidth) / imgPropsObj.width - 98;

  const pageHeight = 841.89; // A4页面的高度
  let heightLeft = pdfHeight; // 剩余高度
  let y = 0; // 当前Y坐标

  // 处理分页逻辑
  while (heightLeft > 0) {
    const imgHeight = Math.min(heightLeft, pageHeight); // 当前图像可显示的高度

    pdf.addImage(imgProps, 'PNG', 0, y, pdfWidth, imgHeight); // 添加图像

    heightLeft -= imgHeight; // 减去已添加的高度
    y += imgHeight; // 移动Y坐标

    if (heightLeft > 0) {
      pdf.addPage(); // 如果还有内容,则添加新页面
    }
  }

  // 生成并返回PDF文件
  pdf.save(title + '.pdf');
  const pdfUrl = window.URL.createObjectURL(new Blob([pdf.output('blob'), { type: 'application/pdf' }]));
  return pdfUrl;
};




// 页面中调用 box:要转成pdf文件的盒子
<div id="box">
// 此处为你的页面内容
</div>
// 点击如下方法保存pdf
<button @click="fn">生产pdf</button>

// htmlToPDF 第一个参数:要生成pdf文件的盒子id  第二个参数:生成pdf的文件名
const fn = ()=> {
  const pdfUrl = htmlToPDF("box", 'xxx.pdf')
}



http://www.kler.cn/a/413116.html

相关文章:

  • QSqlTableModel的使用
  • 实验三 z变换及离散时间LTI系统的z域分析
  • Linux文件基础
  • k8s 架构详解
  • shell中的EOF,字符块
  • 【TQ2440】02 串口连接进入u-boot
  • 梧桐数据库的高效索引技术分析
  • Rust语言俄罗斯方块(漂亮的界面案例+详细的代码解说+完美运行)
  • 前端框架 react 性能优化
  • 【网络安全设备系列】10、安全审计系统
  • 在WSL 2 (Ubuntu 22.04)安装Docker Ce 启动错误解决
  • 【H2O2|全栈】Node.js(1)
  • 5G Multicast/Broadcast Services(MBS) (五)
  • (计算机网络)期末
  • 在 Spring Boot 中构造 API 响应的最佳实践
  • 985研一学习日记 - 2024.11.23
  • pytest之收集用例规则与运行指定用例
  • nn.Upsample
  • linuxCNC(三)ini配置文件说明
  • 解决 S3 文件复制时的 “can‘t start new thread“ 错误
  • CListCtrl::InsertItem和临界区导致程序卡死
  • C++-qt经验
  • Android 桌面窗口新功能推进,聊一聊 Android 桌面化的未来
  • Unity 中 多种资源加载方式的优缺点
  • MySQL(8)【聚合函数 | group by分组查询】
  • 衡山派D133EBS 开发环境安装及SDK编译烧写镜像烧录