2026年3月23日5 分鐘閱讀ai-first-projects

用 AI CLI 把手寫筆記數位化:照片變成結構化 Markdown

用 Claude Code 的 vision 功能,把手寫筆記本的照片變成可搜尋、有結構的 markdown 檔案。AI 不只做 OCR -- 它理解內容、整合旁註、用正確的標題、列表和 tags 組織一切。

DH
Danny Huang

那本什麼都記得、什麼都找不到的筆記本

她有三本上學期的筆記本。有機化學、分子生物學、歐洲史。在那六百頁裡的某個地方,有一張她十月上課時畫的圖 -- 一個反應機制,解釋了期末考必考的那個觀念。她記得自己畫過。她記得用的是綠色的筆。但她不記得是在第一本還是第三本,靠前面還是靠後面,左頁還是右頁。

她開始翻。一頁一頁。翻過寫在生物筆記空白處的購物清單。翻過一個沒有名字的電話號碼。翻過三頁被劃掉的論文大綱草稿。圖不在那裡。第二本也沒有。四十分鐘後,她在第三本裡找到了,夾在一張待辦清單和一隻貓的塗鴉之間。

這就是手寫筆記的根本矛盾。寫的動作幫助你學習。研究反覆證實這一點 -- 手寫會啟動比打字更深層的認知處理。但筆記本身在檢索時幾乎無用。筆記本沒有搜尋欄。沒有 tags。沒有 links。它是一種線性儲存媒介,活在一個需要隨機存取的世界裡。

如果你能保留手寫的學習效益,同時獲得數位的檢索能力呢?不是改用平板。不是把每個字重新打一遍。而是拍下你的筆記本,讓 AI 去讀 -- 不只是辨認字元,而是理解內容、把它重組成你可以搜尋的東西。

這篇文章就是在建這個。一套把整疊筆記本照片變成乾淨、結構化 markdown 檔案的流程。那種你真的能搜尋、能連結、能找到東西的檔案。

你會建出什麼

流程的形狀很簡單:

  1. 拍照。 手機相機。不需要特別的設備。
  2. 把照片餵給 Claude Code。 它用 vision 功能讀你的手寫字。
  3. AI 提取並組織內容。 不是扁平的逐字轉錄,而是有標題、列表、tags、旁註整合的結構化 markdown。
  4. 你得到可搜尋的檔案。 按主題分一個、按堂課分一個,你想怎麼切就怎麼切。

跟傳統 OCR 的關鍵差異:Claude 不只是把歪歪扭扭的筆跡轉成字元。它像人類一樣讀頁面。主要段落旁邊有箭頭指向空白處的旁註?AI 理解那個旁註是對段落的補充,會自然地整合進去。一個清單有些項目被圈起來、有些被劃掉?AI 辨識哪些是被強調的、哪些是被刪除的,只輸出相關的內容。一頁開頭是化學筆記、結尾是「記得買牛奶」的提醒?AI 把化學內容和購物備忘分開,各自歸檔到該去的地方。

這不是 OCR。這是閱讀理解。

前置需求

  • Claude Code 已安裝並認證。還沒裝的話,跟著第一個小時教學走,十分鐘搞定。
  • 一支有相機的手機。 近十年內的任何手機都行。
  • 你想數位化的手寫筆記。 筆記本、散頁、便利貼、索引卡、餐巾紙 -- 任何上面有字的東西。
  • 基本 terminal 操作能力。 你會輸入指令。不需要寫程式。

第一步:拍你的筆記

輸出品質取決於輸入品質。不是美學品質 -- 是可讀性品質。幾個原則:

光線比相機畫質重要。 在日光下或明亮的檯燈下拍。避免陰影落在頁面上。AI 讀錯手寫的頭號原因是陰影遮住筆畫,不是相機解析度。

把頁面壓平。 捲起來、字消失在裝訂線裡的筆記本頁面,不管是人還是 AI 都很難讀。把筆記本壓平。用書鎮或第二支手機。

一頁一張照片。 不要試圖拍跨頁。每頁的解析度會降低,而且靠近裝訂線的字會變形。一張照片,一頁。

從正上方拍。 角度變形會讓字母變得模糊。一個 30 度角拍的 a 看起來可能像 o。手機直接放在頁面正上方。

把照片整理到一個資料夾:

mkdir -p ~/handwritten-notes/photos
# 把手機裡的照片傳到這個資料夾
# 用 AirDrop、USB、雲端同步 -- 怎麼方便怎麼來

盡可能按順序命名。大部分手機會在照片加上時間戳,這會保留順序。如果你在拍多本筆記本,用子資料夾:

~/handwritten-notes/photos/
  orgchem-notebook/
    IMG_0401.jpg
    IMG_0402.jpg
    IMG_0403.jpg
    ...(80 頁)
  biology-notebook/
    IMG_0501.jpg
    IMG_0502.jpg
    ...(120 頁)
  history-notebook/
    IMG_0601.jpg
    IMG_0602.jpg
    ...(90 頁)

第二步:設定指示

在你的工作目錄建立一個 CLAUDE.md。這會告訴 AI 你要的輸出結構:

# Handwritten Note Digitization Rules

## Goal

Read photos of handwritten notebook pages. For each page, extract the
content, understand its structure, and output clean structured markdown.

## Input

Photos are in ~/handwritten-notes/photos/, organized by notebook.

## Output

Write organized markdown files to ~/handwritten-notes/output/.

## Reading Rules

1. READ the handwriting carefully. If a word is unclear, use surrounding
   context to infer it. Mark truly illegible words as [illegible].
2. UNDERSTAND the structure of the page. Identify:
   - Main content vs. margin notes
   - Headings vs. body text
   - Lists (numbered or bulleted)
   - Diagrams (describe them in words)
   - Crossed-out text (skip it unless it seems intentional)
   - Circled or highlighted items (mark as emphasized)
   - Arrows connecting ideas (integrate the connection in the output)
3. SEPARATE unrelated content on the same page. Chemistry notes and a
   grocery list on the same page become two different entries.
4. INTEGRATE margin notes into the main content where they belong.
   A margin note next to a paragraph is a comment on that paragraph --
   include it as a parenthetical or a blockquote, not as a separate section.

## Output Format

For each notebook, create markdown files organized by topic or lecture:

  ~/handwritten-notes/output/{notebook-name}/{topic}.md

Each file must include:

### Frontmatter
---
title: "Descriptive Topic Title"
date: YYYY-MM-DD (estimated from context, or "unknown")
source: notebook name and page numbers
tags:
  - subject-tag
  - topic-tag
---

### Content
- Clear headings (H1 for the topic, H2 for subtopics)
- Clean formatted text with proper markdown
- Lists preserved as markdown lists
- Diagrams described in blockquotes: > **Diagram:** description
- Key terms in **bold**
- Formulas in inline code or code blocks
- Margin notes as blockquotes: > **Note:** content

### Cross-References
- If content on one page references content on another, add links
  between the output files: [See Topic Name](./topic-name.md)

## Quality Rules

- Never invent content that is not on the page.
- Preserve the author's meaning, even if the grammar is rough.
- Clean up obvious abbreviations: "w/" becomes "with", "bc" becomes
  "because", "govt" becomes "government" -- unless the abbreviation
  is a standard term in the field.
- Keep technical notation exact. Do not expand chemical formulas or
  mathematical symbols.

## Index

Generate ~/handwritten-notes/output/INDEX.md listing:
- Every notebook processed
- Every topic file created, with page number references
- A tag cloud showing the most frequent topics

這是整個操作的大腦。按照你的思考方式調整輸出格式。學生可能想按堂課分檔。研究者可能想按實驗分檔。正在數位化食譜筆記本的人可能想按菜餚分檔。

第三步:跑數位化

cd ~/handwritten-notes
claude

在 Claude Code 的 prompt 裡輸入:

Read CLAUDE.md for instructions. Then process all photos in photos/orgchem-notebook/.
For each page, read the handwriting, extract the content, and write
structured markdown files to output/orgchem-notebook/.
Show me the first 3 pages as a preview before processing the rest.

預覽步驟很重要。它讓你在 AI 處理 80 頁之前先校準。你可能會發現你的縮寫需要不同的展開規則,或者 AI 把你的 t 讀成了 l。趁早修正指示。

單頁的預覽輸出可能長這樣:

## 第 1 頁(IMG_0401.jpg)- 預覽

**偵測到的內容:** 親核取代反應的上課筆記
**結構:** 標題、三個小節、兩張圖、右側空白處旁註

**建議輸出:**

```markdown
---
title: "親核取代反應:SN1 vs SN2"
date: 2025-09-15
source: orgchem-notebook, page 1
tags:
  - organic-chemistry
  - reaction-mechanisms
  - substitution
---

# 親核取代反應:SN1 vs SN2

## SN2 機制

- 單一協同步驟
- 親核劑從**背側進攻**
- Rate = k[substrate][nucleophile]
- 立體化學反轉

> **圖示:** Newman 投影式,親核劑從碳上離去基的背面
> 靠近。箭頭同時顯示鍵的形成(Nu-C)和鍵的斷裂(C-LG)。

> **旁註:** 「這個金教授每次都考。注意立體化學的翻轉。」

## SN1 機制

- 兩步驟:先離子化,再親核進攻
- Rate = k[substrate](一級反應 -- 親核劑不在速率方程式裡)
- 形成碳陽離子中間體
- 立體中心產生消旋化(兩面都會被進攻)

> **圖示:** 能量圖,兩個過渡態之間有一個碳陽離子
> 中間體的谷。第一步(離子化)的 E_a 比第二步高。

## 什麼時候走哪條路

| 因素 | 有利 SN2 | 有利 SN1 |
|------|----------|----------|
| 受質 | 一級、甲基 | 三級 |
| 親核劑 | 強 | 弱(或溶劑) |
| 溶劑 | 極性非質子性 | 極性質子性 |
| 離去基 | 兩者都要好的 LG | 兩者都要好的 LG |

[參見消除反應](./elimination-reactions.md)了解
競爭的 E1/E2 路徑。
```

看看發生了什麼。一張有箭頭、圈起來的術語、空白處的潦草字跡、兩張圖的手寫頁面,變成了一份乾淨、結構化的文件。關於金教授考試偏好的旁註被保留為上下文,就放在相關內容旁邊。圖示的描述夠詳細,讀書時有用。比較表在筆記本裡可能不是表格 -- 很可能是散落的要點 -- 但 AI 理解了底層的比較關係,把它結構化成了表格。

如果預覽看起來沒問題:

This looks correct. Process all remaining pages in orgchem-notebook/.

用 Termdock 對照照片和辨識結果

在 Termdock 工作區先處理少數照片,讓辨識 session 記錄圖片名稱、頁碼和不確定的字;另一個 session 依照清單比對產出的 Markdown,疑似讀錯處回報給你,而不是自行猜成確定內容。用能查看原始圖片的工具人工抽查圖表和文字,再決定是否批次處理。保留照片原檔;不同終端不會自動分享對話,交接要附上照片與輸出位置。

第四步:處理棘手的情況

不是每一頁都是整齊的上課筆記。筆記本是混亂的。AI 是這樣處理真實世界的混亂的。

內容混雜的頁面

一頁裡可能上面是生物上課筆記、中間是提醒自己寄 email 給指導教授、下面是一個分子的塗鴉。AI 會分開這些。上課筆記進生物檔案。提醒進 misc/tasks.md 或直接跳過,取決於你的指示。

很爛的字

每個人都覺得自己的字最爛。通常沒有那麼爛。Claude 的 vision 功能能處理大部分手寫風格,包括草寫、草寫印刷混合體、和教授講太快時出現的壓縮潦草字。真的讀不出來時,它標 [illegible] 然後繼續。你可以之後在輸出檔裡搜尋 [illegible],靠著周圍已經清理好的上下文,用記憶填補空缺。

圖表和繪圖

流程圖。電路圖。神經系統的地圖。AI 不能把它們重建成圖片,但它可以用文字描述得夠精確,讓描述本身對讀書有用。一張反應機制的圖變成一段逐步的文字描述。一張流程圖變成一個巢狀列表。如果你需要原始圖片,輸出檔會引用原始照片的路徑。

多語言筆記

如果你在筆記裡切換英文和另一種語言 -- 雙語學生的常見模式 -- AI 兩種都能處理。它會保留原本的語言而不翻譯,除非你另外指示。

第五步:批次處理所有筆記本

用一本筆記本校準好之後,處理剩下的:

Now process photos/biology-notebook/ and photos/history-notebook/
using the same rules. Output to their respective directories.

大批量處理 -- 比如三本筆記本共 300 頁 -- 需要時間。Claude Code 會逐頁處理,讀取每張圖片、寫入每個輸出檔。你可以看著進度跑,也可以去做別的事。輸出以檔案的形式累積在你的資料夾裡,所以你可以在後面的頁面還在處理時,先開始讀前面的成果。

所有筆記本處理完後,產生主索引:

Generate INDEX.md as specified in CLAUDE.md.
Include a summary of what was processed and a tag cloud.

索引變成你的入口。每個主題、每堂課、每本筆記本 -- 從一個檔案就能搜尋。

第六步:讓它可搜尋

你的輸出資料夾現在充滿了結構化的 markdown 檔。重點來了。

找到那張化學圖:

cd ~/handwritten-notes/output
grep -r "reaction mechanism" --include="*.md" -l

三個結果,0.2 秒。你花了 40 分鐘翻找的那張圖在 orgchem-notebook/nucleophilic-substitution.md,第 34 行。

找特定主題的所有東西:

grep -r "mitochondria" --include="*.md" -l

它出現在你的生物筆記、你的歷史筆記(一段關於細胞生物學史的內容裡)、而且意外地出現在你的化學筆記裡,教授提到 ATP 合成的地方。三條你翻頁永遠不會發現的連結。

用任何 markdown 工具打開。 輸出檔在 Obsidian、VS Code、Notion(匯入 markdown)、Bear、或任何文字編輯器都能用。它們就是檔案。沒有 lock-in。

想更進一步?散落筆記整理指南教你怎麼把這些 markdown 檔整理進一個有 wikilinks、tags 和知識圖的 Obsidian vault。

持續數位化的腳本

你會繼續寫手寫筆記。新的筆記本會填滿。這個腳本可以增量處理新照片:

#!/usr/bin/env bash
set -euo pipefail

PHOTOS_DIR="${1:?Usage: digitize-notes.sh <photos-directory>}"
PHOTOS_DIR="$(cd -- "$PHOTOS_DIR" && pwd -P)"
OUTPUT_DIR="${2:-$(dirname "$PHOTOS_DIR")/output}"
PROCESSED_LOG="$OUTPUT_DIR/.processed-photos.txt"

mkdir -p "$OUTPUT_DIR"
touch "$PROCESSED_LOG"

# 找出還沒處理的照片
NEW_PHOTOS=$(comm -23 \
  <(find "$PHOTOS_DIR" -type f \( -name "*.jpg" -o -name "*.jpeg" -o -name "*.png" -o -name "*.heic" \) | sort) \
  <(sort "$PROCESSED_LOG"))

NEW_COUNT=$(echo "$NEW_PHOTOS" | grep -c '.' || true)

if [[ "$NEW_COUNT" -eq 0 ]]; then
  echo "No new photos to process."
  exit 0
fi

echo "Found $NEW_COUNT new photos to digitize."
printf "Photos to check:\n%s\n" "$NEW_PHOTOS"

claude -p "You are a handwritten note digitizer.
Read the CLAUDE.md in $(dirname "$PHOTOS_DIR") for rules.

These are NEW photos to process:
$NEW_PHOTOS

Read the handwriting in each photo, extract and structure the content,
and write organized markdown to $OUTPUT_DIR/.
Append new entries to existing topic files where relevant.
Update INDEX.md with new entries.

After processing, list each file you processed (one per line, full path)."

echo "Review the output against each photo before recording completion."
echo "Add only verified photo paths, one per line, to $PROCESSED_LOG."

腳本只挑出清單中尚未標記的照片,模型回覆或指令結束都不代表每張已完成。逐張核對原始照片與產出的 Markdown,確認完成後,才把該照片的完整路徑逐行加入輸出目錄的 .processed-photos.txt;未完成的不要加入,下次才能重試。重跑可能重複附加內容,先檢查現有輸出。這份範例以換行分隔路徑,不適用檔名含換行的照片;非互動模式能否讀圖、寫檔也取決於 Claude Code 的權限設定。

到底改變了什麼

之前:三本筆記本,六百頁手寫筆記。線性、不可搜尋的存檔。要找任何東西都得一頁一頁翻。你寫下來的知識被鎖在一個無法搜尋、無法連結、無法查詢的媒介裡。

之後:一個資料夾裡的結構化 markdown 檔。每堂課、每個主題、每則旁註 -- 不到一秒就能搜到。圖示用文字描述。空白處的潦草字被整合進它們所註解的內容。跨筆記本的交叉引用連結了相關主題。一份索引映射了你一整個學期的筆記。

手寫在上課時完成了它的任務 -- 它幫你把知識編碼進大腦。AI 完成了手寫做不到的任務 -- 它讓那些知識變得可檢索。你保留了筆。你獲得了搜尋欄。

筆記本還在那裡。照片還在那裡。什麼都沒有丟失或被取代。你只是為同一份知識建了第二個介面 -- 一個能在 0.2 秒而不是 40 分鐘內回答「我在哪裡寫過反應機制?」這個問題的介面。

想開始用 Claude Code,請看第一個小時教學。想把數位化的手寫筆記跟其他數位筆記一起整理,請看完整筆記整理指南。

DH
#ai-cli#claude-code#handwriting#ocr#markdown#note-taking#vision#productivity

相關文章