转换管线说明

将扫描版 PDF(含 OCR 文本层)重建为 LLM 友好的 Markdown。

用法

export PYTHONPATH="C:/Users/1atk/AppData/Roaming/Python/Python314/site-packages"
C:/Python314/python.exe extract.py    # 阶段1:几何抽取(需 ../汉英翻译教程.pdf)
C:/Python314/python.exe build_md.py   # 阶段2:结构重建 + 清洗 + 输出

产出(上级目录):汉英翻译教程.md、chunks/unit_NN.md、清洗报告.md

核心设计

关键结论:不能依赖 PyMuPDF 的 get_text() 线性流。 本书是扫描件,
OCR 文本层按 y 序跨列混排,直接取文本会把中英对照框的左右栏逐行交错。

环节做法
抽取单位文字块(block)级 bbox,非行级——行级 y 抖动导致分栏误判
双栏判定按块【左边界 x0】分簇:中文栏 x0≈67,英文栏 x0≈244,取间隙中点作分界
对照框范围中英块 y 区间【交集】;框外内容按 y 序独立成块
页边剥离页脚 y0>=690;页眉 y0<=52 且(字号<8.6 或形如「第N单元」或含噪点字符)
输出顺序框外(上) → 中文栏全文 → 【参考译文】→ 英文栏全文 → 框外(下)
OCR 清洗词形修正 / 句末 o→。 / 顿号 • → 、 / CJK 半角逗号 / 生僻乱码字

已知 OCR 层缺陷(已处理)

  • 栏串行:中文栏末句接续左栏内容 → 由几何分栏解决
  • 句末标点误识:requirements o、characteristicso → 规则修正
  • 序号误识:人、核心概念解读、4、核心概念解读 → 按栏目名反查正确序号
  • 页眉噪点:Mr — »Mi —第二年兀、第H-单元 → 页眉判据剥离
  • 跨栏注释断裂:(2017年10月18日… 与续行分属不同区域 → 未闭合括号吸附

中间产物

  • raw_pages.json:246 页的结构化块(含坐标、字号、kind)
  • clean_log.json:逐条剥离/修正记录