[Bug]: MinerU PDF positions are emitted in the service’s normalized bbox space instead of PDF page space

用 MinerU OCR 模型解析含大表格的 PDF 时,若“跳转到原文”高亮、分块缩略图或按需裁剪区域出现整体比例偏移,通常说明后端把 MinerU 返回的 0–1000 归一化 bbox 直接当成 PDF 页面坐标写入了 positions / _pdf_positions ,优先排查 Go 侧

快速结论:用 MinerU OCR 模型解析含大表格的 PDF 时,若“跳转到原文”高亮、分块缩略图或按需裁剪区域出现整体比例偏移,通常说明后端把 MinerU 返回的 0–1000 归一化 bbox 直接当成 PDF 页面坐标写入了 positions / _pdf_positions,优先排查 Go 侧 mineruBBoxPosition 是否做了坐标换算。

适用环境:已确认:RAGFlow 源码提交 4e240ab24(分支 fix/paddleocr-pdf-highlights,基于 upstream/main,合并提交 3c79c1958);Go 摄取链路、PDF 解析、MinerU OCR 模型。相关症状在 v0.25.1 / v0.26.2 上有报告。Issue 未提供操作系统、Python、CUDA、显卡信息。

最快修复方案:升级到包含 #21267 的 main 分支构建;该修复让 mineruBBoxPosition 用 middle.json 中的 page_size 把 0..1000 的 content_list bbox 换算为 PDF 点坐标后再写入位置字段。

注意事项:该结论来自源码审查与已有症状报告 #16268 的对照,并非在真实 MinerU 服务上复现验证;不同 MinerU 版本 content_list.json 的 bbox 空间可能不同(0–1000、0–1 或原始像素),升级后仍需确认所使用的 MinerU 版本与 middle.json 是否提供有效 page_size,缺失时坐标可能仍不可用。

问题场景

用户在 RAGFlow 中配置 MinerU OCR 模型并解析 PDF(尤其是包含宽表或大表格的文档)后,前端“跳转到原文”的高亮框、分块缩略图以及按需裁剪页面区域出现整体偏移。偏移表现为坐标被乘以一个固定比例,与页面实际内容位置不吻合。用户看到的不是坐标缺失,而是坐标数值错误;重新解析同一文件仍会复现。

报错原文

[Bug]: MinerU PDF positions are emitted in the service's normalized bbox space instead of PDF page space

The offset appears to be multiplied by a fixed scaling factor, as if bounding box coordinates are not being correctly converted to display coordinates

原因分析

最可能的原因:Go 摄取链路中的 mineruBBoxPosition(internal/ingestion/component/pdf_vision_dispatch.go)仅把 MinerU 的 0 基 page_idx 转为 1 基页码、重排 bbox 顺序,就直接返回 [page, left, right, top, bottom],全程没有按页面尺寸做缩放。MinerU 的 content_list.json bbox 是 0–1000 归一化坐标,而下游消费者按 PDF 点(72 dpi 页面尺寸)解释这些值,因此写入 _pdf_positions 和 positions 的坐标与真实页面位置存在比例偏差。

Python 侧的 deepdoc/parser/mineru_parser.py 已有 _content_bbox_to_page_space 和 _middle_bbox_to_page_space 做换算,并分别处理 0–1000 归一化、0–1 归一化与源像素三种情况,在页面尺寸缺失或无效时打印警告;Go 路径缺少对应逻辑,导致同一条链路上两条解析路径行为不一致。该判断基于源码审查与 #16268 的症状对照,未在实际 MinerU 服务上复现。

环境排查

  • 确认 RAGFlow 版本或提交号是否包含 #21267;若未包含,则问题大概率仍存在。
  • 确认解析 PDF 使用的是 MinerU OCR 模型路径,而非 PaddleOCR 或 pdf_parser_paddleocr.go 相关路径(后者已用 pdfium.PageSizes 做换算)。
  • 确认所用 MinerU 版本的 content_list.json bbox 是 0–1000 归一化、0–1 归一化还是源像素,这决定换算系数。
  • 确认 middle.json 中是否存在有效 page_size;缺失或无效时换算无法进行。
  • Issue 未提供操作系统、Python、CUDA、PyTorch、显卡版本信息,无需以这些版本作为排查前置条件。

解决步骤

  1. 先判定是否为同一问题:解析一份已知页面尺寸、含大表格的 PDF,核对保存的 positions / _pdf_positions 数值。若数值落在 0–1000 范围而页面尺寸明显大于该范围,基本可确认坐标未换算。
  2. 更新到包含 #21267 的 main 分支构建,使 mineruBBoxPosition 按 middle.json 的 page_size 把 0..1000 的 content_list bbox 换算为 PDF 点坐标。
  3. 若无法立即升级,可按 Python 侧 _content_bbox_to_page_space 的逻辑自行在 Go 路径中补换算:左/右按宽度、上/下按高度分别乘以页面尺寸除以 1000,并保证输出仍为 1 基页码的 [page, left, right, top, bottom]。此项为根据 Issue 期望行为的推导,可优先尝试。
  4. 当无法确定 bbox 空间或页面尺寸缺失时,按 Python 侧行为记录警告,而不是静默写入不可用坐标。
  5. 重新解析受影响的 PDF,不要仅依赖旧解析结果;已有的错误坐标不会自动更正。

验证方法

重新解析同一份含大表格的 PDF 后,检查 positions / _pdf_positions 是否与页面点坐标量级一致(而非集中在 0–1000);在前端验证“跳转到原文”高亮框、分块缩略图和按需裁剪区域是否与原文位置吻合,重点观察宽表区域。若坐标仍按固定比例整体偏移,说明换算未生效或页面尺寸取值有误,需继续核对 MinerU 版本对应的 bbox 空间。

参考来源

infiniflow/ragflow #21220

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 30441

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注