Gotenberg 介绍与选型指南
Gotenberg 认知与选型入口篇:基于 Chromium、LibreOffice 与多 PDF 引擎的无状态文档转换 API,含模块架构、功能清单、快速开始示例,以及与 wkhtmltopdf、WeasyPrint、unoconv 的量化选型对比。
Gotenberg 介绍与选型指南
目标:本文是 Gotenberg 的认知与选型入口篇,讲清它「是什么、由什么组成、能做什么、适合谁用」,并与 wkhtmltopdf、WeasyPrint、unoconv 等同类工具做量化对比,帮助读者在文档转换技术选型时快速判断是否应采用 Gotenberg。本文全部信息来源于官方文档与官方仓库(来源与查询日期均已就地标注),未做本地部署实测;部署、配置与 API 实操见本专栏后续篇章。
一、环境信息
本章说明本文的信息来源与适用版本范围,便于读者判断内容时效性。
- 软件名称:Gotenberg(官方仓库 gotenberg/gotenberg,官网 gotenberg.dev)
- 查询日期:2026-10-28(本文全部版本号、星数、特性矩阵均以此日期实查为准)
- 最新稳定版本:v8.39.0(来源:GitHub Releases,shields.io release 徽章实测显示
release: v8.39.0) - 主版本线:8.x(官方 Docker 标签
gotenberg/gotenberg:8即跟随 8.x 最新稳定版) - 开源许可:MIT License(来源:仓库 LICENSE 文件,版权人 Julien Neuhart)
- 社区热度:GitHub Stars 约 13k(来源:shields.io stars 徽章,2026-10-28 实查)
- 本文性质:认知与选型篇,仅联网溯源,不含本地实测回显
💡 说明:Gotenberg 的名字来源于德国巴伐利亚州的哥廷根(Göttingen)风格的拼法组合,项目作者是法国工程师 Julien Neuhart,2018 年开源至今一直是该领域事实上的标准方案之一。版本线遵循语义化版本,8.x 为主版本线,升级在同一主版本内保持 API 兼容。
二、软件概述
本节回答「Gotenberg 到底是什么」,从一句话定位展开到它的产品形态与边界。
Gotenberg 的官方定义是:一个基于 Docker 的文档转换 API(a Docker-based API for converting documents to PDF,来源:官方简介,2026-10-28 查询)。调用方把文件或网页地址通过 multipart/form-data POST 给它,它返回转换后的 PDF——调用方不需要自己管理 Chromium、LibreOffice、字体、临时文件这些麻烦事。
它的核心特点可以概括为三条:
- 无状态 HTTP 服务:Gotenberg 自身不存储任何业务数据,每个请求独立处理、处理完即丢弃中间产物。这使它可以水平扩展——流量大了就多起几个实例放在负载均衡后面,彼此之间没有任何协调开销。
- 引擎全家桶集成:单个服务内集成了 Chromium(网页/HTML 渲染)、LibreOffice(Office 文档处理)与多套 PDF 引擎(qpdf、pdfcpu、pdftk、exiftool),调用方一个接口地址就能用到所有引擎能力。
- API 优先:没有 Web 管理界面,一切操作走 HTTP 接口,天然适合被其他后端服务调用,而不是被人直接操作。官方为十余种语言提供了客户端库(来源:Clients & SDKs,2026-10-28 查询)。
💡 说明:Gotenberg 官方明确建议「不要把它暴露到公网,要像对待数据库一样把它放在防火墙后面」(来源:官方安装文档)。它是内部基础设施组件而非面向终端用户的产品,这一认知对后续的安全部署很关键。
三、核心架构
本节拆解 Gotenberg 的模块构成,理解了模块划分,路由、配置参数与故障定位都会容易很多。
Gotenberg 使用 Go 语言编写,采用模块化架构,每个模块负责一类能力。根据启动日志的模块清单与官方配置文档(2026-10-28 查询),核心模块如下:
| 模块 | 职责 | 说明 |
|---|---|---|
| api | HTTP 服务器 | HTTP/1 与 HTTP/2 (H2C) 服务,路由分发、超时控制、请求体大小限制、认证(Basic/OIDC) |
| chromium | 浏览器转换 | 通过无头 Chromium 把 URL、HTML、Markdown 渲染为 PDF 或截图 |
| libreoffice | Office 转换 | 通过 LibreOffice(配合 unoconv 机制)把 docx/xlsx/pptx 等转为 PDF |
| pdfengines | PDF 操作 | 汇聚 qpdf、pdfcpu、pdftk、exiftool 等引擎,提供合并/拆分/加密/水印/元数据/PDF-A 等能力 |
| webhook | 异步回调 | 收到带回调头的请求后先返回 204,转换完成后把结果 POST 到指定回调地址 |
| prometheus | 指标暴露 | 以固定间隔采集各模块指标,暴露 Prometheus 格式的监控端点 |
关键架构约束(来源:官方配置文档,2026-10-28 查询):
- Chromium 并发上限为 6:单个 Gotenberg 实例内一个 Chromium 浏览器最多并行处理 6 个转换任务,超出的请求在队列中排队。高负载下官方建议的方式是横向增加 Gotenberg 实例,而不是调大并发。
- LibreOffice 不支持并行:受锁机制限制,单个实例内 LibreOffice 的转换是串行的,队列机制与 Chromium 相同。这也是 Office 转换吞吐成为整个服务瓶颈的主要原因。
- PDF 引擎可按功能选择:合并默认可用 qpdf/pdfcpu/pdftk 三种引擎,可通过配置参数指定每个功能使用哪个引擎及其优先顺序。
💡 技术拓展:文档转 PDF 的引擎选型本质上是「渲染引擎」之争,主流选项对比——
引擎 原理 优势 局限 Chromium 无头浏览器 完整浏览器渲染管线,打印为 PDF 现代 CSS 全支持、可执行 JS、与浏览器显示效果一致 内存开销大、单实例并发有限 LibreOffice 办公套件的文档模型导出 PDF Office 全格式覆盖 串行转换、复杂排版与 Office 桌面端存在细微差异 Qt WebKit(wkhtmltopdf 所用) 老一代 WebKit 内核 轻量 引擎陈旧、现代 CSS 支持差、项目已停止维护 CSS Paged Media(WeasyPrint) 纯 Python 实现按 CSS 分页规范渲染 @page 分页控制精细、纯库无浏览器依赖 不执行 JavaScript、非浏览器渲染 Gotenberg 实际采用「Chromium + LibreOffice + 独立 PDF 引擎」的组合:网页类转换交给 Chromium 保证渲染保真度,Office 文档交给 LibreOffice 覆盖格式广度,PDF 后处理则由专门的 PDF 引擎承担,三类引擎通过统一的 multipart 表单 API 对外暴露。
四、功能特性
本节按「转换」与「PDF 操作」两条线梳理功能清单,全部条目来源于官方路由总览页(来源:Routes Overview,2026-10-28 查询)。
转换为 PDF(四条核心路由):
| 能力 | 路由 | 说明 |
|---|---|---|
| 网页转 PDF | /forms/chromium/convert/url | 传入 URL,由 Chromium 渲染后输出 PDF |
| HTML 转 PDF | /forms/chromium/convert/html | 上传 HTML 文件(文件名须为 index.html)及可选页眉页脚 |
| Markdown 转 PDF | /forms/chromium/convert/markdown | 上传 HTML 包装模板与 .md 文件,模板中以模板函数引用 Markdown |
| Office 文档转 PDF | /forms/libreoffice/convert | 支持 docx/xlsx/pptx/odt 等 LibreOffice 兼容格式 |
截图与 PDF 操作(节选):
| 能力 | 路由 |
|---|---|
| 网页截图(PNG/JPEG/WebP) | /forms/chromium/screenshot/url 等 |
| 合并 PDF | /forms/pdfengines/merge |
| 拆分 PDF | /forms/pdfengines/split |
| 转 PDF/A 或 PDF/UA | /forms/pdfengines/convert |
| 读/写元数据 | /forms/pdfengines/metadata/read、/forms/pdfengines/metadata/write |
| 读/写书签 | /forms/pdfengines/bookmarks/read、/forms/pdfengines/bookmarks/write |
| 加密 | /forms/pdfengines/encrypt |
| 水印/盖章 | /forms/pdfengines/watermark、/forms/pdfengines/stamp |
| 旋转/扁平化/优化 | /forms/pdfengines/rotate、/forms/pdfengines/flatten、/forms/pdfengines/optimize |
| 嵌入附件 | /forms/pdfengines/embed |
| Factur-X / ZUGFeRD 电子发票 | /forms/pdfengines/factur-x |
系统能力:健康检查 /health、版本查询 /version、调试路由 /debug(默认关闭)、Prometheus 指标 /prometheus/metrics。
💡 说明:转换类路由接受「同一请求内混用多数 PDF 操作」——比如在 HTML 转 PDF 的同一个请求里顺带写入元数据、加密、加水印,不必再发第二次请求(来源:官方路由总览页的说明)。这能显著减少调用方的编排代码。
五、快速开始(最小可用示例)
本节给出零部署成本的最小可用示例:借助官方提供的在线演示服务体验一次完整的「URL 转 PDF」调用,感受 API 形态。演示服务地址为 demo.gotenberg.dev(来源:官方安装文档 Live Demo,2026-10-28 查询)。
# 调用官方在线演示服务,把示例发票网页转成 PDF
# (演示服务限速:每 IP 每秒 2 次请求、请求体上限 5MB,仅用于体验)
curl \
--request POST https://demo.gotenberg.dev/forms/chromium/convert/url \
--form url=https://sparksuite.github.io/simple-html-invoice-template/ \
-o invoice.pdf
命令要点逐项说明:
--request POST:所有转换路由只接受 POST 方法;--form url=...:以multipart/form-data表单字段传入目标网页地址;-o invoice.pdf:响应体即 PDF 二进制流,直接落盘。
执行成功后当前目录会得到一个 invoice.pdf,用任意 PDF 阅读器打开即可看到渲染好的发票页面。想转自己的文件时,把表单换成文件字段(如 HTML 转换用 --form index.html=@你的文件.html)并改用 /forms/chromium/convert/html 路由即可。
💡 说明:自建服务的完整部署步骤(Compose 编排、端口规划、健康检查)见 《Gotenberg Docker Compose 部署实战》;全部转换与 PDF 操作路由的真实调用回显见 《Gotenberg 常用命令与运维实战(核心篇)》。
六、适用场景与限制
本节从「什么该用它」与「什么不该指望它」两面给出判断依据。
典型适用场景:
- 业务系统电子单据生成:发票、合同、对账单、报告的模板化 PDF 输出——模板即 HTML,前端设计师可以直接参与,浏览器渲染保证所见即所得。
- 文档归档与合规存证:把上传的 Office 文档统一转 PDF,并进一步转 PDF/A 长期归档格式(PDF/A 要求字体全嵌入、色彩配置内嵌,Gotenberg 的转换路由直接支持)。
- 文档流水线后处理:合并多个 PDF、拆分章节、加密、加水印、写元数据——这些散落在各家 CLI 工具里的能力被统一成一个 API。
- 异步大批量转换:利用 Webhook 机制把同步等待改为异步回调,配合队列化重试,适合报表批处理、夜间跑批等场景。
- 微服务架构中的独立转换服务:无状态特性使其天然适合放入 Kubernetes 等编排平台按流量伸缩(官方镜像以非 root 用户运行,支持 OpenShift 任意 UID)。
已知限制(来源:官方文档与仓库,2026-10-28 查询):
- 单实例并发天花板固定:Chromium 最多 6 并发、LibreOffice 串行;提升吞吐的唯一官方推荐方式是多实例横向扩展。
- LibreOffice 渲染与桌面端存在细微差异:复杂 Word 排版(艺术字、特殊版式)转换后可能有细节偏差,重要文档应逐份核对。
- 资源占用不可忽视:集成 Chromium 与 LibreOffice 意味着镜像体积较大(官方 full 变体约 2GB 级),运行内存建议至少 512Mi 起(Kubernetes 场景官方建议值)。
- 无 Web 管理界面:配置全部走命令行参数或环境变量,运营调整需要重启服务生效。
- 安全边界靠调用方把守:它不做用户体系与业务鉴权(仅提供 Basic/OIDC 接入认证),必须部署在内网并由上层应用做访问控制。
七、同类选型对比
本节把 Gotenberg 放进「HTML/Office 转 PDF 工具」的坐标系中横向对比。对比对象均为主流开源方案:wkhtmltopdf(CLI 工具,WebKit 内核)、WeasyPrint(Python 库,CSS 分页渲染)、unoconv(CLI 工具,LibreOffice 封装)。星数来源均为 shields.io 徽章(2026-10-28 实查);wkhtmltopdf 已停止维护的信息来源于其官方仓库 README 的归档说明。
| 维度 | Gotenberg | wkhtmltopdf | WeasyPrint | unoconv |
|---|---|---|---|---|
| 定位 | 文档转换 API 服务器 | 命令行 HTML→PDF 工具 | Python PDF 渲染库/CLI | 命令行 Office 转换工具 |
| GitHub Stars | 约 13k | 约 15k | 约 9.7k | 约 2.7k |
| 许可证 | MIT | LGPL-3.0 | BSD-3-Clause | GPL-2.0 |
| 渲染引擎 | Chromium + LibreOffice | Qt WebKit(旧) | 自研 CSS Paged Media | LibreOffice |
| 执行 JavaScript | ✅(浏览器级) | ❌(部分老式 JS 支持差) | ❌ | ❌ |
| 现代 CSS(flex/grid) | ✅ 完整 | ⚠️ 支持有限 | ⚠️ 部分支持(分页属性强) | 不涉及(Office 格式) |
| Office 文档转换 | ✅ docx/xlsx/pptx/odt 全覆盖 | ❌ | ❌ | ✅(经 LibreOffice) |
| PDF 后处理(合并/加密/水印/PDF-A 等) | ✅ 内置十余种 | ❌ | ⚠️ 有限(PDF 表单/水印) | ❌ |
| 服务形态 | HTTP API,无状态可水平扩展 | 单次进程调用 | 库/CLI 单次调用 | CLI 单次调用 |
| 异步回调(Webhook) | ✅ | ❌ | ❌ | ❌ |
| 官方容器镜像 | ✅(三种变体) | ⚠️ 第三方 | ❌(pip 安装) | ❌ |
| 维护状态 | 活跃(8.x 持续发版) | 已归档停止维护(2023 年官方 README 宣布) | 活跃 | 低频维护 |
关键差异与选型建议:
- 需要「服务化 + 全家桶」(微服务里给多个上游提供转换能力、Office 与网页通吃、还要 PDF 后处理)→ 选 Gotenberg,它是唯一把转换与 PDF 操作做成统一无状态 API 的方案。
- 只需在脚本里一次性把 HTML 转 PDF、追求极简(无服务化诉求)→ wkhtmltopdf 曾是经典答案但已停更,新项目不建议再引入;可改用 Gotenberg 或 WeasyPrint。
- 重排版控制、Python 技术栈、内容不含 JS(如报告排版、书籍分页)→ WeasyPrint 的 CSS 分页能力最精细,且以库形态嵌入应用更轻。
- 只是偶尔把一批 Office 文档转 PDF、可接受命令行→ unoconv/LibreOffice 直接转换即可,无需部署服务;但生产高并发场景仍建议 Gotenberg(它内部同样走 LibreOffice,但解决了队列、并发与远程调用问题)。
💡 说明:Gotenberg 与 unoconv 的关系并非竞争——Gotenberg 的 LibreOffice 转换正是借鉴 unoconv 的机制实现的(来源:官方配置文档 LibreOffice 章节,2026-10-28 查询)。可以理解为:Gotenberg 把 unoconv 这类单机 CLI 的能力「服务化、容器化、可伸缩化」了。
八、参考链接
本章汇总本文引用过的官方与社区资料,便于溯源核对。
- Gotenberg 官方网站:https://gotenberg.dev
- 官方简介(What is Gotenberg?):https://gotenberg.dev/docs/getting-started/introduction
- 官方安装文档(镜像变体/部署形态):https://gotenberg.dev/docs/getting-started/installation
- 官方路由总览:https://gotenberg.dev/docs/getting-started/routes
- 官方配置文档(命令行参数与环境变量):https://gotenberg.dev/docs/configuration
- Webhook 与远程下载文档:https://gotenberg.dev/docs/webhook-download
- GitHub 仓库:https://github.com/gotenberg/gotenberg
- 客户端与 SDK 列表:https://gotenberg.dev/docs/getting-started/clients
- 在线演示服务:https://demo.gotenberg.dev
- 版本与星数取证:shields.io 徽章(release: v8.39.0、stars: 13k,查询日期 2026-10-28)