2025最新pdfmake入门教程:从安装到生成第一个PDF文档只需10分钟
2026-02-05 04:32:02作者:伍霜盼Ellen
你还在为JavaScript PDF生成工具的复杂配置而烦恼吗?想快速掌握一个既支持客户端又支持服务端的PDF生成库吗?本文将带你10分钟内从零基础入门pdfmake,完成从环境搭建到生成第一个自定义PDF文档的全过程。读完本文你将学会:
- 在不同环境下安装和配置pdfmake
- 理解文档定义对象(Document Definition Object)的核心结构
- 使用文本、样式、列表等基础组件构建PDF
- 掌握客户端和服务端两种生成PDF的方法
- 解决常见的中文字体和性能问题
1. pdfmake简介与核心优势
pdfmake是一个基于JavaScript的PDF文档生成库,支持客户端和服务端两种使用场景。与其他PDF生成工具相比,它具有以下核心优势:
pie
title pdfmake核心能力分布
"文档结构" : 30
"样式系统" : 25
"跨平台支持" : 20
"性能优化" : 15
"扩展性" : 10
1.1 主要特性
- 纯JavaScript实现:无需依赖其他语言或插件
- 丰富的内容支持:文本、表格、图片、SVG、列表等
- 灵活的样式系统:支持内联样式、命名样式和样式继承
- 跨平台兼容:浏览器端直接生成或下载,Node.js服务端生成文件
- 完善的文档布局:支持页面设置、边距、页眉页脚、分页控制等
1.2 适用场景
| 使用场景 | 推荐指数 | 优势 |
|---|---|---|
| 前端动态报表生成 | ★★★★★ | 无需后端参与,减轻服务器负担 |
| 服务端批量PDF生成 | ★★★★☆ | 可集成到自动化工作流 |
| 在线文档导出功能 | ★★★★★ | 直接在浏览器生成,提升用户体验 |
| 复杂布局报告 | ★★★★☆ | 强大的表格和样式系统 |
| 高频生成场景 | ★★★☆☆ | 可通过缓存优化性能 |
2. 快速安装与环境配置
2.1 环境要求
pdfmake对环境要求非常低,只需满足:
- Node.js环境:v18.0.0或更高版本(服务端使用)
- 浏览器支持:所有现代浏览器(IE不推荐)
- npm或yarn包管理工具
2.2 安装方式
2.2.1 Node.js环境安装
# 使用npm安装
npm install pdfmake@0.3.0-beta.18
# 使用yarn安装
yarn add pdfmake@0.3.0-beta.18
2.2.2 浏览器环境引入
推荐使用国内CDN以获得更好的访问速度:
<!-- 引入pdfmake核心库 -->
<script src="https://cdn.bootcdn.net/ajax/libs/pdfmake/0.3.0-beta.18/pdfmake.min.js"></script>
<!-- 引入Roboto字体包 -->
<script src="https://cdn.bootcdn.net/ajax/libs/pdfmake/0.3.0-beta.18/vfs_fonts.js"></script>
2.2.3 源码安装
如果你需要自定义或贡献代码,可以从Git仓库克隆源码:
# 克隆仓库
git clone https://gitcode.com/gh_mirrors/pd/pdfmake
cd pdfmake
# 安装依赖
npm install
# 构建项目
npm run build
3. 核心概念:文档定义对象(DocDefinition)
pdfmake使用文档定义对象(Document Definition Object) 来描述PDF的内容和结构。这是一个普通的JavaScript对象,包含了PDF的所有信息。
3.1 基本结构
文档定义对象的基本结构如下:
const docDefinition = {
// 页面设置
pageSize: 'A4', // 页面大小
pageOrientation: 'portrait', // 页面方向
pageMargins: [40, 60, 40, 60], // 页边距 [左, 上, 右, 下]
// 样式定义
styles: {
header: { fontSize: 18, bold: true },
subheader: { fontSize: 15, bold: true, margin: [0, 10, 0, 5] },
content: { fontSize: 12, margin: [0, 5, 0, 5] }
},
// 内容
content: [
{ text: '这是标题', style: 'header' },
{ text: '这是副标题', style: 'subheader' },
{ text: '这是正文内容', style: 'content' }
],
// 页眉页脚
header: '这是页眉',
footer: (currentPage, pageCount) => `第 ${currentPage} 页,共 ${pageCount} 页`
};
3.2 内容类型
pdfmake支持多种内容类型,主要包括:
flowchart TD
A[内容类型] --> B[文本(Text)]
A --> C[表格(Table)]
A --> D[图片(Image)]
A --> E[列表(List)]
A --> F[列(Columns)]
A --> G[SVG]
A --> H[附件(Attachment)]
B --> B1[普通文本]
B --> B2[格式化文本]
B --> B3[链接文本]
C --> C1[简单表格]
C --> C2[复杂表格(合并单元格)]
4. 快速上手:生成第一个PDF
4.1 服务端(Node.js)实现
步骤1:创建项目并安装依赖
# 创建项目目录
mkdir pdfmake-demo
cd pdfmake-demo
# 初始化项目
npm init -y
# 安装pdfmake
npm install pdfmake@0.3.0-beta.18
步骤2:创建基本示例文件
创建basic-example.js文件:
// 引入pdfmake
const pdfmake = require('pdfmake');
// 定义字体
const fonts = {
Roboto: {
normal: 'node_modules/pdfmake/build/fonts/Roboto/Roboto-Regular.ttf',
bold: 'node_modules/pdfmake/build/fonts/Roboto/Roboto-Medium.ttf',
italics: 'node_modules/pdfmake/build/fonts/Roboto/Roboto-Italic.ttf',
bolditalics: 'node_modules/pdfmake/build/fonts/Roboto/Roboto-MediumItalic.ttf'
}
};
// 创建pdfmake实例
const printer = new pdfmake(fonts);
// 定义文档内容
const docDefinition = {
content: [
{ text: '2025年销售报告', style: 'header' },
{ text: '生成日期: ' + new Date().toLocaleDateString(), style: 'subheader' },
{ text: '1. 概述', style: 'sectionHeader' },
{ text: '本报告总结了2025年第一季度的销售情况,包括各产品线的销售数据、市场份额和客户反馈。', style: 'content' },
{ text: '2. 销售数据', style: 'sectionHeader' },
{
style: 'tableExample',
table: {
headerRows: 1,
widths: [60, '*', '*', '*'],
body: [
['产品类别', '销售额(万元)', '同比增长', '目标完成率'],
['电子产品', 1250, '+15%', '108%'],
['家居用品', 890, '+8%', '95%'],
['服装鞋帽', 620, '+22%', '112%'],
['食品饮料', 480, '+5%', '92%']
]
}
},
{ text: '3. 结论', style: 'sectionHeader' },
{ text: '总体来看,2025年第一季度销售情况良好,各产品线均实现正增长,其中服装鞋帽类别表现突出。', style: 'content' }
],
// 样式定义
styles: {
header: {
fontSize: 18,
bold: true,
margin: [0, 0, 0, 10]
},
subheader: {
fontSize: 14,
bold: true,
margin: [0, 10, 0, 5],
color: '#666'
},
sectionHeader: {
fontSize: 16,
bold: true,
margin: [0, 15, 0, 5]
},
content: {
fontSize: 12,
margin: [0, 5, 0, 5]
},
tableExample: {
margin: [0, 10, 0, 15]
}
}
};
// 生成PDF
const pdfDoc = printer.createPdfKitDocument(docDefinition);
pdfDoc.pipe(require('fs').createWriteStream('sales-report.pdf'));
pdfDoc.end();
console.log('PDF生成完成!');
步骤3:运行并生成PDF
node basic-example.js
运行成功后,当前目录下会生成sales-report.pdf文件。
4.2 浏览器端实现
创建browser-example.html文件:
<!DOCTYPE html>
<html>
<head>
<title>pdfmake浏览器端示例</title>
<!-- 引入pdfmake库 -->
<script src="https://cdn.bootcdn.net/ajax/libs/pdfmake/0.3.0-beta.18/pdfmake.min.js"></script>
<!-- 引入字体文件 -->
<script src="https://cdn.bootcdn.net/ajax/libs/pdfmake/0.3.0-beta.18/vfs_fonts.js"></script>
</head>
<body>
<button onclick="generatePdf()">生成PDF</button>
<button onclick="downloadPdf()">下载PDF</button>
<script>
// 检查字体是否加载成功
console.log('字体是否可用:', pdfMake.vfs ? '是' : '否');
// 文档定义
const docDefinition = {
content: [
{ text: '浏览器端PDF生成示例', style: 'header' },
{ text: '当前时间: ' + new Date().toLocaleString(), style: 'subheader' },
{
text: '这是一个在浏览器中直接生成的PDF文档。pdfmake支持客户端和服务端两种模式,非常灵活。',
style: 'content'
},
{
ul: [
'纯JavaScript实现,无需后端支持',
'直接在浏览器中生成,保护用户数据隐私',
'支持下载、打印或在新窗口查看',
'丰富的内容和样式控制'
],
style: 'list'
}
],
styles: {
header: {
fontSize: 20,
bold: true,
margin: [0, 0, 0, 15]
},
subheader: {
fontSize: 14,
color: '#888',
margin: [0, 0, 0, 10]
},
content: {
fontSize: 12,
margin: [0, 5, 0, 15]
},
list: {
margin: [0, 5, 0, 15],
fontSize: 12
}
}
};
// 生成并在新窗口打开PDF
function generatePdf() {
pdfMake.createPdf(docDefinition).open();
}
// 生成并下载PDF
function downloadPdf() {
pdfMake.createPdf(docDefinition).download('browser-demo.pdf');
}
</script>
</body>
</html>
直接在浏览器中打开该HTML文件,点击按钮即可生成或下载PDF。
5. 进阶功能
5.1 添加图片
pdfmake支持添加多种格式的图片,包括本地图片和网络图片:
// 图片示例
const docDefinition = {
content: [
{
text: '图片示例',
style: 'header'
},
{
image: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9bxSIVh1YQcYhQnSyIiuimVShChVArtOpgcukXNGlI0wmUuR7Rxl44+LmI4q4pK4PfX6z5W3y4z7r5B4P32CFcQmbk5R58v58y6P3X7fH79P7/f3/f3/f3/f3/f3/f3/f3/f3/f3f4A/6HP3ugAAAABJRU5ErkJggg==',
width: 150,
height: 150,
alignment: 'center'
},
{
text: '网络图片',
style: 'subheader'
},
{
image: 'https://picsum.photos/200/300',
width: 200,
height: 300,
margin: [0, 10, 0, 10]
}
]
};
5.2 创建表格
pdfmake的表格功能非常强大,支持合并单元格、自定义样式和复杂布局:
// 复杂表格示例
const docDefinition = {
content: [
{ text: '销售数据统计表', style: 'header' },
{
table: {
// 表头行数
headerRows: 2,
// 列宽,*表示自动分配剩余空间
widths: [ '*', 'auto', 100, '*' ],
// 表格内容
body: [
[
{ text: '产品信息', colSpan: 2, alignment: 'center', bold: true },
{},
{ text: '销售数据', colSpan: 2, alignment: 'center', bold: true },
{}
],
[
{ text: '产品名称', bold: true },
{ text: '类别', bold: true },
{ text: '销售额', bold: true },
{ text: '销量', bold: true }
],
[ '智能手机', '电子产品', '¥12,500,000', 5000 ],
[ '笔记本电脑', '电子产品', '¥8,900,000', 1500 ],
[ '运动鞋', '服装', '¥3,200,000', 8000 ],
[ '连衣裙', '服装', '¥2,800,000', 6500 ],
[
{ text: '总计', colSpan: 2, bold: true },
{},
{ text: '¥27,400,000', bold: true },
{ text: 21000, bold: true }
]
]
},
// 表格样式
layout: {
fillColor: function(rowIndex, node, columnIndex) {
// 表头行颜色
if (rowIndex < 2) {
return '#CCCCCC';
}
// 交替行颜色
return (rowIndex % 2 === 0) ? '#F5F5F5' : null;
}
}
}
]
};
5.3 自定义页面设置
// 自定义页面设置
const docDefinition = {
// 页面大小,支持A4, Letter, Legal等标准尺寸,或自定义尺寸[宽度, 高度]
pageSize: 'A4',
// 页面方向,portrait(纵向)或landscape(横向)
pageOrientation: 'portrait',
// 页边距 [左, 上, 右, 下]
pageMargins: [40, 60, 40, 60],
// 页眉
header: {
columns: [
{ text: '公司内部文档', style: 'header' },
{ text: '机密', style: 'headerRight' }
]
},
// 页脚
footer: function(currentPage, pageCount) {
return {
columns: [
{ text: '文档版本: 1.0', style: 'footer' },
{ text: `第 ${currentPage} 页,共 ${pageCount} 页`, style: 'footer', alignment: 'right' }
]
};
},
// 背景层
background: function(currentPage, pageCount) {
// 第一页添加水印
if (currentPage === 1) {
return {
登录后查看全文
热门项目推荐
相关项目推荐
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin08
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00
热门内容推荐
最新内容推荐
项目优选
收起
deepin linux kernel
C
27
11
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
532
3.74 K
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
336
178
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
886
596
Ascend Extension for PyTorch
Python
340
403
暂无简介
Dart
771
191
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
12
1
openJiuwen agent-studio提供零码、低码可视化开发和工作流编排,模型、知识库、插件等各资源管理能力
TSX
986
247
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
416
4.21 K
React Native鸿蒙化仓库
JavaScript
303
355