> ## Content Index
> Fetch the complete content index at: http://localhost:2368/llms.txt
> Use this file to discover other available public pages before exploring further.

# 從 PDF 自動讀資料：定位方式決定成敗
- URL: http://localhost:2368/pdf-field-extraction-anchoring/
- Published: 2026-07-06T07:08:05.000Z
- Updated: 2026-08-23T13:54:25.000Z
- Description: 從 PDF 表格自動讀欄位值的完整教訓：標籤錨點定位通吃多版型、失敗要看得見、規則式與 AI 視覺怎麼選。
- Author: yuchang23
- Tags: #wiki, #wiki-experience

> **定義**：從 PDF 表格自動讀取欄位值（如圖號、品名）時，「怎麼定位值的位置」決定成敗——以標籤文字為錨點動態計算相對位置，才能通吃多種表格版型。

## 為什麼「從 PDF 讀資料」本質上就難

PDF 是「印出來的紙」的數位版：檔案內部只記錄「某段文字印在座標 (x,y)」，完全沒有「這一格是品名、那一格是圖號」的語意資訊。表格的格線只是畫出來的線條，跟文字沒有關聯。所以讀 PDF 欄位永遠是「猜位置」的遊戲。

另外要分兩種情況：CAD 軟體轉出的 PDF 帶有**文字層**（文字可以直接撈出來，這次的情況就是如此）；掃描出來的 PDF 只是一張圖片，要先做 OCR（光學文字辨識，把圖片變回文字），是完全不同且更難的問題。開工前先確認拿到的是哪一種。

## 三輪嘗試的對照

1. **從標籤文字往右找值**——兩個地雷：①圖框裡同時有 PART NO. 和 CUSTOMER PART NO. 兩個欄位，後者字串包含前者，搜尋時先撞到哪個就抓哪個，結果抓成客戶料號；②有些欄位的值印在標籤「下方」而不是右邊，往右找會撈到隔壁欄位的值。
2. **記住「值在座標 (x,y)」用固定位置抓**——當時只用一種版型的樣本開發，結果圖面實際有四種版型（中文橫式、中文直式、英文 A3 等）：直式圖框在頁面右側直排，英文版配置完全不同，換版型就全錯。教訓：開發前沒有先收集「所有版型」的樣本。
3. **以「標籤文字」為錨點、動態計算值的相對位置**——先用頁面長寬比判斷直式或橫式，再找「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 視覺當第二層，人工只處理兩層都失敗的。

## 相關條目

- [SDD：規格先行的開發流程](https://yuchang23.com/spec-driven-development/?ref=localhost)