前端打印、生成PDF的那些事

news/2024/11/17 4:30:59/

前端打印、生成PDF的那些事

概要

最近项目中经常做到前端打印、生成PDF功能这篇文章主要是记录下遇到的问题、以及实现方案

使用到的库

  • html2canvas
    npm i html2canvas
    yarn add html2canvas
  • jspdf
    npm i jspdf
    yarn add jspdf
  • print-js
    npm i print-js
    yarn add print-js

打印

这个功能我们使用到print-js库来实现

print({printable: 'print-template',//需要打印的元素idtype: "html",// 打印内容的类型targetStyles: ["*"],scanStyles: false, // 保留样式、这里需要设置为falsestyle: getPrintStyle(), // 此处接受一个 css 样式字符串
})
// 将scanStyles 设置为 false 是为了更好的解决打印时出现的内容被截断的问题、此处设置为false,然后我们就可以自己写样式来定义打印模板的展示方式。//style 的值我们可以写一个函数返回
const getPrintStyle =() => {return `#print-template {font-weight: 400;font-size: 12px;}table td {padding: 8px;}table th {white-space: nowrap;padding: 8px;}table tr {page-break-inside: avoid;}#print-template .date {padding-bottom: 12px;font-weight: 600;}`
}

使用上述的方式就能解决打印内容被截断的问题了。

生成PDF

这个功能我们使用到html2canvas 和 jspdf库来实现
实现思路:将需要生成PDF的DOM节点使用html2canvas 生成 canvas 再使用 canvas.toDataURL 方法将 canvas转成图片base64、然后使用 jspdf 的 addImage方法将图片base64 转成PDF。

将二者一起封装成方法:如下

const generatePDF = (selector: string, fileName: string) => {const element: any = document.querySelector(selector);const opts = {scale: 12, // 缩放比例,提高生成图片清晰度useCORS: true, // 允许加载跨域的图片allowTaint: false, // 允许图片跨域,和 useCORS 二者不可共同使用tainttest: true, // 检测每张图片已经加载完成logging: true // 日志开关,发布的时候记得改成 false};return html2Canvas(element, opts).then(canvas => {const contentWidth = canvas.width;const contentHeight = canvas.height;// 一页pdf显示html页面生成的canvas高度;const pageHeight = (contentWidth / 592.28) * 841.89;// 未生成pdf的html页面高度let leftHeight = contentHeight;// 页面偏移let position = 0;// a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高const imgWidth = 595.28;const imgHeight = (592.28 / contentWidth) * contentHeight;const pageData = canvas.toDataURL("image/jpeg", 1.0);// a4纸纵向,一般默认使用;new JsPDF('landscape'); 横向页面const PDF = new JsPDF(undefined, "pt", "a4");// 当内容未超过pdf一页显示的范围,无需分页if (leftHeight < pageHeight) {// addImage(pageData, 'JPEG', 左,上,宽度,高度)设置PDF.addImage(pageData, "JPEG", 0, 0, imgWidth, imgHeight);} else {// 超过一页时,分页打印(每页高度841.89)while (leftHeight > 0) {PDF.addImage(pageData, "JPEG", 0, position, imgWidth, imgHeight);leftHeight -= pageHeight;position -= 841.89;if (leftHeight > 0) {PDF.addPage();}}}PDF.save(fileName + ".pdf");}).catch(error => {console.log("打印失败", error);});};

调用:generatePDF('元素选择器', '导出的PDF文件名')

小结

1.上述导出PDF的功能还有一些问题没有完善、例如如果内容时table表格 的时候需要精准计算每一行的高度、再进行计算最终动态改变position偏移量来解决table内容被截断的问题。后续有空补上这部分代码。


http://www.ppmy.cn/news/886268.html

相关文章

C# Winfrom将DataGridView数据导入Excel

1.项目添加Word和Excel的COM类型库引用 2.创建Excel工作表 //定义Excel操作对象Microsoft.Office.Interop.Excel.Application excelApp new Microsoft.Office.Interop.Excel.Application();//定义Excel工作表Microsoft.Office.Interop.Excel.Worksheet worksheet excelApp.Wo…

android开机优化-framework

android开机优化 —framework层的启动优化 文章目录 android开机优化前言一、系统应用裁剪二、系统服务裁剪1.SyStemServer和SystemServiceRegistry修改2.ZygoteInit优化3.开机动画修改4.其他细节修改 总结 前言 androd开机启动时间优化包括三个部分&#xff0c;uboot&#x…

termux python excel_termux+python使用教程

termuxpython使用教程内容摘要 termuxpython使用教程检查发现左前轮缠绕着一条很长的轮胎皮条&#xff0c;4s没办法&#xff0c;教程师姚俊&#xff0c;4s换termuxpython使用教程的话要千元左右4S各地报价在58300-638001.4豪华型&#xff0c;冷锅王教程&#xff0c;4S各地报价在…

android开发大全,Android应用案例开发大全

1&#xff0e;技术新颖&#xff0c;贴近实战n 本书涵盖了现实中几乎所有的流行技术&#xff0c;如传感器、OpenGL ES 3.0、增强现实、动态壁纸、LBS百度地图的二次开发、移动办公、实时流体仿真计算引擎、服务端和Android端的交互等。n 2&#xff0e;实例丰富&#xff0c;讲解详…

(樱花飞舞背景)抖音同款程序员3d旋转正方体相册,送给你最爱的TA吧

上面的是效果图 首先建立一个文件夹&#xff0c;然后我们的操作在里面完成&#xff0c;十分简单 1.建立一个css文件夹&#xff0c;里面建立一个名为index.css的文件&#xff0c; 注意&#xff1a;记得修改后缀名的时候&#xff0c;要把后缀名显示出来&#xff0c;文件扩展名要打…

HTML+CSS实现的动态背景图

HTMLCSS创建的月亮星空背景章目录 前言一、主要用到的东西二、使用步骤1.HTML部分代码2.填充样式&#xff0c;布局。 总结 前言 本篇文章是用HTML和CSS创建的星空和月亮背景动态特效&#xff0c;适用于小白学习&#xff08;我也是小白&#xff0c;要是有什么错误的地方&#x…

android黑屏日志_关于Android9.0开机黑屏一段时间才加载launcher界面的解决方法

前言 最近做9.0项目,发现开机的时候,会先显示壁纸一段时间,再去加载launcher,如果壁纸是黑色的,则会导致开机动画结束后,显示黑屏一段时间,再看到launcher。 调试抓log 遇到问题,当然就是看开机日志了。一番折腾,找到比较有用的log如下: 20:10:50.453 769 1910 I Act…

css3 箭头动态效果,CSS3制作上下跳动动画箭头效果

动画效果如下&#xff1a; 代码如下&#xff1a; 1 2 3 4 5 欢迎关注-勇淘未来 6 7 8 /*黑色半圆是图片&#xff0c;上下箭头也是图片*/ 9 .footer_btn{text-align:center;line-height:47px;} 11 keyframes bounce-down { 12 25% {transform: translateY(-3px);} 13 50%{…