设计漂亮的网站,做系统正版win10系统下载网站,四川建设公共查询平台,为什么登录不上wordpress1 需求描述
最近工作需要从PDF文档中按照章节解析出对应的文本和图片(后续可能还会有表格)#xff0c;经过调研#xff0c;找到了一个功能强大的解析工具MuPDF#xff0c;对应的Python包是PyMuPDF。本篇博客记录使用它来实现具体功能。 官方文档#xff1a;https://pymupd…1 需求描述
最近工作需要从PDF文档中按照章节解析出对应的文本和图片(后续可能还会有表格)经过调研找到了一个功能强大的解析工具MuPDF对应的Python包是PyMuPDF。本篇博客记录使用它来实现具体功能。 官方文档https://pymupdf.readthedocs.io/en/latest/index.html 2 利用书签中标题划分章节
在PDF中点击书签或者目录页中具体一个标题时文档页面会跳转到对应的章节“跳转”的实现说明了其背后有一套机制(交叉引用)记录了各级标题和正文页面的对应关系。
PyMuPDF解析书签中各层级标题的接口为Document.get_toc()该接口可以返回书签的层级、名称、点击它跳转到的页码及具体到目标页的哪个位置。 接口介绍 get_toc(simpleTrue/False)# 参数simpleTrue时返回简单版本的各级目录包括[标题层级, 标题名称跳转到的页码]例如
[
2, // 第二级
旅行规划, // 名称
9, // 对应正文的第9页(该字段index从1开始)
]# 参数simpleFalse时在跳转到的页码基础上增加了to指向跳转页具体的坐标点(x, y)
[2, 用户手册介绍 , 9,
{kind: 1, xref: 3112,
page: 8, to: Point(43.937, 29.877015),
zoom: 0.0, collapse: False
}]详细文档
利用对书签的解析获取到了: (1)文档的层级关系: 包含多少第一级大标题、每个第一级标题下又有多少二级标题以此类推可以获取完整的文档结构 (2)每一级标题在正文中的页面范围例如从第3页(43,40)到第5页的(253, 400)。
因此可以实现按照章节的拆分。
3 基于章节的文本解析
划分章节后每一章节在正文中的位置由起始页面、起始页面的坐标、结束页面、结束页面坐标描述例如start_page 5, (start_x 43, start_y 36)end_page 8, (end_x 134, end_y238)。 起始页和结束页只需要解析该章节范围内的文字选择使用Page.get_textbox()方法获取矩形框rect范围内的文字 中间页需要在获取页面全部范围内的文字后过滤页眉和页脚。因此选择使用Page.get_text(“blocks”)方法按块获取该页内所有段落的坐标、文字内容及类型(文本、图片)然后根据坐标过滤掉页眉、页码等不需要的文字内容。 文本乱序问题作者插入顺序可能不是按照阅读顺序导致解析出来的文字出现了乱序例如第5行的文字解析出来之后在第10行文字的后面解决乱序问题主要是通过设置参数sortTrue(默认为False)将解析的文本按照坐标排序来获得按照自然阅读顺序的文本。 单双列布局问题双列布局的页面根据页码的坐标来区分是左侧还是右侧。
4 扫描PDF解析
图片扫描成的PDF并不是按照PDF标准形成的文档没有包含文本信息按照 3 中的方法获取的文本是空的。
其中一种解决方法是使用OCR获取图片中的文本
(1)OCR的工具有多种如PyMuPDF文档提及的OCRMyPDF(免费)。选择OCRMyPDF的话需要配置依赖的两个软件:tesseract和gs并且由于OCRMyPDF默认的文字识别模型支持英文在中文情况下需下载对应的中文识别模型。 (2)OCR获取文字会存在识别错误的情况要考虑识别错误对后续处理是否会造成影响。
5 基于章节的图片解析 使用Page.get_image_info(hashesFalse, xrefsFalse)接口获取图片的元信息包括图片的原始宽高、嵌入到pdf后的bbox以及交叉引用的序号xref获取元信息主要是为了使用位置信息来判断图片属于哪个章节 然后使用Document.extract_image(xref)根据元信息中的xref获取存储的图片信息并保存
6 小结
最近解析文档最大收获在于要明确自己的需求根据需求去选择工具PyMuPDF提供的接口功能很强大面对布局多样的文档不要急于动手可以多查阅官方文档寻找更合适的接口在此基础上设计方案。分享发现的宝藏博客博主的系列文章记录了使用PyMuPDF将pdf文档转为word的过程。