使用 html2canvas
将 HTML 导出为 PDF 的过程分为两步:
-
使用
html2canvas
将 HTML 内容渲染为 Canvas。 -
使用
jsPDF
将 Canvas 图像插入到 PDF 中并保存。
以下是具体实现步骤:
1. 安装依赖
首先,确保你引入了 html2canvas
和 jsPDF
库。你可以通过以下方式获取它们:
使用 CDN
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
复制
使用 npm
如果你使用 npm 或 yarn:
npm install html2canvas jspdf # 或 yarn add html2canvas jspdf
复制
2. 实现代码
以下是一个完整的示例代码,将 HTML 内容导出为 PDF:
// 导出页面为PDF格式 import html2Canvas from 'html2canvas' import JsPDF from 'jspdf' const getPdf = (elementId = 'pdfDom', pdfTitle = 'pdf文件') => { // 当下载pdf时,若不在页面顶部会造成PDF样式不对,所以先回到页面顶部再下载 let top = document.getElementById(elementId) if (top != null) { top.scrollIntoView() top = null } html2Canvas(document.querySelector(`#${elementId}`), { scale: 2, // 提高分辨率 logging: true, // 启用日志 allowTaint: true, useCORS: true }).then(function(canvas) { // 获取canvas画布的宽高 let contentWidth = canvas.width let contentHeight = canvas.height // 一页pdf显示html页面生成的canvas高度; let pageHeight = contentWidth / 841.89 * 592.28 // 未生成pdf的html页面高度 let leftHeight = contentHeight // 页面偏移 let position = 0 // html页面生成的canvas在pdf中图片的宽高(本例为:横向a4纸[841.89,592.28],纵向需调换尺寸) let imgWidth = 641.89 let imgHeight = 841.89 / contentWidth * contentHeight let pageData = canvas.toDataURL('image/jpeg', 1.0) let PDF = new JsPDF('l', 'pt', 'a4') // 两个高度需要区分: 一个是html页面的实际高度,和生成pdf的页面高度 // 当内容未超过pdf一页显示的范围,无需分页 if ((leftHeight + 50) < pageHeight) { PDF.addImage(pageData, 'JPEG', 100, 50, imgWidth, imgHeight) } else { while (leftHeight > 0) { PDF.addImage(pageData, 'JPEG', 100, position, imgWidth, imgHeight) leftHeight -= pageHeight position -= 592.28 // 避免添加空白页 if (leftHeight > 0) { PDF.addPage() } } } PDF.save(pdfTitle + '.pdf') }) }
复制
使用方式: getPdf(elementId, `未命名文件.pdf`)
3. 代码说明
-
html2canvas
:将 HTML 元素渲染为 Canvas。-
scale: 2
:提高分辨率,避免生成的 PDF 模糊。 -
useCORS: true
:允许加载跨域图片。
-
-
jsPDF
:用于创建和保存 PDF。-
new jspdf.jsPDF('p', 'mm', 'a4')
:创建一个 A4 尺寸的 PDF 文档。 -
addImage
:将 Canvas 生成的图片插入到 PDF 中。 -
pdf.save('exported.pdf')
:保存 PDF 文件并下载。
-
4. 注意事项
-
跨域图片:如果 HTML 中包含跨域图片,确保服务器允许跨域访问(CORS),否则图片可能无法渲染。
-
分辨率:通过调整
scale
参数可以提高生成 PDF 的分辨率。 -
分页:如果 HTML 内容较长,可以使用
jsPDF
的分页功能手动分页。