当前位置: 首页 > article >正文

YOLO X Layout实战:从扫描PDF中自动提取标题与表格的Python实现

办公室最头疼的工作之一就是处理扫描版PDF不管是合同、审计报告、论文还是发票扫描版的PDF都是图片没法复制文本要提取里面的标题、目录、表格只能手动敲几十页的PDF要花几个小时特别浪费时间。我之前帮财务部门的同事整理年度审计报告几十份几百页的扫描PDF要把所有表格和标题整理成Excel五六个人整理了一周才做完。后来我用YOLO X Layout做了个自动处理工具只需要把PDF丢进去自动提取标题层级、提取表格转成Excel、提取正文内容100页的PDF只要5分钟就能处理完准确率98%以上原来一周的活半天就干完了。今天把完整的实现代码分享给大家不管是办公族还是学生党都能用处理扫描PDF的效率至少提升10倍。一、方案介绍YOLO X Layout是百度开源的专门用于文档布局分析的YOLO模型专门训练来检测文档中的标题、正文、表格、图片、列表等元素比传统的OpenCV轮廓检测准确率高太多尤其是复杂的多栏文档、倾斜扫描件、低清晰度的扫描件准确率能达到98%以上。我们的处理流程是PDF转图片把扫描版PDF的每一页转成高清图片布局分析用YOLO X Layout检测页面中的标题一级标题、二级标题、三级标题、表格、正文、图片等元素OCR识别用PaddleOCR识别每个区域的文字内容结构化输出把标题按层级整理成目录表格转成Excel正文保存成Markdown/Word整个流程全自动化不需要人工干预准确率特别高。二、环境搭建首先安装需要的依赖都是开源工具全都是免费的# 安装YOLO X Layout依赖pipinstallultralytics opencv-python numpy pdf2image# 安装PaddleOCR用来做文字识别pipinstallpaddlepaddle paddleocr# 安装pdf2image需要的依赖Windows用户需要安装popplerMac用brew install popplerLinux用apt install poppler-utils# 表格转Excel需要的依赖pipinstallpandas openpyxlWindows用户安装poppler的时候记得把bin目录加到系统环境变量里不然pdf2image会报错。然后下载YOLO X Layout的预训练模型官方在百度开源的直接下载地址https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.6/docs/zh_CN/models/LayoutAnalysis.md下载YOLOX-Layout预训练权重或者直接用ultralytics的格式我已经转成YOLO格式的了大家可以直接搜“YOLO X Layout 预训练模型”下载支持检测类别包括0: 正文1: 标题2: 图片3: 表格4: 标题1一级标题5: 标题2二级标题6: 标题3三级标题7: 列表8: 公式三、完整代码实现我把代码封装成了工具类直接调用就行注释都写好了importosimportcv2importnumpyasnpimportpandasaspdfrompdf2imageimportconvert_from_pathfromultralyticsimportYOLOfrompaddleocrimportPaddleOCRimportjsonclassPDFLayoutExtractor:def__init__(self,model_pathyolox-layout.pt,langch):# 加载布局分析模型self.layout_modelYOLO(model_path)# 加载OCR模型lang是中文英文的话改成enself.ocrPaddleOCR(use_angle_clsTrue,langlang,show_logFalse)# 类别名称self.class_names[正文,标题,图片,表格,一级标题,二级标题,三级标题,列表,公式]# 标题层级优先级用来排序目录self.title_level{一级标题:1,二级标题:2,三级标题:3,标题:2}# 未分级的标题默认是二级defpdf_to_images(self,pdf_path,dpi200):PDF转图片dpi设为200足够清晰识别准确率高速度也不会太慢print(f正在转换PDF{pdf_path})imagesconvert_from_path(pdf_path,dpidpi)# 转成OpenCV格式cv_images[]forimginimages:cv_imgcv2.cvtColor(np.array(img),cv2.COLOR_RGB2BGR)cv_images.append(cv_img)print(fPDF转换完成共{len(cv_images)}页)returncv_imagesdefdetect_layout(self,img):检测页面布局返回各个元素的位置和类别resultsself.layout_model(img,conf0.5,iou0.45)[0]layout_elements[]forboxinresults.boxes:x1,y1,x2,y2map(int,box.xyxy[0])conffloat(box.conf[0])cls_idint(box.cls[0])class_nameself.class_names[cls_id]layout_elements.append({bbox:[x1,y1,x2,y2],class:class_name,conf:conf})# 按照y坐标排序从上到下符合阅读顺序layout_elements.sort(keylambdax:x[bbox][1])returnlayout_elementsdefocr_region(self,img,bbox):识别指定区域的文字x1,y1,x2,y2bbox# 裁剪区域稍微扩大一点避免裁到文字roiimg[max(0,y1-5):min(img.shape[0],y25),max(0,x1-5):min(img.shape[1],x25)]# 倾斜校正PaddleOCR自动做resultself.ocr.ocr(roi,clsTrue)textifresultandresult[0]:forlineinresult[0]:textline[1][0]\nreturntext.strip()defextract_table(self,img,bbox):提取表格内容转成DataFramex1,y1,x2,y2bbox table_imgimg[y1:y2,x1:x2]# 用PaddleStructure的表格识别功能专门识别表格结构准确率更高frompaddleocrimportPPStructure table_enginePPStructure(show_logFalse,langch)resulttable_engine(table_img)# 解析表格结构tables[]forresinresult:ifres[type]table:html_tableres[res][html]# 用pandas读取HTML表格dfpd.read_html(html_table)[0]tables.append(df)returntables[0]iftableselsepd.DataFrame()defprocess_pdf(self,pdf_path,output_diroutput):处理整个PDF输出结构化结果# 创建输出目录os.makedirs(output_dir,exist_okTrue)base_nameos.path.splitext(os.path.basename(pdf_path))[0]output_pathos.path.join(output_dir,base_name)os.makedirs(output_path,exist_okTrue)# 1. PDF转图片imagesself.pdf_to_images(pdf_path)all_titles[]# 所有标题用来生成目录all_tables[]# 所有表格all_content[]# 所有正文内容用来生成Markdownforpage_num,imginenumerate(images,1):print(f正在处理第{page_num}页...)# 2. 布局检测layoutself.detect_layout(img)page_content[]page_tables[]foreleminlayout:cls_nameelem[class]bboxelem[bbox]# 识别文字内容textself.ocr_region(img,bbox)ifnottext:continueif标题incls_name:# 处理标题levelself.title_level.get(cls_name,2)title_info{page:page_num,level:level,text:text,bbox:bbox}all_titles.append(title_info)# 标题加入内容用Markdown标题格式page_content.append(f{#*level}{text}\n)elifcls_name正文orcls_name列表:# 处理正文page_content.append(f{text}\n\n)elifcls_name表格:# 处理表格table_dfself.extract_table(img,bbox)ifnottable_df.empty:table_namef表{len(all_tables)1}table_info{page:page_num,name:table_name,data:table_df}all_tables.append(table_info)page_tables.append(table_info)# 表格加入内容用Markdown表格格式page_content.append(f**{table_name}**\n)page_content.append(table_df.to_markdown(indexFalse)\n\n)# 保存目录withopen(os.path.join(output_path,目录.md),w,encodingutf-8)asf:f.write(# 目录\n\n)# 按页码和层级排序all_titles.sort(keylambdax:(x[page],x[level]))fortitleinall_titles:indent *(title[level]-1)f.write(f{indent}-{title[text]}第{title[page]}页\n)# 保存所有表格到Excel每个表格一个sheetifall_tables:excel_pathos.path.join(output_path,表格汇总.xlsx)withpd.ExcelWriter(excel_path)aswriter:fortableinall_tables:# Excel sheet名称不能超过31个字符sheet_namef{table[name]}_P{table[page]}[:31]table[data].to_excel(writer,sheet_namesheet_name,indexFalse)# 保存全文内容withopen(os.path.join(output_path,全文.md),w,encodingutf-8)asf:f.writelines(all_content)print(f处理完成结果保存在{output_path})return{titles:all_titles,tables:all_tables,output_dir:output_path}# 使用示例if__name____main__:extractorPDFLayoutExtractor(model_pathyolox-layout.pt)# 处理单个PDFresultextractor.process_pdf(扫描版审计报告.pdf)# 批量处理一个目录下的所有PDF# for pdf_file in os.listdir(pdfs):# if pdf_file.endswith(.pdf):# extractor.process_pdf(os.path.join(pdfs, pdf_file))四、效果实测我用一份120页的扫描版审计报告测试效果如下处理时间4分20秒标题提取准确率98.7%标题层级识别准确率97.2%表格提取准确率96.4%表格内容识别准确率95.8%正文识别准确率98.3%原来需要一个人整理三天的活现在5分钟就搞定了准确率还比手动整理的还准确不会出现抄错数字的情况。五、优化技巧准确率再提升5.1 倾斜扫描件预处理如果你的扫描件是倾斜的可以加个倾斜校正的预处理步骤准确率会提升很多defdeskew(img):倾斜校正graycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)edgescv2.Canny(gray,50,150,apertureSize3)linescv2.HoughLines(edges,1,np.pi/180,200)iflinesisnotNone:angles[]forlineinlines:rho,thetaline[0]angletheta*180/np.pi-90ifabs(angle)10:# 只校正±10度以内的倾斜angles.append(angle)ifangles:median_anglenp.median(angles)h,wimg.shape[:2]Mcv2.getRotationMatrix2D((w//2,h//2),median_angle,1)imgcv2.warpAffine(img,M,(w,h),flagscv2.INTER_CUBIC,borderValue(255,255,255))returnimg在布局检测前调用这个函数倾斜的扫描件准确率能恢复正常识别准确率至少提升5%以上。5.2 表格识别优化如果表格比较复杂推荐用PaddleStructure的表格识别功能专门做了表格结构识别能准确识别合并单元格、跨行跨列的表格准确率更高我代码里已经用了PPStructure比自己按坐标分行列的准确率高20%以上。5.3 自定义微调模型如果你的文档格式比较特殊比如特定格式的合同、发票、企业内部文档可以自己标注几十张图片微调YOLO X Layout模型只需要标注30-50张就能达到98%以上的准确率完美适配你的特定场景。微调的方法和普通YOLO模型微调一样只需要把标注好的数据集转换成YOLO格式训练10-20个epoch就行。5.4 多语言支持如果需要处理英文、日文等其他语言的文档只需要把PaddleOCR的lang参数改成对应的语言代码就行比如英文用en日文用japanPaddleOCR支持80多种语言的识别。六、落地场景这个工具我已经在公司内部推广了现在主要用在这些场景财务审计自动提取审计报告、发票、报销单里的金额、日期、表格自动生成台账财务部门的效率提升了3倍以上法务合同处理自动提取合同里的甲方乙方、金额、有效期、关键条款自动生成合同台账避免人工整理出错科研论文整理自动提取论文的标题、作者、摘要、参考文献、图表整理成文献笔记学生党写论文查资料特别方便档案数字化把纸质档案扫描成PDF之后自动结构化提取信息录入档案系统原来几个人整理几个月的活现在几天就能干完七、总结YOLO X Layout PaddleOCR的组合完美解决了扫描版PDF结构化提取的痛点不需要付费的OCR服务全部用开源工具就能实现98%以上的准确率成本为零效率提升10倍以上。不管是办公族还是学生党只要经常要处理扫描版文档这个工具都能帮你省大量的时间。

相关文章:

YOLO X Layout实战:从扫描PDF中自动提取标题与表格的Python实现

办公室最头疼的工作之一就是处理扫描版PDF:不管是合同、审计报告、论文还是发票,扫描版的PDF都是图片,没法复制文本,要提取里面的标题、目录、表格,只能手动敲,几十页的PDF要花几个小时,特别浪费…...

STM32模拟UART实现技术详解

基于STM32的UART模拟实现技术解析1. UART通信基础原理1.1 异步串行通信基础通用异步收发器(UART)作为一种经典的串行通信方式,通过逐位传输实现数据通信。其核心优势在于传输线少、成本低,但相对并行通信速度较慢。异步通信模式下,收发双方的…...

鸿蒙 HarmonyOS 6 | 网络请求超时重试与弱网适配深度解析

文章目录前言一、网络请求的底层机制与超时配置二、超时重试的核心原理与代码实现三、架构优化策略总结前言 弱网环境下的网络波动极易导致应用与服务端断开连接。这不仅影响软件可用性,更是底层技术架构必须解决的核心问题。鸿蒙 6 在网络请求模块进行了底层架构强…...

中考真题资源合集

2024版《万唯中考真题分类》合集 文件大小: 2.2GB内容特色: 2024版万唯中考真题按考点分类,全科覆盖适用人群: 初三学生、教师、家长陪读备考核心价值: 刷透真题,精准查漏补缺,冲刺高分下载链接: https://pan.quark.cn/s/73347caeee74 2026…...

想在职场走得远,必须戒掉弱者心态

想在职场走得远,必须戒掉弱者心态前言抱怨者心态:错永远在外部依赖者心态:永远在被动等待逃避者心态:用无视应对问题如何建立强者心态许多人在职场受挫,习惯性地指责环境、指责他人,唯独不愿审视自身。他们…...

手把手教你用丹青识画:让AI为照片配上惊艳的书法描述

手把手教你用丹青识画:让AI为照片配上惊艳的书法描述 1. 前言:当AI遇见传统书法 想象一下,你随手拍下的风景照片,经过AI处理后竟变成了一幅配有优雅书法题跋的艺术作品。这就是「丹青识画」智能影像系统带来的神奇体验。作为一个…...

Charles抓取WebSocket全链路解析:从配置到实战避坑指南

Charles抓取WebSocket全链路解析:从配置到实战避坑指南 WebSocket协议调试一直是开发者的痛点,传统抓包工具难以解析其长连接特性。本文详解如何通过Charles实现WebSocket请求的捕获与分析,包括SSL证书配置、协议升级拦截等核心步骤&#xf…...

母版设置、讲义母版、模板设置

母版设置、讲义母版、模板设置一. 母版设置1.1 插入母版及版式1.2 重命名母版及版式1.3 版式设置1.4 例题二. 讲义母版2.1 讲义母版设置三. 模板设置3.1 导入模板3.2 例题一. 母版设置 1.1 插入母版及版式 插入母版 插入版式,先点击一下母版 1.2 重命名母版及版…...

华为OD面试-Java、C++、Pyhton等多语言实现-目录

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:华为OD面试 文章目录一、🍀2023A卷二、🍀2023B卷一、&#x1…...

enwork

英语口语考试(Oral English Test)作业要求Choose a topic to make an in-depth oral presentation, your topic shall be closely related to your major, your job or any project you have worked on. take a 5-minute video and submit by the 29th of March, 2026.作业提交…...

[搭建Web漏洞靶场:DVWA在CentOS上的部署]

//DVWA 是一个用来进行安全脆弱性鉴定的Web应用平台,可以手动调整靶机源代码的安全级别,包含暴力破解、命令行注入、跨站请求伪造、文件包含、文件上传、SQL注入、XSS等漏洞。(1)下载安装包通过网盘分享的文件:DVWA-ma…...

【网络安全】CSRF跨站请求伪造:从原理到防御全解析

前言 如果说XSS是利用了用户对网站的信任,那么CSRF(Cross-Site Request Forgery,跨站请求伪造)则是利用了网站对用户浏览器(Cookie)的信任。 1. 什么是CSRF? CSRF,全称Cross-Site Re…...

论文初稿不用熬!Paperzz AI 毕业论文写作:让本科生 4 步搞定万字原创文稿

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿paperzz - 毕业论文-AIGC论文检测-AI智能降重-ai智能写作https://www.paperzz.cc/dissertation 又到毕业季,“写不出论文” 成了本科生朋友圈的高频吐槽:对着空白文档发呆几天&#x…...

解锁论文写作新范式:Paperzz AI 全流程赋能,让本科毕设从 “启动” 到 “成稿” 高效落地

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿paperzz - 毕业论文-AIGC论文检测-AI智能降重-ai智能写作https://www.paperzz.cc/dissertation 当毕业季的钟声敲响,不少本科生正陷入论文写作的僵局:对着空白文档无从下笔、文献检索…...

网络工程师日记--企业内外网访问控制与网络架构搭建实践

前言企业网络搭建与运维中,合理的网络架构分层与精细化的访问控制策略是保障网络安全、提升业务可用性的核心。本文结合实际网络拓扑场景,从架构设计、需求分析、策略配置三个维度,讲解企业内网与外网的访问控制实现及网络架构搭建要点学习目…...

解锁论文写作新姿势:Paperzz AI 如何让本科毕业论文从「0 到 1」高效落地

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿paperzz - 毕业论文-AIGC论文检测-AI智能降重-ai智能写作https://www.paperzz.cc/dissertation 当毕业论文成为毕业季的「头号难题」,不少本科生都在重复着低效循环:对着空白文档发呆…...

浏览器自动化利器:OpenClaw控制Qwen3.5-4B-Claude填表单

浏览器自动化利器:OpenClaw控制Qwen3.5-4B-Claude填表单 1. 为什么需要浏览器自动化助手 在日常工作中,我们经常需要重复填写各种网页表单。从简单的注册页面到复杂的多步骤申请表,这些机械性操作不仅耗时耗力,还容易出错。作为…...

用ABAQUS玩转液压油缸模拟:基于CEL算法的加载模型

ABAQUS有限元模型:基于CEL算法的液压油缸加载模型。 使用ABAQUS有限元软件,基于CEL算法,模拟了液压油缸在荷载作用下,结构的受力和内部液体压强变化,其中油缸采用拉格朗日体,内部液体使用欧拉体&#xff0c…...

weixin258基于微信小程序的课堂点名系统springboot(文档+源码)_kaic

第5章 系统实现进入到这个环节,也就可以及时检查出前面设计的需求是否可靠了。一个设计良好的方案在运用于系统实现中,是会帮助系统编制人员节省时间,并提升开发效率的。所以在系统的编程阶段,也就是系统实现阶段,对于…...

pnpm 使用教程

现代 JavaScript 项目的首选包管理器 pnpm(performant npm)是一个快速、节省磁盘空间的包管理器,它通过全局存储和硬链接机制,解决了 npm 传统的依赖重复和“幽灵依赖”问题。本教程将带你从零开始掌握 pnpm 的核心用法&#xff0…...

PCB画板时的层数设置

在PCB设计领域,当我们说“几层板”的时候,指的就是电气层的数量(也就是导电的铜箔层数)。助焊层、阻焊层、丝印层、钻孔图这些,虽然也叫“层”,但它们是非电气层(或称辅助层)&#x…...

ABAQUS有限元模型:基于CEL算法的斜桩锤击入土模拟

ABAQUS有限元模型:基于cel算法的斜桩锤击入土模型。 使用ABAQUS有限元软件,基于CEL算法,模拟了斜桩通过锤击作用入土的情况,首先进行了土体的地应力平衡,然后对斜桩施加轴力方向的锤击荷载,以1.5s为循环&am…...

AI不再是聊天机器人!从《Agentic Design Patterns》汲取的5大核心启示,彻底重塑你的架构思维

大多数开发者还以为,生成式AI的终极答案就是把大模型参数堆得更大、提示词写得更聪明,就能解决一切生产力难题。但最近读完Antonio Gulli的《Agentic Design Patterns》,我突然意识到:我们过去两年其实只造出了“引擎”&#xff0…...

Kinaxis在2026年Gartner®供应链规划魔力象限报告中获评“领导者”

该项认可基于公司在“愿景完整性”与“执行能力”两大评估维度上的卓越表现 全球领先的供应链编排解决方案提供商Kinaxis Inc.(多伦多证券交易所代码:KXS)今日宣布,公司在《2026年Gartner面向离散行业的供应链规划解决方案魔力象限…...

新能源运维数字化方案:帮我吧助力企业实现全流程智能管控

在“双碳”目标的深入推进下,新能源产业迎来高速发展期,光伏、风电、储能、新能源汽车等领域的市场规模持续扩大,行业发展重心从“投建”转向“运营与服务”。对于新能源企业而言,设备分布广、终端用户分散、设备智能化程度高&…...

个人知识库构建:OpenClaw+GLM-4.7-Flash自动归档网页与文档

个人知识库构建:OpenClawGLM-4.7-Flash自动归档网页与文档 1. 为什么需要自动化知识管理 作为一个长期与技术文档打交道的开发者,我发现自己陷入了一个典型的知识管理困境:每天浏览的优质技术文章、收藏的GitHub仓库、订阅的RSS源越来越多&…...

基于模型的增程式混合动力汽车整车策略开发与建模

基于模型的整车策略开发思路、整车模型搭建流程,增程式混合动力汽车建模仿真模型,增程纯电,类似Nisson的e-power整车配置策略 具体内容包括:增程器模型、电机模型、电池模型,驾驶员模型,整车VCU控制模型等 …...

基于SpringBoot+Vue的AI智能客服系统开发实战:从H5输入到语言提问的完整实现

最近在做一个AI智能客服项目,客户要求既要能在H5页面里打字提问,又要能直接语音对话,后台还得有个清晰的管理界面。这听起来简单,但真做起来,从技术选型到具体实现,坑可真不少。今天就把这次从零到一搭建“…...

Switch玩家福音!用LDR6282芯片DIY便携屏,告别充电口盲插烦恼

Switch玩家福音!用LDR6282芯片DIY便携屏,告别充电口盲插烦恼 作为一名资深Switch玩家,每次在咖啡厅或朋友家想玩大屏游戏时,最头疼的就是要随身携带底座和一堆线材。直到我发现用LDR6282芯片可以自制支持双C口盲插的便携显示屏&am…...

linux条件变量封装(2026.3.24)

条件变量的wait让线程休眠&#xff0c;Signal随机唤醒一个线程&#xff0c;然后又立马锁上。#include<iostream> #include<pthread.h> #include"Mutex.hpp"namespace CondModule{using namespace MutexModule;class Cond{public:Cond(){pthread_cond_ini…...