引言:堆积如山的PDF报告
医院病理科每月产生超过400份病理/化验PDF报告——DNA倍体分析、TCT液基细胞学、HPV分型检测、胃镜病理、外科病理……这些报告以PDF文件形式散落在文件服务器上无法检索、无法统计、无法与HIS/EHR系统互通。病理科想要按疾病类型统计发病率临床医生想快速查找某个病人的历史报告信息科想做数据分析和互联互通——但面对一堆非结构化的PDF文件这些都无从谈起。这就是我启动Lab2FHIR项目的直接原因把非结构化的化验单/病理PDF报告自动转换为国际医疗数据交换标准HL7 FHIR R4格式让数据真正活起来。二、需求分析到底要解决什么问题跟病理科聊完需求其实很明确。覆盖6种常见报告DNA倍体分析65份、TCT液基细胞学77份、HPV基因分型79份、胃镜病理87份、外科病理78份、非妇科细胞学13份共计404份真实样本。每种报告有不同的关键字段——DNA要提取DI值、SPF值和染色体状态胃镜病理要提取慢性炎症、活动性、萎缩、肠化四项评分。输出采用 HL7 FHIR R4 标准格式DiagnosticReport Observation Bundle配 LOINC 编码映射支持按姓名、病理号、诊断关键词全文检索。部署上医院有自己的规矩内网环境不能连外网服务器跑的是 Windows Server 2019越轻越好别给信息科添麻烦。三、技术选型够用就好需求明确了选型没有纠结。后端用 FastAPI异步高性能自带接口文档。PDF提取用 pdfplumber因为404份样本全是文本型PDF根本用不着OCR。数据库选 SQLite FTS5单文件零配置内置全文搜索查一次只要6毫秒。前端用 Vue 3 Element Plus拖拽上传、三栏对照布局很快就能搭出来。PDF预览靠 PDF.js浏览器端直接渲染支持缩放翻页。认证用 JWT bcrypt区分病理科管理员和临床医生两个角色。部署用 nginx nssm 注册成 Windows 服务开机自启。为什么不选Docker医院服务器在内网拉镜像不方便。Python nginx 直接跑在Windows上信息科同事更容易理解和维护。四、开发过程AI辅助下的4天实战整个项目从零到上线4天42次提交。AI编码助手Claude Code全程参与架构设计、代码编写、测试和文档。第一步跑通核心链路。 用pdfplumber把PDF文字提取出来患者姓名、性别、年龄、病理号、诊断结论都能准确获取。import pdfplumberdef extract_text(file_path):with pdfplumber.open(file_path) as pdf:return “\n”.join(page.extract_text() or “” for page in pdf.pages)第二步报告类型自动识别。 不同报告格式差异巨大必须先识别类型再调对应解析器。这里有个坑胃镜病理和外科病理的报告抬头都写病理诊断报告单如果先匹配病理诊断胃镜报告就被错误归类了。解决办法很简单——胃镜特征词慢性炎症活动性萎缩肠化优先检查病理诊断兜底匹配。PARSER_PRIORITY [(“胃镜病理”, check_gastric), # 优先检查胃镜特征词(“HPV分型”, check_hpv),(“TCT细胞学”, check_tct),(“DNA倍体”, check_dna),(“细胞学”, check_cytology),(“病理诊断”, check_pathology), # 兜底匹配]第三步6种专用解析器。 以DNA倍体分析为例需要从表格提取DI值、SPF值、五条染色体倍体状态最终结构化存入JSON。第四步FHIR R4标准化输出。 将结构化数据映射到国际标准格式生成含LOINC编码的Bundle。这是整个项目对外价值的核心——有了FHIR数据才能对接HIS、参与互联互通。{“resourceType”: “Bundle”,“type”: “collection”,“entry”: [{“resource”: {“resourceType”: “DiagnosticReport”,“code”: {“coding”: [{“system”: “http://loinc.org”,“code”: “47527-7”,“display”: “Cytology report”}]}}}]}第五步三栏对照前端。 解析结果、PDF原文、FHIR JSON三栏并排展示用户边看原文边核对数据一目了然。五、关键挑战与解决思路挑战一同名不同类。 DNA和TCT报告共用F系列病理号。去重不能只看病理号必须用病理号报告类型做复合键。挑战二跨页诊断。 部分外科病理的诊断结论跨越多页。策略是先把所有页的文本拼起来再整体匹配不是逐页解析。挑战三Unicode兼容。 报告里有全角中文引号、特殊字符µm³。解析器要同时兼容半角和全角变体不然正则匹配直接漏掉。挑战四Windows离线部署。 生产环境是Windows Server 2019内网服务器。放弃Docker改用nssm把FastAPI注册成Windows服务nginx反向代理前端开机自启零外网依赖。六、成果展示404份PDF样本诊断提取成功率100%404份全部成功。覆盖6种报告类型7个API端点。FTS5全文搜索6毫秒响应单份PDF解析约200毫秒。前端5个页面首页仪表盘、批量导入、报告列表、详情三栏对照、病人时间线。6个后端测试加1个E2E测试保障质量。部署到Windows服务器后病理科和临床医生在浏览器里就能搜索病人的历史报告按疾病类型筛选统计。FHIR标准输出也为后续对接HIS系统做好了准备。1首页2报告列表3病人详情4报告详情