最终效果: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
目录
功能需求:
- 先将 PDF 转换为 HTML,各个图片保存到
index_files
目录下 - 然后,根据章节,拆分为不同文件,均以 HTML 形式保存在同目录下
- 如果章节字数超过 1000 字,则拆分为多个文件,拆分点选择段落结尾
- 注意文件名命名,按文件名可从上到下排序
需求转换
以下是根据描述整理后的正式需求文档:
📄 项目需求文档: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 文件,根据章节标题,在目录中做匹配。要求:不准删除任何内容
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。