Gotenberg:开箱即用的开源 PDF 转换微服务,告别 PDF 生成的各种坑
很多业务系统都有PDF生成需求:导出报表、生成发票、合同、报告文档。传统方案要么在项目中集成Puppeteer、wkhtmltopdf,需要处理浏览器依赖、字体缺失、环境兼容等一堆麻烦;要么选用第三方SaaS服务,会有数据隐私、调用成本、网络依赖等问题。今天给大家介绍一款Docker驱动的开源PDF转换API工具——Gotenberg,把PDF相关能力封装成独立微服务,一次部署,任意语言调用。
什么是Gotenberg
Gotenberg是基于Docker构建的无状态文档转换API服务,底层整合了Chromium、LibreOffice、QPDF、pdfcpu等工具,只需要发送HTTP multipart/form‑data请求,传入网页地址、HTML、Markdown或者Office文件,就可以直接拿到PDF文件。
项目数据:GitHub 12k+ Star,Docker镜像拉取量超8200万,MIT开源协议,支持amd64、arm64、armhf等多CPU架构,Go语言开发,已经被大量企业用于生产环境。
核心优势:
- 语言无关:只需要HTTP请求,Java、PHP、Python、NodeJS等任意后端都可以调用,业务代码不需要引入笨重PDF类库。
- 容器化部署:所有底层依赖全部打包进镜像,本地、K8s、Docker Compose一键运行,不会出现本地能跑、生产环境缺依赖的窘境。
- 能力全面:网页/HTML/Markdown转PDF、Office文档转PDF、PDF后期处理、云存储直读直写一站式搞定。
- 无状态架构:可以横向扩容,适合高并发业务场景。
快速上手:两条命令跑通服务
本地验证非常简单,只需要Docker环境:
bash
# 启动gotenberg8服务,监听3000端口
docker run --rm -p "3000:3000" gotenberg/gotenberg:8
一行curl把网页转为PDF:
bash
curl \
--request POST http://localhost:3000/forms/chromium/convert/url \
--form url=https://example.com \
-o output.pdf
执行完成后,本地就会生成output.pdf文件,整个流程不需要安装Chrome、LibreOffice等软件。
四大核心能力详解
1. 基于Chromium高精度网页渲染转PDF
使用无头Chromium引擎,渲染效果和真实浏览器完全一致,完美支持JS、Web字体、现代CSS,特别适合SPA单页应用导出PDF。
- 支持URL、HTML文件、Markdown三种输入源
- 可以等待JS执行完成、等待网络空闲、等待指定DOM元素出现之后再导出,解决异步页面渲染不全问题
- 支持自定义Cookie、请求头,可完成带鉴权页面导出
示例调用,等待页面window.status === 'ready'后再生成PDF,附带鉴权请求头:
bash
curl \
--request POST http://localhost:3000/forms/chromium/convert/url \
--form url=https://my.url \
--form 'waitForExpression=window.status === 'ready'' \
--form 'extraHttpHeaders={"Authorization": "Bearer 123"}' \
-o my.pdf
2. LibreOffice办公文档转换
内置LibreOffice,支持docx、xlsx、pptx等上百种办公格式转为PDF。
- 支持指定页码范围导出,比如只导出文档1‑5页
- 支持输出PDF/A归档标准格式,满足档案业务合规要求
示例docx转PDF:
bash
curl \
--request POST http://localhost:3000/forms/libreoffice/convert \
--form files=@my.docx \
--form nativePageRanges=1-5 \
--form pdfa=PDF/A-1b \
-o my.pdf
3. PDF后期处理引擎
内置QPDF、pdfcpu、ExifTool,无需额外工具,直接完成PDF二次加工:
- PDF合并、拆分、页面旋转、添加水印、压平表单注释
- PDF密码加密、设置权限,读写元数据、书签
- 支持生成Factur‑X电子发票格式
示例:合并两份PDF并设置用户密码:
bash
curl \
--request POST http://localhost:3000/forms/pdfengines/merge \
--form files=@doc1.pdf \
--form files=@doc2.pdf \
--form userPassword=user_secret \
--form ownerPassword=owner_secret \
-o merged_and_secured.pdf
4. 零传输流水线:直连对象存储
这个是非常实用的高级特性,业务服务器不需要中转文件:
- Gotenberg直接从S3/MinIO/GCS预签名URL拉取源文件
- 转换完成后直接上传PDF到对象存储
- 通过Webhook回调通知业务系统成功或者失败
业务服务器只需要下发任务,文件不走应用服务器,节省带宽,适合大文件处理。
bash
curl \
--request POST http://localhost:3000/forms/libreoffice/convert \
--form 'downloadFrom=[{"url": "https://my-bucket.s3.amazonaws.com/file.docx"}]' \
--header 'Gotenberg-Webhook-Url: https://my-bucket.s3.amazonaws.com/out.pdf' \
--header 'Gotenberg-Webhook-Method: PUT' \
--header 'Gotenberg-Webhook-Events-Url: https://my-api.com/events'
适合哪些业务场景
✅ SaaS系统导出发票、报表、合同PDF
✅ 后台系统Word/Excel文档批量转PDF归档
✅ SPA前端页面导出PDF报告
✅ 需要PDF/A合规档案文档输出
✅ 多语言技术栈项目,不想每个服务维护PDF依赖
客观看待优缺点
优点
- 完全开源免费,无调用次数限制,数据保留在内网,满足数据安全要求
- 能力聚合,网页渲染、Office转换、PDF编辑在同一个服务完成
- 标准化HTTP接口,集成成本低,支持OpenTelemetry监控指标,方便运维观测
不足
- 需要自行部署维护,没有官方托管SaaS版本
- Chromium+LibreOffice镜像体积较大,高并发场景CPU、内存消耗较高,需要做好扩容规划
- 没有可视化模板编辑器,需要自己准备HTML/源文档模板
和其他PDF方案简单对比
| 方案 | 部署方式 | 网页渲染 | Office文档转换 |
|---|---|---|---|
| Gotenberg | Docker微服务 | Chromium完整支持 | ✅支持 |
| Puppeteer | 嵌入业务进程 | Chromium完整支持 | ❌不支持 |
| wkhtmltopdf | 本地命令行 | 老旧webkit,CSS支持差 | ❌不支持 |
| 商业PDF SaaS | 第三方托管 | Chromium | 部分支持 |
如果你的项目同时需要网页转PDF+Office文档转PDF,并且希望数据不出内网,Gotenberg是非常优质的选择。
生产环境小提示
- Gotenberg是无状态服务,高并发场景部署多个实例,负载均衡调度;Chromium单实例并发上限约6个请求,注意队列配置。
- 如果需要中文,需要自行把中文字体打包进Docker镜像,避免中文乱码。
- 大文件优先使用downloadFrom+webhook流水线模式,避免HTTP请求超时。
- 开启健康检查、Prometheus指标,监控队列、转换耗时,及时发现服务异常。
写在最后
Gotenberg把PDF相关的复杂底层全部封装起来,把PDF生成这件事变成简单的HTTP调用。很多开发者饱受各种PDF库环境坑,而Gotenberg用容器化微服务的思路,把浏览器、办公套件隔离到独立服务,业务代码只关心业务逻辑。
如果你项目正在被PDF导出问题折磨,不妨试试Gotenberg。
项目官网:https://gotenberg.dev/
GitHub地址:https://github.com/gotenberg/gotenberg