最終效果: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 文件,根據章節標題,在目錄中做匹配。要求:不準刪除任何內容