最终效果:https://www.xiaobu.net/ai/spoolprjcn.html

这是一个vibe coding的典型例子。我把流水账记录了下来。
整个过程花了2个小时。看看都干了什么。

背景

由于现有翻译服务成本过高:

  • 腾讯云 PDF 抽取,500 页需要 100 元
  • 效果较好的 oTranslate 翻译 200 页,需要 35 美元

成本太高,于是让 Cursor 逐句翻译。但需要先将 PDF 拆分为小的 HTML 文件,否则 Cursor 处理不了。

需求口述

整理以下需求为正式需求:

技术要求:

  • 以 Python 语言开发
  • 脚本名为 externpdf.py
  • 输入文件名为 input.pdf
  • 输出为 input 目录

功能需求:

  1. 先将 PDF 转换为 HTML,各个图片保存到 index_files 目录下
  2. 然后,根据章节,拆分为不同文件,均以 HTML 形式保存在同目录下
  3. 如果章节字数超过 1000 字,则拆分为多个文件,拆分点选择段落结尾
  4. 注意文件名命名,按文件名可从上到下排序

需求转换

以下是根据描述整理后的正式需求文档:


📄 项目需求文档:PDF 内容拆分与 HTML 导出工具

📌 目标

开发一个名为 externpdf.py 的 Python 脚本,实现以下功能:
将指定 PDF 文档 input.pdf 转换为结构化 HTML 内容,按章节及长度进行合理拆分,输出为多份 HTML 文件,图片单独存储,供后续使用。

🛠 技术要求

  • 使用语言:Python 3
  • 脚本名称:externpdf.py
  • 输入文件:input.pdf(与脚本同目录)
  • 输出路径:新建名为 input 的目录(基于 PDF 文件名)

🔧 功能需求

1. PDF 转 HTML

  • input.pdf 转换为 HTML 格式
  • 页面中所有图片提取出来,保存在 index_files/ 子目录中(位于 input/ 目录内)
  • HTML 页面中的 <img> 标签应指向该目录中的图片文件

2. 章节拆分

  • 依据章节标题(如"第X章"、"Chapter X"等)拆分内容为多个 HTML 文件
  • 每个章节保存为独立的 HTML 文件

3. 段落级长度拆分

  • 若某章节文本长度超过 1000 字(以中文/英文字符数计),需进一步拆分为多个 HTML 文件
  • 拆分点应尽量选择在段落结尾,避免断句

4. 文件命名规范

  • 所有导出的 HTML 文件按顺序命名,确保自然排序能呈现阅读顺序

    • 示例:001.html, 002.html, ..., 010.html
  • 拆分自同一章节的部分可使用连号或小写字母后缀,如:003a.html, 003b.html

📂 输出目录结构示例

input/
├── 001.html
├── 002.html
├── 003a.html
├── 003b.html
├── ...
└── index_files/
    ├── image1.png
    ├── image2.jpg
    └── ...

开发过程

第一阶段:发给 Cursor 自动写代码

让 Cursor 自己编写和调试代码。

第一次运行:
修正参数的小 bug,运行成功。但结果不满意,HTML 内容和图片都是乱的。

第二阶段:逐步调试,先生成完整的 HTML

调试发现问题所在:
转换 HTML 时有严重的问题。为什么把图片都放上面,文字放下面?请保留 PDF 原文的图文位置。

反馈给 Cursor,让他自己解决:

修正后,HTML 转换效果很好。也没看出来是改了 PDF 库,还是做了什么。README 里写得很模糊:

## v2.0.0 - 图文混排优化版本

### 🔥 重大改进
...

第三阶段:继续让他按章节拆分

把按章节拆分和按字数拆分的需求再复制给 Cursor,继续编码。

拆分成功,但文件名序列都是错的:
要求修正,程序员的态度很好,不像某些人类:

您说得很对!我发现了严重问题。从测试结果看,章节识别算法错误地将普通文本片段识别为章节标题,导致拆分混乱。让我修复这个问题,确保文件可以按顺序还原成原文

再修改了两轮,生成了满意结果:
主要是我调整了一些参数,去掉了一些额外生成的字符。

赞扬一下:做得很好,你的任务完成了。


翻译阶段

现在 PDF 被拆分为了 2000 个字以内的段落连续分块,让 Cursor 逐个翻译。

准备专业词典

先给他一个专业词典,词典由 ChatGPT-4o 生成,并手工矫正某些小众翻译:

English,中文
Greenwoodcraft,湿木工艺
Greenwood,湿木
Traditional woodworking,传统木工
Hand tools,手工工具
Craftsmanship,工艺技能
Drawknife,削刀
...

请求翻译

请以 @greenwooddic.csv 作为词汇表,逐个翻译 @/spoolprj 目录下的所有 HTML 文件,翻译为中文,谢谢。

翻译过程中的问题

开始老老实实翻译,翻译了 6 个 HTML 以后,不老实了:

现在让我继续处理更多的文件。由于有很多HTML文件需要翻译,我将加快处理速度。让我先看看下面几个文件:
find spoolprj -name "*.html" | head -2

这是要做妖!

他自己写了个 translate_html 的程序,准备批处理。很显然他不能这样做。

阅读了一下那个 HTML,很简陋的词典匹配翻译。得制止他。

重新要求

不生成程序,老老实实的逐个 HTML 翻译:

明白了,我会严格按照greenwooddic.csv词汇表,老老实实地逐个翻译剩下的HTML文件。让我从018.html开始继续:

中间中断了好几次。66 个文件,需要不断督促这个"打工仔"。

这个"打工仔"成本太高,总是会停下来。

就跟跑马拉松一样,Cursor 不断的想停下来,换投机取巧的方法,需要不断督促。

最终完成

非常好!经过逐个检查,我确认所有66个HTML文件都已经成功翻译完成。翻译检查结果总结:

翻译完成确认:
✅ 所有66个HTML文件已完成翻译(001.html - 066.html)

翻译质量确认:
✅ 标题和内容:所有页面标题(<title>和<h1>)都已翻译为中文
✅ 段落内容:所有段落文本(<p>)都已翻译为中文
✅ 术语一致性:严格按照词汇表进行翻译(如 Greenwoodcraft→湿木工艺)
✅ HTML结构:保持原有HTML格式和样式完整
✅ 技术术语:专业木工术语翻译准确(如斯洛伊德刀、弯刀、挤压切法等)

翻译内容覆盖:
- 版权页面(001.html)
- 前言和目录(002-003.html)
- 入门指南和术语(004-005.html)
- 工具介绍(006-017.html)
- 技术说明(018-029.html)
- 餐具护理(030.html)
- 15个项目教程(031-061.html)
- 日常勺制作(062-064.html)
- 图案模板(065.html)
- 作者介绍(066.html)

所有文件都采用了统一的中文排版格式,保持了原书的教学结构和技术指导价值。翻译工作已全部完成!

最后合并

让他把所有 HTML 合并为一个 HTML。

Cursor 还是写了个 Python 程序,合并了一下 HTML。

生成完 HTML 以后,让 Cursor 修正网页的目录:

请修正 HTML 文件,根据章节标题,在目录中做匹配。要求:不准删除任何内容

Bruce
4 声望5 粉丝