GitHub release License: MIT Python 3.9+ Supported Formats Last Commit
日常文件轉 Markdown —— 涵蓋 PDF、Office、Apple Keynote/Numbers、EPUB 電子書等 16 種格式。中文友好、表格保留、隱私優先、全程本地。
屬於 notoriouslab 開源工具組的一員 · 需要 Python 3.9+
| 平台 | 下載 | 架構 |
|---|---|---|
| macOS | Doc Cleaner-1.6.0.dmg | Universal(Intel + Apple Silicon) |
| Windows | Doc Cleaner-1.6.0.msi | x86_64(含 ARM Windows) |
首次開啟 macOS 版:右鍵 → 開啟(Ventura 以前)或系統設定 → 隱私權與安全性 → 仍要開啟(Sonoma/Sequoia)
或在 Terminal 執行一次:
xattr -cr /Applications/Doc\ Cleaner.app
doc-cleaner 專注日常文件抽取——把你每天遇到的文件轉成乾淨、可讀的 Markdown:PDF、Word、Excel、PowerPoint、Apple Keynote/Numbers、EPUB 電子書,中文無損、表格完整、全程本地不上雲。
能同時做到中文友好 + 表格保留,又涵蓋 Apple Keynote/Numbers 與 EPUB 的免費工具並不多——這個組合正是 doc-cleaner 的強項。
典型使用:
- 🖥️ 桌面 App — 拖放文件或整個資料夾、自選輸出位置、轉後可即時預覽;零設定,macOS/Windows 雙擊即用(非技術用戶首選)
- 📊 金融對帳單 — Big5/CP950 自動偵測,交易清單與數字完整無損
- 🎬 簡報/電子書 — Keynote 投影片、EPUB 章節,依閱讀順序抽成 Markdown
- 📄 多格式批處理 — 16 種格式混合輸入,統一輸出 Markdown(CLI)
- 🔒 隱私優先 —
--ai none純文字或 Ollama 本地推理,文件不上雲端 - 🤖 AI Agent 整合 — OpenClaw 等框架可直接 shell 呼叫,附帶
SKILL.md支援
| 特色 | 做法 |
|---|---|
| 日常格式最完整 | PDF、Office、Apple Keynote/Numbers、EPUB、DXF... 16 種格式,一個工具搞定 |
| 中文 + 表格無損 | Big5/CP950/UTF-16 自動偵測;DOCX/XLSX/PDF 表格 → Markdown pipe table,數字完整 |
| 隱私 & 無 AI 模式 | --ai none 純文字提取(零 API key、零雲端);或用 Ollama 本地推理 |
下載 DMG(macOS)或 MSI(Windows),安裝後拖放文件即用,不需要 Python。 詳見上方「下載桌面 App」表格。
# 1. Clone git clone https://github.com/notoriouslab/doc-cleaner.git && cd doc-cleaner # 2. 安裝 pip install -r requirements.txt # 3. 執行 python cleaner.py --input ./documents/ --ai none
輸出: ./output/ 下每個檔案對應的 .md 檔案
場景 1:純文字提取(無 API key)
# 最簡單的方式,零成本
python cleaner.py --input statement.pdf --ai none場景 2:用 Gemini 提高品質(雲端推薦)
cp .env.example .env
# 編輯 .env,填入 GEMINI_API_KEY
python cleaner.py --input statement.pdf --ai gemini場景 3:本地 Ollama(隱私優先)
# 需先安裝並啟動 Ollama(見下方 Ollama 選型)
python cleaner.py --input statement.pdf --ai ollama場景 4:預覽不寫入
python cleaner.py --input ./documents/ --dry-run --verbose
高品質 PDF 表格提取、PDF 解密、PPTX/DXF 支援等:
# 高品質 PDF 提取(推薦) pip install opendataloader-pdf # 需要 Java 11+ # PDF 視覺模式(掃描 PDF) pip install pdf2image # 另需 poppler:brew install poppler # PDF 解密 pip install pikepdf # 額外格式(PPTX / DXF) pip install python-pptx ezdxf
設定 API key(若使用雲端):
cp config.example.json config.json
cp .env.example .env
# 編輯 .env 填入 GEMINI_API_KEY 或 GROQ_API_KEY不是所有 PDF 都一樣。doc-cleaner 自動分類後決定處理策略:
| 類型 | 特徵 | 處理方式 |
|---|---|---|
| 原生文字 | 字元密度 ≥8,亂碼 <5%,短行 ≤70% | 直接提取(快速、免費) |
| 格式破碎 | 短行 >70%(表格被壓扁) | opendataloader-pdf 表格提取 / AI 視覺 + 文字 |
| 掃描圖片 | 字元密度 <8 | PDF 轉圖 + AI 視覺處理 |
推薦做法(最省錢):
# 步驟 1:全部用 --ai none 提取(快速、免費、隱私) python cleaner.py --input ./documents/ --ai none --output-dir ./output/raw # 步驟 2:檢查 log,只對「掃描圖片」的檔案跑 AI python cleaner.py --input scanned.pdf --ai gemini
台灣金融業對帳單常見投資風險告知、法律聲明等固定內容。兩種清洗機制:
| 機制 | 行為 | 場景 |
|---|---|---|
| 尾部截斷 | 第一次匹配後全部截掉 | 文件尾部的法律聲明 |
| 中間移除 | 單獨移除該段落 | 夾在中間的行銷廣告 |
在 config.json 設定:
{
"ad_truncation_patterns": ["謹慎理財.{0,20}信用至上"],
"ad_strip_patterns": ["※(注記)運動賺回饋"]
}安全機制:若截斷會移除 >70% 內容,程式自動跳過並警告。所有正則在啟動時驗證。
表格在 doc-cleaner 是一等公民:
- DOCX:
python-docx直接提取 → Markdown pipe table - XLSX/CSV:
pandas.to_markdown()— 所有工作表 - PDF:opendataloader-pdf 直接輸出完整 pipe table(無需 AI)
- AI 提示詞:明確指示保留現有表格原樣
| 選項 | 效果 |
|---|---|
--ai none |
零 API key、零雲端,本機純提取 |
--ai ollama |
本地 Ollama 推理,文件不上網 |
--ai gemini / --ai groq |
雲端推理,更高品質 |
其他安全機制:
- 原子寫入 — 臨時檔 +
os.replace(),無半殘輸出 - 機密隔離 — API key 只在
.env,啟動時自動檢查 - OOM 防護 — PDF 視覺模式預設最多 15 頁(可調整)
- JSON 降級 — AI 回傳失效時自動降級為 raw text
本專案使用 BeeWare Briefcase 進行跨平台桌面應用程式的建置與打包。
- 確保已安裝 Python 3.9+。
- 建立並啟用 Python 虛擬環境:
python -m venv venv # 啟用虛擬環境 (Windows PowerShell) .\venv\Scripts\Activate.ps1 # 啟用虛擬環境 (macOS/Linux) source venv/bin/activate
- 升級 pip 並安裝 Briefcase 與專案依賴套件:
pip install --upgrade pip pip install briefcase pip install -r requirements.txt
在啟用虛擬環境的狀態下,於專案根目錄執行以下 Briefcase 指令:
| 步驟 | 指令 | 說明 |
|---|---|---|
| 1. 建立結構 | briefcase create |
下載適用於當前平台的 Python 嵌入式運行環境,並建立專案結構 |
| 2. 編譯應用程式 | briefcase build |
編譯應用程式 (在 Windows 會建置出 Doc Cleaner.exe) |
| 3. 執行測試 | briefcase run |
在開發測試模式下直接運行建置好的 App 視窗 |
| 4. 打包安裝檔 | briefcase package |
封裝成平台的安裝檔。在 Windows 會自動安裝 WiX 並產生 .msi 安裝包 |
建置完成後的安裝套件將會生成於 dist/ 目錄中。
python cleaner.py [選項]
--input, -i 要處理的檔案或目錄(必填,不遞迴)
--output-dir, -o 輸出目錄(預設:./output)
--config 設定檔路徑(預設:<程式目錄>/config.json)
--ai gemini | groq | ollama | none(預設:config 或 gemini)
--password PDF 解密密碼(優先於 .env 和 config)
--summary 輸出 JSON 摘要到 stdout(供腳本/Agent 解析)
--format, -f 輸出格式:md (預設) | epub | both (同時產出 Markdown 與 EPUB)
--epub-zh-hant 將簡體中文轉換為繁體中文
--translate-zh-hant 將英文內容翻譯成繁體中文 (台灣習慣用語)
--dry-run 預覽不寫入
--verbose 除錯日誌
--version 版本資訊
Exit code: 0 = 全部成功 · 1 = 部分失敗 · 2 = 設定錯誤
{
"ai": {
"backend": "gemini", // 預設後端
"prompt_template": "prompts/default.txt", // 提示詞路徑
"gemini": { "model": "gemini-2.5-pro" },
"groq": {
"model": "meta-llama/llama-4-scout-17b-16e-instruct",
"timeout": 120
},
"ollama": {
"model": "qwen3.5:9b",
"host": "http://localhost:11434"
}
},
"pdf": {
"dpi": 200,
"max_pages": 15
},
"output": { "frontmatter": true },
"ad_truncation_patterns": ["謹慎理財.{0,20}信用至上"],
"ad_strip_patterns": ["※(注記)運動賺回饋"]
}機密管理: API key 只在 .env,不可放 config.json。啟動時自動驗證。
# .env 範例
GEMINI_API_KEY=...
GROQ_API_KEY=...
PDF_PASSWORD=...doc-cleaner 內建 2 個提示詞範本:
| 檔案 | 用途 |
|---|---|
prompts/default.txt |
通用文件清洗 |
prompts/finance.txt |
銀行對帳單、財務報表 |
自訂: 在 prompts/ 新增 .txt 檔,AI 輸出必須是 JSON:
{
"title": "簡短標題",
"summary": "1-2 句摘要",
"refined_markdown": "完整清洗後 Markdown",
"tags": ["標籤1", "標籤2"]
}表格重建是高難度,小模型力不從心。資源夠可試試 qwen3.5 系列(原生視覺):
| 模型 | 大小 | 視覺 | 表格重建 | 中文 | 建議 |
|---|---|---|---|---|---|
qwen3.5:27b |
17 GB | ✓ | 好 | 優 | 效果最佳 |
qwen3.5:9b |
6.6 GB | ✓ | 可 | 好 | 預設,平衡最佳 |
qwen3.5:4b |
3.4 GB | ✓ | 差 | 可 | 輕量但表格勉強 |
qwen3:30b |
19 GB | — | 好 | 優 | MoE 快速,無視覺 |
建議: qwen3.5:9b 可跑掃描 PDF;qwen3:30b 只用原生文字 PDF。8GB RAM 用戶建議用 --ai gemini 或 --ai none。
| 格式 | Parser | 表格 | 備註 |
|---|---|---|---|
| PDF(原生) | PyMuPDF find_tables() / opendataloader-pdf | pipe table | find_tables 無需額外安裝;ODL 需 Java |
| PDF(掃描) | pdf2image → AI 視覺 | AI 重建 | 需 poppler(選裝) |
| PDF(加密) | pikepdf | pipe table | 選裝 |
| DOCX | python-docx | pipe table | 跨平台 |
| XLSX / XLS | pandas + xlrd | pipe table | 全工作表 |
| CSV | pandas | pipe table | 自動偵測編碼 |
| PPTX | python-pptx | pipe table | 投影片+備忘錄 |
| PPT | macOS textutil / LibreOffice | — | macOS 內建;Windows 需 LibreOffice |
| DOC | macOS textutil / LibreOffice | — | macOS 內建;Windows 需 LibreOffice |
| DXF | ezdxf | — | 工程圖文字、尺寸 |
| TXT / MD | stdlib | — | Big5/CP950/UTF-16 |
| JSONL | 內建 | — | Claude Code session transcript → Markdown |
| NUMBERS | numbers-parser | pipe table | Apple 試算表,每表格分節 |
| KEY | keynote-parser | — | Apple Keynote,每投影片分節(IWA 解析) |
| PAGES | QuickLook PDF | — | Apple Pages;新版需在 Pages 匯出 PDF 後再轉 |
| EPUB | 內建(lxml) | — | 電子書,依章節分節,含書名/作者 |
doc-cleaner 是標準 CLI,任何 AI agent 框架可透過 shell 呼叫。附帶 SKILL.md 供 OpenClaw 使用。
# Agent 範例:處理 + JSON 摘要
python cleaner.py --input document.pdf --ai none --summary--summary 輸出:
{"version":"1.0.0","total":1,"success":1,"failed":0,"files":[{"file":"document.pdf","output":"./output/document.md","status":"ok"}]}gmail-statement-fetcher → Gmail 自動下載 PDF 對帳單
↓
doc-cleaner → PDF/DOCX/XLSX → 結構化 Markdown
↓
personal-cfo → 月度審計 + 退休滑翔路徑(開發中)
各工具獨立可用,合併使用構成完整個人財務自動化流水線。
安全政策詳見 SECURITY.md
最簡單的貢獻方式:
- 新增廣告正則 — 加入你銀行的截斷/移除規則到
config.example.json - 新增提示詞範本 — 在
prompts/建立新的.txt檔 - 回報編碼問題 — 附上匿名化樣本和 log
詳見 CONTRIBUTING.md。
本專案程式碼採 MIT 授權。
doc-cleaner 建立在這些套件之上,誠實列出與其授權:
| 套件 | 用途 | 授權 |
|---|---|---|
| PyMuPDF | PDF 解析、表格偵測 | AGPL-3.0/商業雙授權 |
| python-docx | DOCX | MIT |
| pandas · openpyxl · xlrd | XLSX/XLS/CSV | BSD/MIT |
| python-pptx | PPTX | MIT |
| ezdxf | DXF | MIT |
| numbers-parser | Apple Numbers | MIT |
| keynote-parser | Apple Keynote | MIT |
| lxml | EPUB/XML 解析 | BSD |
| Pillow | 影像處理 | HPND |
| pywebview | 桌面 GUI | BSD |
| tabulate | Markdown 表格輸出 | MIT |
PyMuPDF 採 AGPL-3.0/商業雙授權;本專案原始碼公開於 GitHub,分發時符合 AGPL 的原始碼公開要求。