前端将表格页面导出为 PDF 并适配 A4纸张的思路

server/2024/10/23 4:30:40/

文章目录

  • 最终效果
  • 技术依赖包
  • 优缺点
  • 实现思路
  • 代码


最终效果

这个是原页面
在这里插入图片描述

这个是前端处理成 pdf 的效果
在这里插入图片描述


技术依赖包

vue2 + element + html2canvas + jsPDF

html2Canvas 官网
jsPDF 官网


优缺点

  • 优点:就是不需要后端处理 pdf 了,原本想着把 domcss 传递给后端让后端生成,奈何后端是 php,解析器不给力(这是后端跟我讲的,有没有懂 php 大佬)
  • 缺点:生成的 pdf 比较糊,而且表格在分页的时候容易分裂,我暂时没有更好的方案

实现思路

  • html 先转换成 canvas ,然后生成图片,最后再将图片转换成 pdf
  • 需要先把页面适配一下 A4 纸张大小,不然下面切割的话会出问题

代码

import html2canvas from 'html2canvas'
import { jsPDF } from 'jspdf'async handleUploadHTMLPDF() {try {this.loading.print = trueconst dom: any = document.querySelector('#printContent')const query = this.$route.queryconst id = query?.idif (dom) {html2canvas(dom).then(async canvas => {let pdf = new jsPDF('p', 'mm', 'a4') // A4纸,纵向let ctx: any = canvas.getContext('2d')let a4w = 190let a4h = 277 // A4大小,210mm x 297mm,四边各保留10mm的边距,显示区域190x277let imgHeight = Math.floor((a4h * canvas.width) / a4w) // 按A4显示比例换算一页图像的像素高度let renderedHeight = 0while (renderedHeight < canvas.height) {let page: any = document.createElement('canvas')page.width = canvas.widthpage.height = Math.min(imgHeight, canvas.height - renderedHeight) // 可能内容不足一页// 用getImageData剪裁指定区域,并画到前面创建的canvas对象中page.getContext('2d').putImageData(ctx.getImageData(0,renderedHeight,canvas.width,Math.min(imgHeight, canvas.height - renderedHeight)),0,0)pdf.addImage(page.toDataURL('image/jpeg', 1.0),'JPEG',10,10,a4w,Math.min(a4h, (a4w * page.height) / page.width)) // 添加图像到页面,保留10mm边距renderedHeight += imgHeightif (renderedHeight < canvas.height) {pdf.addPage() // 如果后面还有内容,添加一个空页}// delete page;}// 保存文件pdf.save('output.pdf')const blob = pdf.output('blob')const base64 = await this.blobToBase64(blob)// 之后想传给后端 blob 或者 base64 随便你})}} catch (err) {console.log(err)}
}
blobToBase64 = (blob: Blob): Promise<string> => {return new Promise(resolve => {const reader = new FileReader()reader.onloadend = () => resolve(reader.result as string)reader.readAsDataURL(blob)})
}


http://www.ppmy.cn/server/134073.html

相关文章

使用 Git LFS(大文件存储)

Git LFS&#xff08;Large File Storage&#xff09;是一种扩展 Git 的工具&#xff0c;旨在更有效地管理大文件的版本控制。它通过将大文件的内容存储在 Git 之外来解决 Git 在处理大文件时的性能问题。 主要特点 替代存储&#xff1a;Git LFS 不直接将大文件存储在 Git 仓库…

R包:regplot绘制回归模型的列线图

文章目录 介绍加载R包生存分析画图 介绍 R包regplot&#xff1a;这个包提供了一个函数&#xff0c;用于绘制回归模型的列线图&#xff08;Nomogram&#xff09;。这种图形是一种可视化工具&#xff0c;用于展示预测模型的结果&#xff0c;使得模型的预测过程更加直观和易于理解…

Redis --- 第四讲 --- 常用数据结构 --- Hash、List

一、Hash哈希类型的基本介绍。 哈希表&#xff1a;之前学过的所有数据结构中&#xff0c;最最重要的。 1、日常开发中&#xff0c;出场频率非常高。 2、面试中&#xff0c;非常重要的考点。 Redis自身已经是键值对结构了。Redis自身的键值对就是通过哈希的方式来组织的。把…

python虚拟环境安装

python 虚拟环境安装 目录 python 虚拟环境安装0.前言1.虚拟环境的意义2.Python 虚拟环境的创建方法3.总结 0.前言 在 Python 项目中&#xff0c;使用虚拟环境是管理项目依赖和隔离开发环境的最佳实践。它可以避免不同项目之间的依赖冲突&#xff0c;同时确保项目在开发、测试…

npm配置阿里镜像库教程

为了配置npm使用阿里镜像库&#xff0c;可以按照以下步骤进行操作。这些步骤将帮助你加快包的下载速度&#xff0c;特别是在中国地区&#xff0c;因为阿里镜像库通常比官方npm仓库响应更快。 1. 配置全局镜像 可以通过运行以下命令来将npm的全局镜像配置为阿里镜像&#xff1…

兰迪·舍克曼担任生命银行链(LBC)顾问,赋能基因数据技术发展

兰迪舍克曼&#xff08;Randy Schekman&#xff09;作为生命银行链&#xff08;Life Bank Chain, LBC&#xff09;的顾问参与其中&#xff0c;这无疑是个令人兴奋的消息&#xff01;他在生理医学和基因研究方面拥有深厚的专业知识&#xff0c;必将对LBC的使命&#xff0c;即安全…

告别装机烦恼,IT小白到IT大神都在用的免费神器

作为USB启动盘制作工具中的佼佼者&#xff0c;Rufus凭借其卓越的性能和实用性&#xff0c;赢得了众多用户的信赖。这款精巧的实用程序不仅能够将系统ISO镜像完美转换为可引导的USB安装介质&#xff0c;还提供了全面的USB设备管理功能。 Rufus的安装包仅有1.5M大小&#xff0c;…

Java程序设计:spring boot(7)——数据访问操作

目录 1 查询操作 1.1 接口方法定义 1.2 映射文件配置 1.3 UserService 1.4 UserController 2 添加操作 2.1 接口方式定义 2.2 映射文件配置 2.3 添加 commons-lang3 依赖 2.4 AssertUtil ⼯具类 2.5 ParamsException ⾃定义异常 2.6 UserService 2.7 ResultInfo …