OCR:parse_layout 上传文件名写死 image.jpg,PDF 被当图片解析,且不返回文字内容(CHSAnalyzer3 文献全文) #34
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
背景
版本:polygateway 1.3.0(CHSAnalyzer3 的 chsdev 环境);仓库 HEAD
25a90eb上transports/monkey_ocr.py的相关代码与之相同。CHSAnalyzer3 要把几百篇医学论文的 PDF 交给自建的 MonkeyOCR(FastAPI),整份转成带页码的正文和表格,供后面的 LLM 抽取用。MonkeyOCR 的
POST /parse本身支持整份 PDF(OpenAPI 描述为「Parse complete document (PDF or image)」),但经 PolyGateway 走不通。原因有两处。问题一:上传文件名写死成 image.jpg,PDF 被当成图片解析
transports/monkey_ocr.py:208-210:MonkeyOCR 是按上传文件名判断类型的,不是按内容。2026-10-21 实测,把同一份 2 页的 PDF(公开论文 PRISMA 2020 的前两页)用 curl 直连
/parse发两次,只改 multipart 的 filename:filename=doc.pdf:返回"message":"PDF parsing (standard) completed successfully",用时 8 秒。结果包里有doc_middle.json(pdf_info共 2 页)、doc_content_list.json和doc.md。filename=image.jpg:返回"message":"image parsing (standard) completed successfully",走的是图片分支。所以
OcrClient.parse_layout(pdf_bytes)会被服务端按图片处理。问题二:parse_layout 只返回版面框,不返回文字
OcrLayoutElement(types.py:1187-1196)只有type、bbox、page_index三个字段。_parse_pages/_parse_block只从_middle.json里取块的类型和坐标。块里的文字、表格内容都没有交回调用方。医院那条线用它定位表格区域,所以够用;但整篇文档转文字需要的正是内容本身。结果包里其实已经有现成的内容:
_content_list.json是逐块的内容,带page_idx;.md是整篇 Markdown,表格为 HTML 或 Markdown 形式。希望的能力
一个「整份文档解析」的调用,比如
OcrClient.parse_document(data: bytes, *, filename: str 或 media_type: str, ...)。治理链路照旧:限流、熔断、重试、遥测、tenant_id和meta。xxx.pdf和application/pdf。.md一致。call_deadline_s已经可以按调用覆盖,只是需要确认默认值和熔断判定不会把长文档误判成服务慢。parse_layout现有的行为不用动,医院那条线还在用。使用规模
CHSAnalyzer3 的文献特征库:几百篇 PDF,估计几千页。并发不超过 2,因为这台 OCR 服务医院那条线也在用。
复现
两次返回的
message不同,分别是 PDF parsing 和 image parsing。已在 1.3.11 发布(2026-10-22):
v1.3.11tag、Gitea registry 包、Release 均已就绪。本版解决了什么
OcrClient.parse_document(bytes):整份 PDF/图片交给 MonkeyOCR,返回逐块的类型 / 页码 / bbox / 文字(表格为 HTML)与整篇 Markdown;治理链路(限流、熔断、重试、遥测、tenant_id/meta、call_deadline_s)与parse_layout同一循环。%PDF-),三个方法共用。同时修复了recognize_text(PDF)的静默错误:此前 PDF 标成image.jpg,服务返回success:true加幻觉文本。_middle.json与配对.md,不读会转义* \~ $的_content_list.json`。timeout_s不是总耗时上界,硬上限靠call_deadline_s ≤ lease_ttl_s,README「运维须知」有部署配方。验证
main 合并后:
make lint退出 0;全套件 2239 passed;活体tests/integration/test_monkey_ocr_document_live.py3 passed;真实多页 PDF 端到端得到 89 / 30 个元素(含表格 HTML)。已从 registry 重新下载 wheel,哈希与本地构建一致,并确认包内含新代码。请注意
后续
#35(共享分类对确定性坏输入 500)、#36(
recognize_text不校验success)、#37(parse_layout原生异常漏出与download_url主机)。