前端生成PDF文件已经成为很多Web应用的常见需求,比如电商订单导出、数据报表下载、简历生成等场景都需要用到相关技术。实现这个功能的本质是借助JavaScript库在浏览器端完成内容渲染和PDF文件构建,不需要依赖后端服务即可完成导出操作。

常用前端PDF生成JavaScript库
1. jsPDF
jsPDF是目前使用最广泛的前端PDF生成库,它可以直接在浏览器中生成PDF文件,支持添加文本、图片、表格、图形等元素,还支持设置字体、颜色、页面尺寸等属性。它的优点是轻量、兼容性好,缺点是对复杂的HTML结构渲染支持较弱,需要手动计算元素位置和样式。
2. html2canvas + jsPDF
这个组合方案可以解决jsPDF无法直接渲染复杂HTML的问题。先使用html2canvas将指定的HTML元素转换为canvas图片,再将canvas图片插入到jsPDF生成的PDF文件中。这种方式可以快速实现整个页面或者局部区域的PDF导出,还原度较高。
3. PDFKit
PDFKit是一个用于在Node.js和浏览器中生成PDF的JavaScript库,它提供了更灵活的API,支持流式生成PDF内容,适合需要动态生成复杂PDF内容的场景。不过它在浏览器端的使用需要配合Browserify等工具进行打包,上手难度稍高。
核心实现方案示例
方案一:使用jsPDF生成简单文本PDF
这个方案适合生成内容结构简单的PDF,比如纯文本说明、简单数据列表等。
// 引入jsPDF库,假设已经通过script标签引入
// <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
function generateSimplePDF() {
// 创建jsPDF实例,设置页面方向为纵向,单位为毫米,页面尺寸为A4
const doc = new jsPDF({
orientation: 'portrait',
unit: 'mm',
format: 'a4'
});
// 设置字体和字号
doc.setFont('helvetica');
doc.setFontSize(16);
// 添加标题
doc.text('前端生成PDF示例', 105, 20, { align: 'center' });
// 添加正文内容
doc.setFontSize(12);
doc.text('这是使用jsPDF库生成的简单PDF文件内容。', 20, 40);
doc.text('可以支持多行文本,只需要设置合适的坐标位置即可。', 20, 50);
// 保存PDF文件,指定文件名
doc.save('simple_pdf.pdf');
}
方案二:使用html2canvas + jsPDF导出复杂HTML内容
这个方案适合导出包含复杂样式、图片、表格的HTML区域,还原度更高。
// 需要同时引入html2canvas和jsPDF库
// <script src="https://html2canvas.hertzen.com/dist/html2canvas.min.js"></script>
// <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
function exportHtmlToPDF() {
// 获取需要导出的HTML元素
const targetElement = document.getElementById('export-content');
// 使用html2canvas将元素转换为canvas
html2canvas(targetElement, {
scale: 2, // 缩放比例,提高图片清晰度
useCORS: true, // 允许跨域图片
logging: false
}).then(canvas => {
// 获取canvas的图片数据
const imgData = canvas.toDataURL('image/png');
// 创建jsPDF实例
const doc = new jsPDF('p', 'mm', 'a4');
// 计算图片在PDF中的尺寸,适配A4页面宽度
const imgWidth = 210; // A4页面宽度,单位毫米
const imgHeight = canvas.height * imgWidth / canvas.width;
// 将图片添加到PDF中
doc.addImage(imgData, 'PNG', 0, 0, imgWidth, imgHeight);
// 如果内容超过一页,可以添加分页逻辑
// 保存PDF文件
doc.save('html_export_pdf.pdf');
});
}
库的选择建议
可以根据实际需求选择合适的库:
- 如果只需要生成简单的文本、图形类PDF,优先选择jsPDF,轻量且实现简单。
- 如果需要导出已有的复杂HTML结构,优先选择html2canvas + jsPDF组合方案,开发效率高。
- 如果需要动态生成高度定制化的复杂PDF内容,且项目允许使用打包工具,可以选择PDFKit。
注意事项
在实际开发中需要注意以下问题:
- 使用html2canvas时,如果HTML中包含跨域图片,需要服务器配置允许跨域,或者将图片转为base64格式再使用。
- 生成的PDF文件如果内容过长,需要手动处理分页逻辑,避免内容被截断。
- 部分浏览器对文件下载的限制可能导致save方法不生效,可以结合后端接口做兼容处理。
- 如果需要支持中文,jsPDF默认不支持中文字体,需要手动引入中文字体文件并注册到jsPDF中。
中文支持实现示例
jsPDF默认不包含中文字体,需要手动加载字体文件来支持中文显示:
// 假设已经加载了jsPDF和中文字体文件,这里以思源黑体为例
function generateChinesePDF() {
const doc = new jsPDF();
// 注册中文字体,fontName为字体名称,fontData为字体文件的base64字符串
doc.addFont('NotoSansCJKsc-Regular.ttf', 'NotoSans', 'normal');
// 设置使用中文字体
doc.setFont('NotoSans');
doc.setFontSize(16);
// 添加中文内容
doc.text('这是支持中文显示的PDF内容', 20, 20);
doc.text('前端生成PDF可以很好地满足无后端依赖的导出需求', 20, 30);
doc.save('chinese_pdf.pdf');
}
JavaScriptPDF生成前端开发jsPDFhtml2canvas修改时间:2026-06-26 21:15:30