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

需求

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

解决方案

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

具体实现步骤

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

例如:

javascript 复制代码
<div id="pdf-box">
// 此处为你的页面内容
</div>

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

javascript 复制代码
import dayjs from "dayjs";
import html2canvas from "html2canvas";

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

javascript 复制代码
/** 将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方法

javascript 复制代码
const pdfUrl = htmlToPDF("pdf-box", 'xxx.pdf')
window.open(pdfUrl, "_blank");

备注

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

相关推荐
摇滚侠4 分钟前
Vue 项目实战《尚医通》,实名认证模块静态的搭建,笔记53
vue.js·笔记
程序员鱼皮13 分钟前
又被 Cursor 烧了 1 万块,我麻了。。。
前端·后端·ai·程序员·大模型·编程
孟祥_成都25 分钟前
nextjs 16 基础完全指南!(一) - 初步安装
前端·next.js
程序员爱钓鱼26 分钟前
使用简单 JSON + 自定义 t 函数实现轻量多语言国际化(无需 next-intl)
前端·javascript·trae
一 乐38 分钟前
助农平台|基于SprinBoot+vue的助农服务系统(源码+数据库+文档)
前端·javascript·数据库·vue.js·ecmascript·springboot
vivo互联网技术40 分钟前
浅谈 AI 搜索前端打字机效果的实现方案演进
前端·vue·dom
●VON42 分钟前
Electron 小游戏实战:太空打砖块(Space Breakout)
前端·javascript·electron
新晨43742 分钟前
Vue 3 定时器清理的最佳实践
javascript·vue.js
重铸码农荣光43 分钟前
深入理解 JavaScript 原型机制:从“如何拿到小米 SU7”说起
前端·javascript
Zyx20071 小时前
深入 JavaScript 事件机制:从冒泡到事件委托的高效实践
javascript