跳转到内容
Tutorial

使用 REST API 从 HTML 和 Markdown 生成 PDF

| 6 min read

两个 POST 请求将 HTML 或 Markdown 转换为可下载的 PDF。 没有 Puppeteer,没有 Chromium,没有 500MB 依赖。 1 秒内即可生成发票、报告和收据。

Printed document pages on a desk
Photo by Bank Phrom on Unsplash

您的应用程序会生成发票。 您有 HTML 模板。 现在你需要把它变成一个 可下载的 PDF。 标准方法:安装 Puppeteer,启动无头 Chromium 实例, 打电话 page.pdf()。 这是打印函数 300-500 MB 的依赖项。

在生产中情况会变得更糟。 Chromium 在负载下会泄漏内存。 Docker 镜像膨胀超过 1 GB。 冷启动需要 3-8 秒。 你最终会为某些东西维护一个浏览器进程池 那应该是单个函数调用。

还有一条更短的路。 将您的 HTML 发送到 API,获取 PDF。

在一个 POST 请求中将 HTML 转换为 PDF

/v1/pdf/from-html 端点接受 HTML 字符串并返回 PDF。 没有浏览器二进制文件,没有依赖项,没有配置。

curl -X POST https://api.botoi.com/v1/pdf/from-html \\
  -H "Content-Type: application/json" \\
  -d '{
    "html": "<h1>Invoice #1042</h1><p>Amount due: $2,450.00</p>"
  }'

回复:

{
  "success": true,
  "data": {
    "url": "https://api.botoi.com/pdfs/f7a2c1e8.pdf",
    "size_bytes": 24576,
    "pages": 1
  }
}

url 字段指向生成的 PDF。 下载它,将您的用户重定向到它, 或将其存储在您自己的 S3 存储桶中。 该 API 处理渲染、分页和字体嵌入。

在一个 POST 请求中将 Markdown 转换为 PDF

并非每个文档都以 HTML 开头。 报告、变更日志和文档通常以 Markdown 形式存在。 这 /v1/pdf/from-markdown 端点直接将 Markdown 转换为样式 PDF。

回复:

表格、标题、粗体文本、代码块和列表均正确呈现。 API 应用干净 印刷默认值,因此输出看起来很漂亮,无需自定义 CSS。

实际示例:发票生成

真实的发票需要公司标题、帐单地址、行项目表、税计算、 和付款条件。 以下是通过一次 API 调用发送的完整发票:

该单一请求会生成带有 Cascade Software 抬头的专业发票 PDF, 四个项目总计 2,257.00 美元,8.5% 的销售税为 191.85 美元,总计 2,448.85 美元。 CSS 中的 <style> 标签控制字体、间距、表格边框和 粗体总行。 您可以使用浏览器支持的任何 CSS,包括 flexbox、grid 和 @page 页边距和页面大小的规则。

实际示例:Markdown 的季度报告

报告非常适合 Markdown。 产品经理、分析师和运营团队已经写过 在 Markdown 中。 转换为 PDF 以进行电子邮件分发或存档是一个 API 调用:

API 将表格、标题、粗体文本和编号列表呈现为干净的 PDF。 否 中间 HTML 步骤就在您身边。 从数据库(Git)传递 Markdown 字符串 存储库,或概念导出。

实际示例:Express 中的收据生成

这是一个 Express 路线,当用户请求时,可以按需生成 PDF 收据 对于过去的订单:

buildReceiptHtml 函数从数据库中获取订单数据并生成 一个样式化的 HTML 字符串。 该路由将其发送到 botoi API 并将 PDF URL 返回到 客户。 没有傀儡师。 没有文件系统操作。 没有临时目录。

霍诺的同样模式

如果您在 Cloudflare Workers 或 Bun 上运行,Hono 版本几乎相同:

主要区别:Hono 通过以下方式访问环境变量 c.env 而不是 process.env。 其他一切都保持不变。 一次 fetch 调用,一次 JSON 响应, 一个 PDF 网址。

比较:API vs Puppeteer vs wkhtmltopdf vs Prince

将 HTML 转换为 PDF 的四种常见方法,根据生产中的重要事项进行比较:

傀儡师 为您提供完全的浏览器控制,但会带来高昂的运营成本。 您在服务器上运行 Chromium、管理内存限制并修补安全性 浏览器二进制文件中的漏洞。 如果您需要 JavaScript 执行、cookie,则效果很好 注入,或经过身份验证的页面渲染。

wkhtml转pdf 比 Puppeteer 更轻,但使用已弃用的 QtWebKit 发动机。 CSS 支持停留在 2015 年的水平。 Flexbox 和网格不起作用。 该项目是 存档在 GitHub 上,没有活跃的维护者。

XML王子 使用完整的 CSS 分页媒体生成最高质量的打印输出 支持。 权衡:每台服务器的许可费为 3,800 美元。 这对于出版来说很有意义 工作流程,不适用于在 SaaS 应用程序中生成发票。

API方法 当您需要来自您控制的模板(发票、 收据、报告、合同),并且不需要呈现任意经过身份验证的页面。 零 设置、零维护、可预测的延迟。

要点

  • 两个端点,两种输入格式。 /v1/pdf/from-html 为了 完整的 HTML 和 CSS。 /v1/pdf/from-markdown 对于 Markdown 内容。
  • 没有服务器端依赖性。 没有 Puppeteer,没有 Chromium,没有 wkhtmltopdf 二进制。 来自任何语言的一次 HTTP 调用。
  • 完整的 CSS 支持。 内联样式、样式标签、flexbox、网格、Google 字体、 和 @page 媒体查询一切正常。
  • 提供免费套餐。 每分钟 5 个请求,无需 API 密钥。 付费计划 生产工作负载的起价为每月 9 美元。
  • 常见用例。 发票、收据、报告、合同、文件 导出和电子邮件附件。

检查 应用程序编程接口 文档 完整参数参考,包括页面大小、边距和页眉/页脚 配置。

FAQ

如何以编程方式从 HTML 生成 PDF?
使用包含 HTML 字符串的 JSON 正文向 https://api.botoi.com/v1/pdf/from-html 发送 POST 请求。 API 返回 base64 编码的 PDF 或下载 URL。 不需要浏览器二进制文件、无头实例或服务器端依赖项。
我可以使用此 API 将 Markdown 转换为 PDF 吗?
是的。 使用您的 Markdown 字符串向 https://api.botoi.com/v1/pdf/from-markdown 发送 POST 请求。 API 在内部将 Markdown 呈现为样式化 HTML 并返回 PDF。 支持标题、表格、代码块和列表。
API 是否支持 HTML 输入中的 CSS 样式?
是的。 您可以在 HTML 中包含内联样式、样式标签和完整 CSS。 渲染引擎支持 Flexbox、网格、通过 Google Fonts 链接的自定义字体,以及打印特定的媒体查询,例如用于边距和页面大小的 @page。
PDF生成API是免费的吗?
匿名访问允许每分钟 5 个请求,并具有基于 IP 的速率限制。 无需 API 密钥或注册。 付费计划起价为 9 美元/月,并取消了发票生成或批量报告等生产工作负载的速率限制。
在 PDF 生成方面,该 API 与 Puppeteer 相比如何?
Puppeteer 需要安装 Chromium (300-500MB)、管理浏览器实例、处理内存泄漏以及维护版本兼容性。 botoi API 是零基础设施的单个 HTTP 调用。 设置只需几秒钟而不是几个小时。 对于大多数 PDF 使用案例(发票、报告、收据),API 可以满足您的需求,而无需产生运营开销。

开始使用 botoi 构建

150+ 个 API 端点,涵盖查询、文本处理、图片生成和开发者工具。免费套餐,无需信用卡。