症狀:所有 PDF 都直接送 OCR,批量任務變慢,還難以追查解析失敗原因。
最快解法:在 OCR 前加入 pdf-inspector PDF OCR 預檢層:文本版走原生解析,掃描版進入 OCR,混合型按頁分流;生產環境另外保留信心資訊、失敗回退與人工抽檢入口。
這篇文章適合三類讀者:正在批量處理合約、報告或論文的後端開發者;正在建設 RAG 資料管道、希望把 OCR 從預設步驟改成條件分支的 AI 工程師;以及準備租用遠端開發環境做壓力測試、需要先確認並發量與交付方式的團隊。
最後更新於 2026 年 8 月 10 日;介面與欄位核實自專案目前的 README、Python API 文件與標籤記錄。專案版本和欄位仍可能隨主分支變更,正式部署前應重新鎖定版本。
里程碑一:先把 PDF 分流結果定義清楚
不要一開始就討論 OCR 服務要用哪個引擎。你首先要決定四種結果各自交給誰:
- text_based:保留原生文字,進入原生 PDF 解析或 Markdown 轉換。
- scanned:頁面主要由影像構成,送往 OCR。
- image_based:視專案目前的分類定義,通常與掃描文件走同一條 OCR 路徑,但要單獨記錄。
- mixed:部分頁面有原生文字、部分頁面沒有文字;優先按頁判斷,只有在下游無法合併結果時才整份回退。
目前 Python 文件列出的結果至少包含 pdf_type、confidence、page_count、pages_needing_ocr、has_encoding_issues 與處理時間欄位。pages_needing_ocr 使用 1 起算的頁碼,而逐頁 Markdown 結果中的頁碼則有不同的索引規則,接入時不能直接混用。(github.com)
在寫佇列路由前,先向下游確認它需要的是哪一種交付物:
- 只要純文字:可將原生解析與 OCR 文字統一清洗。
- 要 Markdown:text_based 可以直接使用 Markdown 轉換結果;OCR 頁面則需要自行定義格式合併規則。
- 要頁面結構:保留頁碼、標題、表格與欄位資訊,不要只存一段長文字。
- 要 OCR 座標:必須把原生文字的 X/Y 座標與 OCR 引擎的框選資料分開保存,避免後續定位功能失效。
這一步能避免一個常見浪費:檢測已經成功,但下游只接受單一格式,最後仍然把整份 PDF 重新 OCR。
里程碑二:第一小時完成最小 Python 鏈路
截至本文核實的 Python 文件,套件安裝方式是:
pip install pdf-inspector
目前文件列出支援 CPython 3.8 或以上,並提供 Linux、macOS Intel、Apple Silicon 與 Windows 的預編譯套件;其他平台可能需要 Rust 工具鏈自行建置。(github.com)
先不要把佇列、重試、OCR 服務和資料庫全部接上。用一個文本版樣本與一個純圖片樣本,完成兩次最小驗證:
import pdf_inspector
result = pdf_inspector.detect_pdf("document.pdf")
print(result.pdf_type)
print(result.confidence)
print(result.page_count)
print(result.pages_needing_ocr)
如果你需要直接取得 Markdown,再使用完整處理函式:
result = pdf_inspector.process_pdf("document.pdf")
print(result.pdf_type)
print(result.markdown)
以上函式與回傳欄位以專案目前 Python 文件為準;不要把其他版本、網路文章或自行猜測的介面名稱直接放入生產程式。文件同時列出從記憶體位元組處理 PDF 的方法,適合你的上傳服務不落地保存檔案的情況。(github.com)
第一小時的驗證標準不是「程式沒有例外」,而是:
- 文本版能被辨識為可走原生解析的類型。
- 純圖片 PDF 能產生需要 OCR 的判斷。
confidence、頁數與需 OCR 頁面能被寫入日誌。- 失敗檔案不會被默認標記成 text_based。
- 你能拿同一份 PDF 重跑,得到可比較的結果。
里程碑三:把檢測改造成可審計的批量任務
單檔腳本成功後,下一步不是盲目提高並發,而是先建立任務資料模型。每筆任務至少保存以下資訊:
- 檔案雜湊,例如 SHA-256,用來識別重複檔案與避免錯誤覆寫。
- 原始檔案位置、頁數與檔案大小。
pdf-inspector版本、部署版本與檢測時間。pdf_type、confidence、pages_needing_ocr。has_encoding_issues、例外類型與回退原因。- 下游路由:native、ocr、mixed-page、manual-review。
- 最終狀態:成功、部分成功、重試、隔離或人工覆核。
批量處理時,建議把工作拆成三段:預檢佇列、原生解析佇列、OCR 佇列。預檢只負責分類和產生路由結果,不要在同一個消費者內長時間等待 OCR。這樣當 OCR 服務變慢時,文本版檔案仍可獨立完成,不會被一條慢分支拖住。
並發設定要用壓力測試決定,而不是直接照抄範例。至少測量:
- 預檢工作者的 CPU 使用率與記憶體峰值。
- OCR 分支的等待時間與重試次數。
- 單檔、批次與混合檔案的處理時長。
- 讀取檔案、寫入結果與傳送至 OCR 服務的頻寬。
- 佇列長度在尖峰後能否回落。
專案 README 的公開範例把檢測、原生提取與 OCR 路由拆成不同階段,並說明文件可回傳逐頁 OCR 路由資訊。這個設計適合用來建立可觀測的任務邊界,但其中的速度數字是專案公開資料,不是 Kvmkit 實測,也不應直接當成你的服務承諾。(github.com)
里程碑四:建立 OCR 預處理與失敗回退
真正的 OCR 預處理,不是把所有檔案轉成影像,而是先把可避免的 OCR 任務排除。
文本版
對 text_based 文件,優先使用原生文字提取。這樣可以保留字型、位置、欄位與連結等資訊,對報告、論文、發票與法律文件的結構化處理通常更有利。專案目前公開說明支援位置感知文字提取、多欄閱讀順序、表格偵測與 Markdown 轉換,但這些能力仍應用你的樣本做驗收。(github.com)
掃描 PDF
掃描 PDF 沒有可直接消費的文字層時,才把任務送進 OCR。送出前可先保留原始頁碼、旋轉資訊與檔案雜湊,避免 OCR 結果回寫時無法對應原文件。
混合型 PDF
混合型 PDF 不應預設整份 OCR。若 pages_needing_ocr 能準確列出缺少文字層的頁面,而你的下游能接受逐頁合併,應只對這些頁面執行 OCR;其餘頁面保留原生解析結果。專案目前的逐頁 Markdown 結果包含 needs_ocr 與版面資訊,正好可以用來建立這種分支。(github.com)
但在以下情況,整份回退可能更安全:
- 下游只接受一個連續文字流,無法保存頁面邊界。
- OCR 與原生文字的排序規則不同,合併後會破壞段落順序。
- 文件頁面互相引用,局部 OCR 會讓版面重建不一致。
- 你的驗收結果顯示按頁合併的錯誤率高於整份處理。
必須隔離的邊界至少包括加密 PDF、損壞檔案、空白頁、異常字型編碼、只有圖片但分類不穩定的檔案,以及 OCR 後文字量異常低的頁面。對這些情況,不要只回傳 failed;要記錄「為何失敗」以及「下一步要走哪條路」。
決策條件:何時選原生解析,何時回退 OCR
- 若
pdf_type是text_based,confidence穩定,且沒有編碼異常,則選原生解析。 - 若
pdf_type是scanned或image_based,則選 OCR。 - 若
pdf_type是mixed,且下游支援頁面合併,則按pages_needing_ocr分流。 - 若是
mixed,但下游只能接受單一文字流,則先做小批量對照;品質不穩時回退整份 OCR。 - 若檢測拋出例外、信心資訊不足或檔案疑似損壞,則標記
ocr_fallback或manual_review,禁止默認走原生解析。 - 若同一檔案重試後仍失敗,則停止無限重試,將原始檔案、版本和錯誤原因移入隔離區。
里程碑五:用人工樣本完成上線驗收
上線前至少準備一組人工標註資料,內容要覆蓋文本版、掃描 PDF、混合型、空白頁、加密檔案、異常字型與多欄文件。每份樣本都要有預期類型、需要 OCR 的頁面,以及下游應該取得的文字或 Markdown 特徵。
驗收分成兩層:
第一層是分類驗收。
核對 pdf_type、信心資訊、頁數和 OCR 頁面清單。不能只看 API 是否回傳成功,因為「成功回傳錯誤路由」仍會讓後面的知識庫產生錯誤資料。
第二層是內容驗收。
抽查標題、段落順序、表格、頁碼、中文文字、特殊符號與 OCR 座標。對 RAG 管道而言,文字存在不等於內容可用;表格欄位錯位、頁面順序錯誤或編碼異常,都可能在切片後變成難以察覺的檢索錯誤。
目前專案公開基準使用 200 份 PDF,並在 2026 年 7 月 31 日更新了測試結果;README 列出的測試包含閱讀順序、表格、標題與處理速度。不過這是專案使用指定語料與指定環境的公開基準,不能代替你對合約、論文或企業內部文件的驗收。(github.com)
獨立 FAQ:接入時最容易卡住的四個問題
這一節把長尾需求直接落到部署決策上,方便你在寫服務設計文件時引用。
如何自動判斷 PDF 是否需要 OCR
不要只用「提取文字長度是否為零」作判斷。先呼叫檢測函式,再綜合 pdf_type、confidence、pages_needing_ocr 和編碼異常。文本版且結果穩定時走原生解析;掃描、圖片、混合或檢測失敗時,才進入 OCR 或人工回退。
混合型 PDF 應該整份 OCR 還是按頁處理
如果你的下游可以保留頁碼並合併兩種結果,優先按頁處理,只 OCR 指定頁面。若下游只能接受一段連續文字,或原生文字與 OCR 的閱讀順序無法可靠對齊,再用抽樣資料比較整份 OCR 與按頁合併,選擇品質較穩的一條路。
pdf-inspector 如何接入現有 Python 服務
把 detect_pdf 或 detect_pdf_bytes 包裝成預檢函式,統一輸出分類、信心資訊、頁數、OCR 頁面與錯誤原因。上傳服務只負責入列,後續由不同工作者消費 native、ocr 和 manual-review 任務,避免預檢請求被 OCR 長時間阻塞。
PDF 類型檢測失敗時如何回退
檢測失敗時不要猜測檔案類型,也不要把空結果當成文本版。先保存雜湊、版本、例外和原始檔案;能正常渲染的檔案送 OCR,無法渲染或涉及權限問題的檔案進人工覆核。重試次數應設上限,避免壞檔案佔滿佇列。
里程碑六:持續監控與版本回歸
生產環境至少建立四組監控:
- 類型比例:text_based、scanned、mixed 和異常檔案各佔多少。
- 回退率:多少檔案由原生解析回退到 OCR 或人工覆核。
- 處理時長:預檢、原生解析、OCR 和整體任務分開計算。
- 失敗原因:加密、損壞、編碼、空白頁、逾時和下游拒絕分開統計。
版本升級時,固定使用同一組人工標註樣本回歸。專案標籤頁顯示,近期版本曾加入逐頁 Markdown 與版面分類結果,也曾調整欄位型別與 OCR 路由能力;因此不要只更新套件後重新部署,應同步檢查回傳欄位、頁碼索引與分類定義。(github.com)
如果你要在 CI/CD 中鎖定版本,至少保存套件版本、作業系統架構、Python 版本、樣本檔案雜湊和預期輸出。專案的公開標籤與發布記錄可以作為版本核對入口,但正式環境仍應以你實際安裝到的套件與測試結果為準。(github.com)
在部署細節上,你也可以先查看 Kvmkit 的幫助中心,確認遠端開發環境的連線、檔案傳輸與交付方式,再安排壓力測試。若團隊需要多人共同驗收,則應事先約定輸入檔案、輸出目錄、日誌保存期限與測試完成條件。
先抽樣還是直接擴容:最後的採購判斷
- 若你還沒有人工標註資料,或混合型 PDF 佔比不明,先抽樣,不要直接擴容。
- 若預檢分類穩定,但 OCR 佇列長期堆積,再擴充 OCR 工作者。
- 若主要問題是檔案讀取、硬碟或頻寬,先改善資料交付方式,增加 CPU 不一定有效。
- 若需要多人短期測試不同 Python、Rust 或 OCR 版本,優先準備可重建的遠端開發環境。
- 若任務會長期穩定執行、需要固定硬體周邊或本地檔案介面,自建伺服器或自購設備可能更合適。
直接在現有辦公電腦上測試,常見問題是檔案權限混亂、環境版本不一致、硬碟空間不足,以及多人共用時無法重現同一批任務;臨時雲端主機則可能遇到連線、資料搬運、閒置成本和環境保存方式不一致。若你只需要短期壓力測試、版本驗證或批量 OCR 預處理,租用 Kvmkit 的 Mac 環境通常更容易把測試範圍、使用週期與交付方式切開;但長期固定重負載或需要實體介面的團隊,仍應先比較自購設備與其他部署方案。你可以進一步查看 Mac 遠端開發環境的租用選項,再決定是先抽樣驗證,還是直接安排完整批次測試。
常見問題
如何在自動化管道中判斷 PDF 是否需要 OCR?
先讓 pdf-inspector 執行檢測,再根據 pdf_type、confidence、pages_needing_ocr 與編碼異常決定路徑。text_based 且信心資訊穩定的檔案優先原生解析;scanned、image_based 或指定頁面需要 OCR 時,才送往 OCR 服務。
混合型 PDF 應該整份 OCR 還是按頁處理?
若下游能合併原生文字與 OCR 結果,混合型 PDF 優先按頁處理,只對 pages_needing_ocr 的頁面執行 OCR。若下游只接受單一連續文字流,或頁面順序與座標難以合併,再考慮整份回退,並保留原始頁碼與回退原因。
pdf-inspector 如何接入現有 Python 服務?
可在既有上傳或佇列消費者內呼叫 detect_pdf、process_pdf 或 process_pdf_bytes。建議先封裝成獨立預檢函式,輸出類型、信心資訊、頁數、需 OCR 頁面與錯誤原因,再由下游工作者決定原生解析或 OCR。
PDF 類型檢測失敗時,服務應該怎樣回退?
檢測例外、檔案損壞、加密、空白頁或字型編碼異常時,不要把檔案當成 text_based。將任務標記為 needs_review 或 ocr_fallback,保留雜湊、版本與錯誤資訊;能安全渲染時送 OCR,否則隔離並交由人工檢查。
把 CI/CD 放在 M4 Mac mini 上,才算真正省心
Xcode, Fastlane, CocoaPods, and SPM are first-class on macOS. Mac mini M4 unified memory keeps signing and archiving smooth; ~4W standby power suits 24/7 build nodes.