PDF是一种日常工作中广泛使用的跨平台文档格式,常常包含丰富的内容:包括文本、图表、表格、公式、图像。在现代信息处理工作流中发挥了重要的作用,尤其是RAG项目中,通过将非结构化数据转化为结构化和可访问的信息,极大地提高了信息检索和生成的准确性、效率和实用性。所以PDF文档提取在RAG中显得尤为重要。
目前提取PDF文档内容的思路主要分为三个精细度:
下面是几个开源的PDF提取工具分析调研和总结,希望能跟感兴趣的同行一起分享学习。
这是一个Python处理PDF的神器,后面会重点写博客,介绍这个工具的使用技巧和方法。
PyMuPDF 1.24.9 documentation
PyMuPDF 是一个基于 MuPDF 引擎的轻量级 PDF 处理库,用于在 Python 中处理和分析 PDF (和其他)文档。它提供了丰富的功能,包括从 PDF 中提取文本和图像、处理注释、生成页面截图等。PyMuPDF 的设计目标是高效、灵活且易于使用,适合需要对 PDF 文档进行深入处理的开发者和数据分析师。
核心依赖于 MuPDF 引擎,MuPDF 是一款高性能的 PDF 和 XPS 渲染器,专注于快速、紧凑的 PDF 处理。PyMuPDF 将 MuPDF 的强大功能通过 Python 接口暴露出来,提供给用户。
优点:
缺点:
1. PyMuPDF4LLM
支持将PDF转换为Markdown格式,也支持输出LlamaIndex的文档输出。可以识别文本、表格、图片和标题。
测试结论:实际测试发现,这里面还是存在很多问题,比如左右版面的pdf没办法正确输出顺序。但是其中识别pdf文档标题的内容可以借鉴,还有识别图片准确位置的方法可以借鉴,后续用于优化我们的PDF提取功能。
2. PyMuPDF Pro
在PyMyPDF支持pdf的基础上,增加对Office文档的支持,包括doc/docx、xls/xlsx、ppt/pptx、hwp/hwpx。不过效果也一般,跟实际解析word、ppt文档的效果还差一些。
3. PyMuPDF OCR
基于Tesseract-OCR服务,实现pdf的扫描版文字解析,基本原理是把扫描版pdf转成图片,然后提交给Tesseract-OCR进行OCR识别。
测试结论:但是功能有限,OCR识别准确率很低,且需要提前指定语言,只能识别指定语言的内容。就算指定了语言,识别效果也很差,准确率低于50%。
这个工具是国内团队开源出来的,对于中文PDF提取效果很好,后面会详细介绍这个项目的原理和源码
OpenDataLab 是一个专注于数据和人工智能研究的开源平台,致力于提供高质量的数据集、模型和工具,支持科研人员和开发者的工作。并且提供开源数据处理全流程的工具,包括数据提取、数据清洗、数据标注、数据质量评估、数据可视化与分析等。本文中重点关注数据提取工具MinerU。
项目地址:opendatalab/MinerU: A one-stop, open-source, high-quality data extraction tool, supports PDF/webpage/e-book extraction.一站式开源高质量数据提取工具,支持PDF/网页/多格式电子书提取。 (github.com)
MinerU是一个一站式、开源、高质量的数据提取工具,主要包含以下功能:
这里重点调研了提取PDF的功能,下面是详细介绍。
Magic-PDF是OpenDataLab基于PDF-Extract-Kit实现的PDF提取工具平台,实现了精确和高效的提取PDF英文和中文文档的功能,可以在cpu和gpu上运行,并且提供命令行和API两种使用方式。核心的功能包括:
提供的用户API包括:
整体测试识别得准确率较高,基本高于95%,跟PyMyPDF识别普通版pdf的效果差不多。下面是详细的功能点测试效果说明。
功能点 | 测试效果 | 备注说明 |
识别pdf类型(普通/扫描) | 可以识别普通类型和扫描版本的pdf,还可以识别pdf是否被加密了,如果是加密了,则不解析。 | 1、竖向的文字没办法识别 2、扫描版的pdf识别效果挺好,并且自动去掉页眉页脚等元素 3、普通类型的pdf识别效果反而不如PyMuPdf,会有一些文字识别不太准确 |
识别版面元素,删除页眉/页脚/脚注,保留正文图表 | 扫描pdf和普通pdf都可以识别,并且去掉了页眉页脚的内容 | 1、有时候识别得并不精确,反而会去掉一些不属于页眉页脚的内容 2、如果页眉页脚里版面内容比较近,就没办法去掉。一般有明显标记的页眉页脚,能很好的去掉,比如横线等。所以也跟训练模型的输入有关 |
解析数学公式,并将公式转换成latex | 学术论文的公式可以正常识别,但是简单公式识别效果不理想 | 这里应该是因为模型训练使用的学术论文较多,所以识别学术论文的公式效果比较好,识别普通的比如“1+N”这种公式反而效果不好了 |
保留原文档的结构,包括标题、段落、列表 | 扫描pdf和普通pdf都可以做到 | 1、标题识别出来都是一级标题,感觉没有做区分? 2、段落内部的每一行识别出来也有多余的换行符 3、列表识别出来无法区分有序和无序 |
提取图像 | 扫描pdf和普通pdf都可以做到 | 1、但是扫描版本的图像切割的时候,有部分会把周边的文字切入进来,不过问题不大,能正常识别出来 |
提取表格 | 能够正确的识别表格,但是表格提取很慢 | 目前在16G内存cpu的环境中,识别一个很小的表格,比如5行5列的表格,基本上的400秒左右。 |
整个项目分为如下几个模块:
1. 原始文档分类
2. 版面检测
1)布局检测
使用LayoutLMv3模型进行区域检测,如图像
,表格
,标题
,文本
等。LayoutLMv3-SFT指的是我们在LayoutLMv3-base-chinese预训练权重的基础上进一步做了SFT训练后的模型。论文验证集由402张论文页面构成,教材验证集由587张不同来源的教材页面构成。
2)公式检测
公式检测:使用YOLOv8进行公式检测,包含行内公式
和行间公式
;
YOLOv8-Trained是在YOLOv8l模型的基础上训练后的权重。论文验证集由255张论文页面构成,多源验证集由789张不同来源的页面构成,包括教材、书籍等。
3. 内容识别方式
1)公式识别
使用UniMERNet进行公式识别;
直接使用的是UniMERNet的权重
2)表格识别
目前支持三种表格识别方式:
3)OCR识别
使用PaddleOCR进行文本识别;
项目简介
项目地址:ocrmypdf/OCRmyPDF: OCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched (github.com)
说明:OCRmyPDF是基于TesseractOCR实现,用于对扫描版PDF文件进行OCR(光学字符识别)的开源工具。它的核心功能是通过OCR技术将扫描版PDF中的图像转换为可搜索和可复制的文本,从而生成一个数字版PDF。这个工具的工作原理大致如下:
OCR识别工具,在PDF提取中,主要用于识别PDF中的文字内容,常见的
项目地址:PaddlePaddle/PaddleOCR: Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80+ languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices) (github.com)
官方文档地址:概述 - PaddleOCR 文档 (paddlepaddle.github.io)
说明:是中文开源项目,对中文的支持最好,所以国内的PDF识别开源项目大多基于这个项目进行OCR识别
项目地址:tesseract-ocr/tesseract: Tesseract Open Source OCR Engine (main repository) (github.com)
文档地址:tesseract/README.md at main · tesseract-ocr/tesseract (github.com)
说明:由谷歌维护的开源OCR引擎,支持多种语言。它对格式良好的文本非常准确,广泛应用于各种应用中。、
项目地址:JaidedAI/EasyOCR: Ready-to-use OCR with 80+ supported languages and all popular writing scripts including Latin, Chinese, Arabic, Devanagari, Cyrillic and etc. (github.com)
说明:一个基于Python的OCR工具,支持80多种语言,使用简单的API从图像中提取文本。它很容易集成到现有的Python项目中。
说明:LayoutLMv3是微软为文档理解任务开发的模型。它是LayoutLM系列的第三个版本,将语言模型的功能与空间布局信息相结合,使其对于需要理解文本和文档布局的任务特别有效。
项目地址:unilm/layoutlmv3 at master · microsoft/unilm (github.com)
文档地址:unilm/layoutlmv3/README.md at master · microsoft/unilm (github.com)
说明:是一种用于图像或者视频中对象检测的深度学习模型,它是 YOLO(You Only Look Once)系列模型的最新版本。YOLOv8 继承了 YOLO 系列模型的快速、实时检测的优点,同时在精度和性能方面进行了显著提升。可以检测出图像或者视频中的物体,并返回边界框,同时能将图像中的不同对象分割出来,生成像素级掩码,也能对整个图像分类,识别图像的主要内容或者类别,检测出物体的关键位置点,如人脸的眼睛鼻子等。在PDF提取中,主要用来做公式检测。
项目地址:ultralytics/ultralytics: NEW - YOLOv8 in PyTorch > ONNX > OpenVINO > CoreML > TFLite (github.com)
文档地址:Home - Ultralytics YOLO Docs
说明:是一种将Table图像转换为LaTeX的模型工具,该模型能够从可视化表格图像中精确地获得相应的LaTeX描述,并执行多个与表格相关的推理任务,包括结构提取和问答,从而拓宽了其应用范围和潜力。
项目地址:UniModal4Reasoning/StructEqTable-Deploy: A High-efficiency Open-source Toolkit for Table-to-Latex Task (github.com)
是专门用来文档类图像的表格结构还原,表格结构模型均属于序列预测方法,结合RapidOCR,将给定图像中的表格转化对应的HTML格式。
RapidAI/RapidTable: 基于序列表格识别算法推理库,集成PP-Structure和modelscope等表格识别算法。