Skip to content

feat: add .note → pdf conversion (complement existing .note → html) #76

@kiki830621

Description

@kiki830621

Problem

Original text:
「.note轉成pdf的東西我覺得macdoc也要加」
— Source: Claude Code session 2026-04-17

macdoc 目前已有 .note → html 轉換(NoteConverter,讀 Session.plist 筆畫向量 + 掛 Recordings/ 音訊,產出互動式 HTML player),但還沒有 .note → pdf。建議補上這個轉換,走同一條資料路線(讀 Session.plist 筆畫),輸出靜態 PDF。

Type

feature

Expected

macdoc convert --to pdf input.note --output output.pdf

輸出含完整手寫筆畫的靜態 PDF,不需要在 iPad 上開 Notability App 手動「分享 → PDF」。

Actual

目前 .note → pdf 未實作,執行會回報「不支援從 .note 轉換到 pdf」。

取得 Notability 筆記 PDF 的現有路徑都有缺陷:

  1. extract_notability_pdf.py(teaching-toolkit 的 lecture-add skill) — heuristic 有結構性漏洞
    • 只檢查 .note/PDFs/ 裡 PDF 的 size ≥ 500 KB、頁數 ≥ 3、含 Quartz PDFContext 標記
    • 但 iOS 所有原生 App(備忘錄、Pages、Safari⋯)匯出的 PDF 都帶 Quartz PDFContext 標記,無法單憑此判斷 producer
    • 結果:使用者匯入到 Notability 當底圖的「備忘錄匯出 PDF」被誤判為「Notability 完整筆記匯出」並被抓出
    • 根本問題:真正的手寫筆畫在 Session.plist(vector ink),根本不存.note/PDFs/ 裡。.note/PDFs/ 只存使用者匯入的底圖資源
  2. Notability App「分享 → PDF」 — 需要 iPad/iPhone 在手,無法在 Mac 上批次處理

Impact

  • Claude / LLM 教學分析:Claude 的 Read 工具會把 PDF 頁面 rasterize 成圖像餵給視覺模型,能直接「看」手寫內容。HTML 的 <canvas> 渲染結果無法被工具擷取——LLM 只能讀到原始 JS 和 stroke 座標點,拼不出視覺內容。所以 Claude 理解 Notability 筆記需要 PDF 格式。
  • 列印 / 長期歸檔:PDF 跨平台可攜、能印出;HTML player 綁 JS 和錄音,不適合作為長期保存格式
  • 具體實例teaching/20260305_wei/lectures/05_20260410/筆記 2026-04-10 15_31_24.noteSession.plist 有 1.8 MB 筆畫資料,extract_notability_pdf.py 卻只抓到備忘錄底圖(PDF metadata Creator 欄位顯示「備忘錄」,不是 Notability),老師在 Notability 上的教學註記全部丟失

實作入口

Sources/MacDocCLI/MacDoc+Convert.swift:107 目前:

case ("note", "html"):
    try convertNoteToHTML(inputURL: inputURL)

建議補上:

case ("note", "pdf"):
    try convertNoteToPDF(inputURL: inputURL)

實作方向:重用 NoteToHTML 模組的 Session.plist 筆畫解析邏輯,但改用 Core Graphics (CGContext 的 PDF context) 繪製,而非 HTML Canvas。音訊部分在 PDF 中無法互動,可以:

  • 略過音訊(純筆畫版)
  • 或把錄音時間軸做成 PDF 側邊的時間標註(選配)

Notes

  • 做完這個之後,teaching-toolkit/lecture-add/scripts/extract_notability_pdf.py 應改為呼叫 macdoc convert --to pdf,淘汰目前不可靠的 heuristic

Metadata

Metadata

Assignees

No one assigned

    Labels

    P0Priority 0 — 立即處理featureNew feature

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions