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

前端把dom页面转为pdf文件下载和弹窗预览

需求

把dom元素生成的页面生成pdf文件,实现下载和预览pdf文件。

解决方案

利用html2canvas和jsPDF实现把页面转为pdf文件。

具体实现步骤

1、给需要转换为pdf文件的dom增加id
例如:

<div id="pdf-box">
// 此处为你的页面内容
</div>

2、在utils公共工具函数文件中引入html2canvas和jsPDF

import dayjs from "dayjs";
import html2canvas from "html2canvas";

3、创建具体实现方法函数htmlToPDF

/** 将dom页面转为pdf预览 */
export const htmlToPDF = async (htmlId: string, title: string, bgColor = "#fff") => {
  const loading = ElLoading.service({
    lock: true,
    text: '导出pdf中...',
    background: "rgba(0, 0, 0, 0.7)",
  });
  let pdfDom: HTMLElement | null = document.getElementById(htmlId) as HTMLElement
  const A4Width = 595.28;
  const A4Height = 841.89;
  let canvas = await html2canvas(pdfDom, {
      scale: 2,
      useCORS: true,
      backgroundColor: bgColor,
  });
  let pageHeight = (canvas.width / A4Width) * A4Height;
  let leftHeight = canvas.height;
  let position = 0;
  let imgWidth = A4Width;
  let imgHeight = (A4Width / canvas.width) * canvas.height;
  /*
   根据自身业务需求  是否在此处键入下方水印代码
  */
  let pageData = canvas.toDataURL("image/jpeg", 1.0);
  let PDF = new jsPDF("p", 'pt', 'a4');
  if (leftHeight < pageHeight) {
      PDF.addImage(pageData, "JPEG", 0, 0, imgWidth, imgHeight);
  } else {
      while (leftHeight > 0) {
          PDF.addImage(pageData, "JPEG", 0, position, imgWidth, imgHeight);
          leftHeight -= pageHeight;
          position -= A4Height;
          if (leftHeight > 0) PDF.addPage();
      }
  }
  
  loading.close()
  // PDF.save(title + ".pdf"); // 如果需要下载pdf文件则使用这行代码
  let pdfUrl = window.URL.createObjectURL(new Blob([PDF.output('blob')], { type: "application/pdf" })) || ''
  return pdfUrl
}

4、调用htmlToPDF方法

const pdfUrl = htmlToPDF("pdf-box", 'xxx.pdf')
window.open(pdfUrl, "_blank");

备注

以上便是完整的利用html2canvas和jsPDF实现把页面转为pdf文件实现下载和预览的功能,不足的地方请多指教。


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

相关文章:

  • Android 13 编译Android Studio版本的Launcher3
  • Figma入门-基本操作制作登录页
  • CentOS7(Linux)详细安装教程(图文详解)
  • 【时时三省】NIT计算机考试基础知识
  • 使用Go 语言连接并操作 MySQL 数据库
  • 《操作系统 - 清华大学》4 -5:非连续内存分配:页表一反向页表
  • C语言蓝桥杯组题目
  • transformer.js(一):这个前端大模型运行框架的可运行环境、使用方式、代码示例以及适合与不适合的场景
  • C#里怎么样使用多线程读取多文件?
  • 深度学习实战图像缺陷修复
  • 二分查找的几种寻找情况
  • 逻辑像素与物理像素——canvas缩放后绘图区域的长宽究竟是多少
  • draggable的el-dialog实现对话框标题可以选择
  • 一篇保姆式centos/ubuntu安装docker
  • 内网渗透横向移动1
  • 鸿蒙开发——根据背景图片来构建特定颜色的蒙版
  • mac安装appuim
  • PD虚拟机启动后 Mac主机无法上网解决教程
  • 树莓派——Opencv_python基本操作
  • 【接口封装】——5、绘制头像
  • c++的类和对象(1)
  • PDF内容提取,MinerU使用
  • vscode + ROS 配置快捷编译
  • 【C++】从C语言到C++学习指南
  • GESP语法知识(快速排序)
  • VRRP虚拟路由实现主备设备负载分担