從 PDF 自動讀資料:定位方式決定成敗
從 PDF 表格自動讀欄位值的完整教訓:標籤錨點定位通吃多版型、失敗要看得見、規則式與 AI 視覺怎麼選。
定義:從 PDF 表格自動讀取欄位值(如圖號、品名)時,「怎麼定位值的位置」決定成敗——以標籤文字為錨點動態計算相對位置,才能通吃多種表格版型。
為什麼「從 PDF 讀資料」本質上就難
PDF 是「印出來的紙」的數位版:檔案內部只記錄「某段文字印在座標 (x,y)」,完全沒有「這一格是品名、那一格是圖號」的語意資訊。表格的格線只是畫出來的線條,跟文字沒有關聯。所以讀 PDF 欄位永遠是「猜位置」的遊戲。
另外要分兩種情況:CAD 軟體轉出的 PDF 帶有文字層(文字可以直接撈出來,這次的情況就是如此);掃描出來的 PDF 只是一張圖片,要先做 OCR(光學文字辨識,把圖片變回文字),是完全不同且更難的問題。開工前先確認拿到的是哪一種。
三輪嘗試的對照
- 從標籤文字往右找值——兩個地雷:①圖框裡同時有 PART NO. 和 CUSTOMER PART NO. 兩個欄位,後者字串包含前者,搜尋時先撞到哪個就抓哪個,結果抓成客戶料號;②有些欄位的值印在標籤「下方」而不是右邊,往右找會撈到隔壁欄位的值。
- 記住「值在座標 (x,y)」用固定位置抓——當時只用一種版型的樣本開發,結果圖面實際有四種版型(中文橫式、中文直式、英文 A3 等):直式圖框在頁面右側直排,英文版配置完全不同,換版型就全錯。教訓:開發前沒有先收集「所有版型」的樣本。
- 以「標籤文字」為錨點、動態計算值的相對位置——先用頁面長寬比判斷直式或橫式,再找「PART NO.」標籤的實際座標當錨點(搜尋時明確排除含 CUSTOMER 的字串——排除規則要先講),然後在「相對於錨點」的區域內撈值。四種版型通吃,幾百張只錯四張(99.3%)。
第三輪還處理了兩個棘手的細節:有些 PDF 的標籤文字被切成碎片(PART 和 NO. 分開存),要用多種變體嘗試比對;版次欄有的寫「01.」有的寫「01」(沒有點號),格式要都認得。真實文件的棘手細節永遠比想像多。
為什麼前兩輪會失敗
前兩輪都假設了「版型不變」:第一輪假設值一定在標籤右邊,第二輪假設值一定在同一個座標。真實文件的版型一定會變,只有「相對於錨點」的定位方式能跟著版型走。
剩下的失敗怎麼辦:看得見的失敗
最後 99.3% 成功、剩下 4 筆解析不了,不硬追 100%:系統畫面上做「解析狀態」篩選,失敗的圖面列在待人工清單,人工補登欄位。
設計原則:99% 自動+1% 看得見的失敗,遠勝 95% 自動+錯得無聲。最怕的不是解析失敗,而是解析「錯了但沒人知道」——錯的料號流進系統,比空白嚴重得多。
決策心得:驗收 checklist
以後做同類功能(從文件自動讀資料)時:
- 開工前先收集所有版型的實際樣本各幾張,一次給齊——只用一種樣本開發,就是第二輪的教訓。
- 驗收條件訂量化門檻(例如成功率 > 95%)而不是「做得出來」——當初就是這個門檻逼出第三輪重做,不然第一輪那種半成品就會過關。
- 要求「失敗要看得見」——解析不了的要進待人工清單,不准默默留空或亂猜。
- 欄位有相似名稱時(PART NO. vs CUSTOMER PART NO.)主動提醒 AI 注意排除規則。
- 驗收時故意混入各版型與不乾淨的資料測,不只拿乾淨樣本跑。
什麼時候該改用 AI 視覺模型
如果版型太多太雜、或是掃描檔沒有文字層,規則式解析器會寫不完;這時可以讓多模態 AI「看」整張圖框,直接問「品名是什麼」。代價:每張都要花模型費用、速度慢、偶爾答錯且不穩定。
判斷式:固定版型+大批量 → 規則解析器(快、穩、免費);版型長尾雜牌 → AI 視覺。也可以混合:規則器失敗的那 1% 自動丟給 AI 視覺當第二層,人工只處理兩層都失敗的。