实战示例:将英文 PDF 文档转换为 Markdown 并翻译为中文,最后输出为 PDF

本章通过一个完整的自动化流程示例,展示如何利用 n8n 将英文 PDF 文档转换为 Markdown,再调用大语言模型翻译为中文,最终生成中文 PDF 文件。你将系统掌握文件读写、本地命令执行、API 调用、数据处理等节点的组合应用,并了解每一步的衔接与调试方法。

触发与读取原始 PDF

流程起点采用 Manual Trigger 节点,便于测试和调试。随后用 Execute Command 节点调用 PDF 提取转换工具,将 PDF 转为 Markdown 文件。推荐使用 MinerU 将 PDF 转换为 Markdown,还有一些其他工具也可以实现类似功能,详见 PDF 转 Markdown 开源工具深度探讨

执行后,Markdown 文件会生成在指定路径。接着用 Read Binary File 节点读取该 Markdown 文件内容,设置 Output Data In Field 为 data,以 Base64 编码存入 $binary.data,方便后续处理。

提示:如未安装 pandoc,可用 brew install pandoc 安装。确保 n8n 环境能找到 pandoc 命令。

Markdown 二进制数据转为纯文本

Read File 节点输出的 Markdown 内容为 Base64 编码。用 Code 节点(JavaScript)将其转为字符串:

const buffer = await this.helpers.getBinaryDataBuffer('data');
const mdText = buffer.toString('utf8');
return [{ json: { markdown: mdText } }];

这样输出的 $json.markdown 即为英文 Markdown 文本。

调用 Gemini 翻译 Markdown

HTTP Request 节点调用 Gemini API,将 Markdown 翻译为中文。配置:

  • Method: POST
  • URL: https://api.gemini.com/v1/chat/completions
  • Authentication: Header Auth,添加 Authorization: Bearer YOUR_GEMINI_API_KEYContent-Type: application/json
  • Body:
{
  "model": "gemini-2.5-flash",
  "messages": [
    {"role": "user", "content": "请将以下 Markdown 内容翻译为中文,并保持格式:\n{{$json[\"markdown\"]}}"}
  ]
}

表达式 {{$json["markdown"]}} 注入上一步输出。执行后,响应的 choices[0].message.content 即为中文 Markdown。

更多 API 配置详见 n8n HTTP Request 节点文档

提取翻译后的 Markdown

Set 节点提取 HTTP 节点输出的中文 Markdown:

  • 新增字段 cnMarkdown,值为表达式:{{$node["HTTP Request"].json["choices"][0]["message"]["content"]}}

这样即可获得翻译后的中文 Markdown 字符串。

生成中文 PDF 文件

将中文 Markdown 保存为临时文件,再用 pandoc 转为 PDF:

  1. Write Binary File 节点,将 cnMarkdown 写入 /Users/alice/Documents/output_cn.md
  2. Execute Command 节点运行:
pandoc /Users/alice/Documents/output_cn.md -o /Users/alice/Documents/output_cn.pdf

执行后即可得到中文 PDF 文件。

可用 Read Binary File 节点读取 PDF,再通过 Email 节点发送或 Webhook Respond 返回。

流程扩展与自动化场景

本流程可扩展为 API 服务或定时任务:

  • 用 Webhook Trigger 支持文件上传,实现对外 PDF 翻译 API
  • 用 Schedule Trigger 定期扫描文件夹自动翻译 PDF

n8n 支持多种节点组合,灵活应对实际需求。更多节点用法见 n8n 节点文档

文章导航

独立页面

这是书籍中的独立页面。

书籍首页

评论区