纯JS将HTML生成pdf

该方案使用纯js脚本将页面html内容转换成pdf

设计脚本

  1. jspdf
  2. html2canvas
  3. html2pdf

jsPdf

jsPDF是一个轻量级且强大的JavaScript库,它允许开发者在浏览器中直接生成PDF文件。以下是关于jsPDF的详细介绍:

  1. 项目简介:
  • jsPDF提供了在前端创建、编辑和下载PDF文档的能力,无需依赖服务器端的支持。
  • 它为Web应用提供了更多的可能性,使得开发者能够直接在客户端生成PDF文件。
  1. 核心功能:
  • 文本处理:支持添加、定位和样式化PDF中的文本。
  • 图像处理:可以将图片插入到PDF中,支持多种格式(如JPEG、PNG、SVG)。
  • 形状绘制:提供画线、矩形、椭圆等基本图形的API。
  • 页面管理:能够添加、删除和调整PDF页面的布局。
  • 单位与尺寸控制:支持毫米、英寸、点等多种度量单位,并能进行精确的尺寸计算。
  1. 底层实现
  • jsPDF基于Adobe的PDF规范,采用HTML5 Canvas和SVG作为渲染后端。
  • 它可以利用JavaScript对DOM元素的遍历能力,将网页内容转换成PDF。
  • 对于更复杂的SVG图形,jsPDF依赖于第三方库如html2canvas和svg-to-pdfkit进行转换。
  1. 兼容性:
  • jsPDF兼容大多数现代浏览器,包括Chrome, Firefox, Safari, Edge等。
  • 由于其基于Canvas,所以对IE的支持有限,需要额外引入polyfill库。
  1. 应用场景:
  • 报表导出:在数据可视化应用中,用户可以一键将图表或数据分析结果保存为PDF报告。
  • 发票打印:网购平台可以在订单完成后生成PDF发票供用户下载或打印。
  • 电子书籍:制作在线阅读器时,jsPDF可用于生成电子书的PDF版本。
  • 合同签署:在线合同签署服务可以借助jsPDF生成待签字的PDF文档。
    特点:
  • 易用性强:jsPDF提供了一套直观的API接口,使得生成PDF文档变得简单快捷。
  • 灵活性高:可以自定义样式、布局和内容,满足各种设计需求。
  • 离线可用:所有处理都在客户端完成,不需服务器交互,确保用户隐私。
  • 社区活跃:项目维护更新频繁,有丰富的插件和示例代码可供参考和扩展。

使用注意事项:

  • jsPDF本身不支持直接渲染中文文本,但可以通过结合html2Canvas等库先将HTML内容转换为图片,再将其添加到PDF中。
  • 在处理复杂布局或样式时,可能需要额外的工作来确保生成的PDF文件符合预期。
    总的来说,jsPDF是一个功能强大、灵活易用的前端PDF处理库,适用于各种需要生成PDF文件的Web应用场景。

html2canvas

html2canvas是一个JavaScript库,其主要功能是将HTML元素转换为Canvas图像。

  1. 功能概述
  • HTML转Canvas:html2canvas能够将HTML元素(包括HTML5 Canvas)转换为Canvas图像。这使得开发者能够在客户端进行截图、图像生成等操作。
  • 截图与分享:由于能够将网页内容转换为图像,html2canvas常被用于实现网页截图、社交媒体分享等功能。
  1. 使用方法
  • 安装与引入:
    • 可以直接通过CDN引入html2canvas的最新版本。
    • 也可以通过npm或yarn等包管理工具进行安装和引入。
  • 基本用法:
    • 传入需要转换的HTML元素(可以是CSS选择器、DOM元素或jQuery对象)。
    • 调用html2canvas函数后,会返回一个Promise对象,当Canvas图像生成后,可以在then方法中进行后续操作。
  1. 常用选项
  • scale:控制生成图片的质量,取值范围为0到1,默认为1。例如,设置scale为0.5时,生成的图片质量为原图的一半。
  • backgroundColor:指定生成的Canvas图像的背景色,可以使用CSS颜色值或十六进制颜色值。
  • useCORS:默认情况下,html2canvas不支持跨域的图片转换。如果需要转换跨域图片,可以设置useCORS选项为true。
  1. 注意事项
  • 兼容性:html2canvas在大多数现代浏览器中都有良好的兼容性,但可能在一些较旧的浏览器或特定环境下存在兼容性问题。
  • 性能:对于较大的HTML元素或复杂的页面结构,转换过程可能会消耗较多的计算资源,并可能导致页面卡顿或崩溃。因此,在使用时需要注意性能优化。
  • 跨域问题:由于浏览器的同源策略限制,当尝试转换跨域的图片时可能会遇到问题。此时,可以通过设置useCORS选项或使用代理服务器等方法来解决。
  1. 示例代码
// 引入html2canvas  
<script src="https://cdn.jsdelivr.net/npm/html2canvas@latest"></script>  
  
// HTML元素  
<div id="capture" style="padding: 10px; background: #f5da55;">  
  <h4 style="color: #fff;">Hello world!</h4>  
</div>  
  
// JavaScript代码  
html2canvas(document.querySelector("#capture")).then(canvas => {  
  document.body.appendChild(canvas); // 将生成的Canvas图像添加到页面中  
});

html2pdf

html2pdf 是一种将 HTML 页面转换为 PDF 文档的解决方案。

  1. 定义与功能:
  • html2pdf 是一种工具或库,用于将 HTML 页面转换为 PDF 格式。
  • 它允许开发人员快速、便捷地生成高质量的 PDF 文件,无论是在 Web 网页上还是在服务器环境中。
  1. 技术实现:
  • html2pdf 有多种实现方式,包括使用 PHP 编写的库(如 Html2Pdf、xhtml2pdf 等)以及 JavaScript 实现的库(如 jsPDF 结合 html2canvas)。
  • 这些库通常依赖于其他库(如 TCPDF、html2canvas 等)来辅助实现 HTML 到 PDF 的转换。
  1. 主要特点:
  • 高质量输出:生成的 PDF 文件通常具有良好的排版和格式,能够保留 HTML 中的样式、图像和链接等元素。
  • 灵活性:提供了丰富的选项和配置,可以根据需求进行定制,如设置页面大小、页眉页脚、字体样式等。
  • 跨版本兼容:如 Html2Pdf 支持 PHP 5.6 至 8.2,适配广泛的开发环境。
  • 易用性:提供了简洁的 API 和丰富的示例代码,使得将 HTML 转换为 PDF 变得非常容易。
  1. 应用场景:
  • 发票生成:将动态生成的 HTML 发票转换为 PDF,便于电子发送或打印。
  • 文档制作:创建 PDF 手册或说明书,支持自定义布局和样式。
  • 报告导出:网站或应用程序中的数据报告可以方便地导出为 PDF,方便用户离线查看。
  • 电子书制作:将 HTML 格式的电子书转换为 PDF,以便在各种设备上阅读。

使用注意事项:

  • 性能:对于较大的 HTML 元素或复杂的页面结构,转换过程可能会消耗较多的计算资源,并可能导致页面卡顿或崩溃。
  • 跨域问题:在转换跨域图片时可能会遇到问题,此时可以通过设置 CORS 选项或使用代理服务器等方法来解决。
  • 字体嵌入:确保 PDF 中使用的字体已正确嵌入,以避免在其他设备上出现字体不一致的问题。

样例

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
	<head>
	</head>
<body>
  <div class="tableBody">  
			<div class="layui-input-block">
				<button id="download_pdf" class="layui-btn" lay-submit lay-filter="form-submit">生成pdf内容</button>
			</div>
		  <div id="download_info" class="download_info">
			<span>
				这是一个测试内容
			</span>
		  </div>
  </div>
<script src="./jquery-3.6.0.min.js"></script>
<script src="./jspdf.debug.js"></script>
<script src="./html2pdf.bundle.min.js"></script>
<script src="./html2canvas.min.js"></script>
<script src="./index.js"></script>
</body>
</html>
$(function() {
	//下载结果
	$('#download_pdf').on('click',function(){			
		html2canvas(document.querySelector("#download_info")).then(canvas => {
			//document.body.appendChild(canvas)
			const marginBottom = 0
			let canvasWidth = canvas.width
			let canvasHeight = canvas.height + marginBottom * 2
			let pageHeight = canvasWidth / 592.28 * 841.89 + marginBottom * 2
			let allPageHeight = canvasHeight
			let position = 0
			let imgWidth = 595.28
			let imgHeight = 592.28 / canvasWidth * canvasHeight
			let pageData = canvas.toDataURL('image/jpeg', 3.0)
			//通过html2canvas将html渲染成canvas,然后获取图片数据
			let PDF = new jsPDF('', 'pt', 'a4')
			if (allPageHeight < pageHeight) {
			  PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
			} else {
			  while (allPageHeight > 0) {
				PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
				allPageHeight = allPageHeight - pageHeight - marginBottom
				position = position - 841.89 - marginBottom
				if (allPageHeight > 0) {
				  PDF.addPage()
				}
			  }
			}
			//输出保存命名为content的pdf
			PDF.save('wf.pdf');
		});
	});
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/767219.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++:二维数组的遍历

方式一&#xff1a; #include <vector> #include <iostream> int main() { // 初始化一个2x3的二维向量&#xff08;矩阵&#xff09; std::vector<std::vector<float>> matrix { {1.0, 2.0, 3.0}, // 第一行 {4.0, 5.0, 6.0} // 第二行 };…

企业备份NAS存储一体机

企业文件服务器上的数据、员工电脑里的数据以及NAS存储内数据&#xff0c;需要及时备份&#xff0c;Inforternd存储设备内置了强大的备份服务器功能&#xff0c;无需额外费用&#xff0c;就能轻松将重要数据备份至安全可靠的存储空间中。 无论是GS或GSe 统一存储产品&#xff0…

开放式耳机怎么选?五大2024年口碑销量爆棚机型力荐!

在选购开放式耳机的时候&#xff0c;我们总会因为有太多的选择而陷入两难&#xff0c;又想要一个颜值比较高的&#xff0c;又想要同时兼顾性能还不错的&#xff0c;所以作为测评博主&#xff0c;今天我们就给大家带来自己的一些选购技巧和自己觉得还不错开放式耳机&#xff0c;…

不同行业如何选择适合自己行业的项目管理工具?

在当今的信息化时代&#xff0c;项目管理软件已成为各行各业不可或缺的工具。然而&#xff0c;由于各行业具有不同的特点和需求&#xff0c;因此选择合适的项目管理软件成为了一个重要问题。本文将探讨不同行业在选择项目管理软件时需要考虑的因素&#xff0c;希望能帮助大家更…

python-图像模糊处理(赛氪OJ)

[题目描述] 给定 n 行 m 列的图像各像素点的灰度值&#xff0c;要求用如下方法对其进行模糊化处理&#xff1a; 1. 四周最外侧的像素点灰度值不变。 2. 中间各像素点新灰度值为该像素点及其上下左右相邻四个像素点原灰度值的平均&#xff08;四舍五入&#xff09;输入&#xff…

安卓微商大师V3.4.0/高级版一键群发僵尸粉检测

一款高效获取客源&#xff0c;备受好评的微商工具&#xff0c;资源丰富&#xff0c;秒速获得客源&#xff0c;大量群客源&#xff0c;都是散客&#xff0c;携手创业&#xff0c;是做微商生意的首选工具。打开即是黑钻高级会员 赶快体验吧 很强大 链接&#xff1a;https://pan.…

针对 Windows 10 的功能更新,版本 22H2 - 错误 0xc1900204

最近想帮女朋友生win11发现她电脑安装更新总是卡到安装%10这里失败 原来是安装路径被修改过了&#xff0c;改回c盘 win R → 输入regedit 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion

分布式日志采集 Loki 配置及部署详细

分布式日志采集 Loki 配置及部署详细 Loki 部署模式Loki 读写分离部署配置Loki 配置大全 Loki 部署模式 &#xff08;1&#xff09;可扩展部署模式 Loki 的简单可扩展部署模式是最简单的部署方式、首选方式。可扩展到每天几TB的日志&#xff0c;但是如果超出这个范围&#xff…

线下生鲜蔬果店做小程序有什么方法

生鲜蔬果是生活所需&#xff0c;大小商家众多&#xff0c;零售批发各种经营模式&#xff0c;小摊贩或是超市门店都有着目标客户或准属性群体。竞争和获客转化也促进着商家寻找客源和加快线上进程。 尤其是以微信社交为主的私域场景&#xff0c;普客/会员都需要精细化管理营收和…

WebSocket解决方案(springboot 基于Redis发布订阅)

WebSocket 因为一般的请求都是HTTP请求&#xff08;单向通信&#xff09;&#xff0c;HTTP是一个短连接&#xff08;非持久化&#xff09;&#xff0c;且通信只能由客户端发起&#xff0c;HTTP协议做不到服务器主动向客户端推送消息。WebSocket确能很好的解决这个问题&…

携手共筑爱的桥梁:引导接纳自闭症同学

在孩子的班级中&#xff0c;当自闭症儿童成为我们共同的一员时&#xff0c;作为老师和家长&#xff0c;我们肩负着特别的责任——引导孩子们以开放的心态接纳、善待并关爱他们。 首先&#xff0c;我们要以身作则&#xff0c;展现接纳与尊重。无论是老师还是家长&#xff0c;都…

【计算机网络】计算机网络的分类

计算机网络的分类 导读一、按分布范围分类1.1 广域网&#xff08;WAN&#xff09;。1.2 城域网&#xff08;MAN&#xff09;1.3 局域网&#xff08;LAN&#xff09;1.4 个人区域网&#xff08;PAN&#xff09;1.5 多处理器系统 二、按传输技术分类2.1 广播式网络2.2 点对点网络…

Ajax异步请求 axios

Ajax异步请求 axios 1 axios介绍 原生ajax请求的代码编写太过繁琐,我们可以使用axios这个库来简化操作&#xff01; 在后续学习的Vue(前端框架)中发送异步请求,使用的就是axios. 需要注意的是axios不是vue的插件,它可以独立使用. axios说明网站&#xff1a;(https://www.kancl…

【数据结构】04.双向链表

一、双向链表的结构 注意&#xff1a;这里的“带头”跟前面我们说的“头节点”是两个概念&#xff0c;带头链表里的头节点&#xff0c;实际为“哨兵位”&#xff0c;哨兵位节点不存储任何有效元素&#xff0c;只是站在这里“放哨的”。 “哨兵位”存在的意义&#xff1a;遍历循…

揭秘,PyArmor库让你的Python代码更安全

PyArmor 概述: PyArmor 是一个用于加密和保护 Python 源代码的工具,旨在防止代码被逆向工程和未经授权的使用.通过将 Python 源代码编译为加密的字节码,PyArmor 提供了一种有效的方法来保护知识产权和敏感算法. 安装 pip install pyarmor安装完成后,可以通过以下命令验证安装…

LLM端侧部署系列 | 手机上运行47B大模型?上交推理框架PowerInfer-2助力AI手机端侧部署

0. 引言 黄梅时节家家雨&#xff0c;青草池塘处处蛙。 有约不来过夜半&#xff0c;闲敲棋子落灯花。 当下&#xff0c;在移动设备上部署大型模型的趋势是愈演愈烈。Google推出了AI Core&#xff0c;使得Gemini Nano可以在智能手机上部署。此外&#xff0c;近期传闻苹果在iOS …

SQL语句(DQL)

Data Query Language&#xff08;数据查询语言&#xff09;&#xff0c;用来查询数据库中表的记录 DQL-基本查询 DQL-条件查询&#xff08;WHERE&#xff09; -- 查询姓名为2个字的员工信息 select * from emp where name like __;-- 查询身份证号最后一位是X的员工信息 selec…

uni-app打包小程序的一些趣事~

前言 Huilderx版本&#xff1a;4.15 uni-app Web端版本&#xff1a;3.4.21 问题1 Web端/APP端样式好好的&#xff0c;打包微信小程序就乱了咋整&#xff1f; 使用::v-deep/::deep/deep(){}都是没用滴~~ 原因&#xff1f; 解决&#xff1a; <script lang"ts"…

c语言回顾-数组(全网最详细,哈哈哈)

目录 前言&#xff0c;和小编一起感受数组的魅力&#xff01;&#xff01;&#xff01; 1.数组的概念 2.一维数组的创建和初始化 2.1数组创建 2.2数组的初始化 2.3数组的类型 3.一维数组的使用 3.1数组下标 3.2数组元素的输入输出 小结&#xff1a; 4.一维数组在内存…

Python中的__init__方法:为何它如此重要

目录 一、__init__方法的基本概念 1.1 定义与作用 1.2 调用时机 1.3 参数传递 二、__init__方法的工作原理 2.1 初始化属性 2.2 执行其他操作 2.3 继承与多态 三、__init__方法的使用技巧 3.1 参数传递与默认值 3.2 链式初始化 3.3 继承与超类初始化 3.4 初始化方…