From 3047c479165ce7ffb75458604204cca8e854bef1 Mon Sep 17 00:00:00 2001 From: zk Date: Fri, 7 Aug 2026 16:12:46 +0800 Subject: [PATCH] =?UTF-8?q?pdf=E6=8F=90=E5=8F=96=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/tool/resume_text_extractor.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/tool/resume_text_extractor.py b/app/tool/resume_text_extractor.py index 1a69b72..7ae49a7 100644 --- a/app/tool/resume_text_extractor.py +++ b/app/tool/resume_text_extractor.py @@ -37,13 +37,18 @@ async def _parse_txt(content: bytes) -> str: async def _parse_pdf(content: bytes) -> str: - """解析 PDF:使用 PyMuPDF 逐页 get_text() 拼接为全文文本""" + """解析 PDF:使用 PyMuPDF 逐页 get_text() 拼接为全文文本 + + sort=True 按文本块坐标(y,x)排序输出,即视觉阅读顺序。 + 默认的内容流顺序对模板生成的简历完全不可用:这类简历的「公司/职位/时间」表头是绝对定位文本框, + 会被整批甩到全文最前面,与各自的职责描述相隔几十行,AI 无法还原归属关系。 + """ def _extract() -> str: parts: list[str] = [] with fitz.open(stream=content, filetype="pdf") as doc: for page in doc: - parts.append(page.get_text()) + parts.append(page.get_text("text", sort=True)) return "\n".join(parts) return await asyncio.to_thread(_extract)