留白投影欄位偵測(無框線表格)
ocr/structure 只有在*每一列*的儲存格左緣 x 都在容差內相符時才偵測得到表格——對 ragged
或無框線表格、右對齊數字欄、或任何缺格的列都會失敗。edge_lines.find_grid 需要框線,
因此純以留白繪製的表格根本沒有網格。column_layout 以版面分析文獻常用的穩健方法找欄位:
靠*間隙*。它把 OCR 框投影到 x 軸(墨水密度剖面),讀出持續為空的垂直帶作為欄間隙(gutter),
為每個框指派欄索引,並依垂直間距分群成列,輸出無框線表格。
純標準函式庫,作用於純框字典(差分陣列投影——不需 numpy),因此可在無影像、無 OCR 引擎下
完整單元測試。重用 table_grid_fill 的框邊界讀取器。不匯入 PySide6。
無頭 API
from je_auto_control import (detect_borderless_table, column_gutters,
assign_columns, vertical_projection)
table = detect_borderless_table(ocr_boxes)
# {"n_rows": 3, "n_cols": 2, "rows": [["Name","Age"],["Ann","30"],["Bob","25"]],
# "columns": [{"start": 70, "end": 120, "width": 50}]}
gutters = column_gutters(ocr_boxes, min_gap=8) # 空白垂直帶
tagged = assign_columns(ocr_boxes) # 每個框 + "column" 索引
profile = vertical_projection(ocr_boxes) # 每個 x 的墨水密度
vertical_projection 回傳每個 x 的墨水密度剖面;``column_gutters`` 回傳至少 min_gap 寬
的內部空白帶 [{start, end, width}];``assign_columns`` 為每個框標上 0 起算的 column;
detect_borderless_table 將欄(來自 gutter)與列(來自垂直間距)組合成
{n_rows, n_cols, rows, columns},或在欄數少於 min_cols / 列數少於 min_rows 時回傳
None。框接受 {x, y, width, height} 或 {left, top, right, bottom} 加上可選 text。
執行器指令
AC_detect_borderless_table``(``boxes / page_width / min_gap / min_cols /
min_rows → {found, table})與 AC_column_gutters``(``boxes / page_width /
min_gap → {count, gutters})。兩者以 MCP 工具 ac_detect_borderless_table /
``ac_column_gutters``(唯讀)及 Script Builder 指令 Detect Borderless Table /
Column Gutters (whitespace)**(位於 **OCR 分類下)形式提供。