工具分享 | PDF文档解析工具PyMuPDF

1 需求描述

最近工作需要从PDF文档中按照章节解析出对应的文本和图片(后续可能还会有表格),经过调研,找到了一个功能强大的解析工具MuPDF,对应的Python包是PyMuPDF。本篇博客记录使用它来实现具体功能。

官方文档:https://pymupdf.readthedocs.io/en/latest/index.html

2 利用书签中标题划分章节

在PDF中,点击书签或者目录页中具体一个标题时,文档页面会跳转到对应的章节,“跳转”的实现说明了其背后有一套机制(交叉引用),记录了各级标题和正文页面的对应关系。

PyMuPDF解析书签中各层级标题的接口为Document.get_toc(),该接口可以返回书签的层级、名称、点击它跳转到的页码及具体到目标页的哪个位置。

  • 接口介绍

    get_toc(simple=True/False)
    
    # 参数simple=True时,返回简单版本的各级目录,包括[标题层级, 标题名称,跳转到的页码],例如:
    [
    2,             // 第二级
    '旅行规划',     // 名称
    9,             // 对应正文的第9(该字段index从1开始)
    ]
    
    # 参数simple=False时,在跳转到的页码基础上,增加了'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_y=238)。

  • 起始页和结束页只需要解析该章节范围内的文字,选择使用Page.get_textbox()方法获取矩形框rect范围内的文字:


     

     
  • 中间页需要在获取页面全部范围内的文字后,过滤页眉和页脚。因此选择使用Page.get_text(“blocks”)方法按块获取该页内所有段落的坐标、文字内容及类型(文本、图片),然后根据坐标过滤掉页眉、页码等不需要的文字内容。


     
  • 文本乱序问题:作者插入顺序可能不是按照阅读顺序,导致解析出来的文字出现了乱序,例如第5行的文字解析出来之后在第10行文字的后面;解决乱序问题主要是通过设置参数sort=True(默认为False),将解析的文本按照坐标排序,来获得按照自然阅读顺序的文本。

  • 单双列布局问题:双列布局的页面,根据页码的坐标来区分是左侧还是右侧。

4 扫描PDF解析

图片扫描成的PDF并不是按照PDF标准形成的文档,没有包含文本信息,按照 3 中的方法获取的文本是空的。

其中一种解决方法是使用OCR获取图片中的文本:

(1)OCR的工具有多种,如PyMuPDF文档提及的OCRMyPDF(免费)。选择OCRMyPDF的话需要配置依赖的两个软件:tesseract和gs,并且由于OCRMyPDF默认的文字识别模型支持英文,在中文情况下需下载对应的中文识别模型。








 

(2)OCR获取文字会存在识别错误的情况,要考虑识别错误对后续处理是否会造成影响。

5 基于章节的图片解析

  • 使用Page.get_image_info(hashes=False, xrefs=False)接口获取图片的元信息,包括图片的原始宽高、嵌入到pdf后的bbox以及交叉引用的序号xref;获取元信息主要是为了使用位置信息来判断图片属于哪个章节;


     
  • 然后使用Document.extract_image(xref)根据元信息中的xref获取存储的图片信息并保存;


     

6 小结

  • 最近解析文档最大收获在于:要明确自己的需求,根据需求去选择工具;PyMuPDF提供的接口功能很强大,面对布局多样的文档,不要急于动手,可以多查阅官方文档寻找更合适的接口,在此基础上设计方案。
  • 分享发现的宝藏博客,博主的系列文章记录了使用PyMuPDF将pdf文档转为word的过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/96188.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rke安装k8s

1、修改集群中各物理机主机名hostname文件 # 查看 cat /etc/hostname # 命令修改 hostnamectl set-hostname k8s-master2、实现主机名与ip地址解析 # 查看cat /etc/hosts # 修改 vi /etc/hosts3、配置ip_forward过滤机制 # 修改 vi /etc/sysctl.conf net.ipv4.ip_forward1…

Self-supervised 3D Human Pose Estimation from a Single Image

基于单幅图像的自监督三维人体姿态估计 主页: https://josesosajs.github.io/ imagepose/ 源码:未开源 摘要 我们提出了一种新的自我监督的方法预测三维人体姿势从一个单一的图像。预测网络是从描绘处于典型姿势的人的未标记图像的数据集和一组未配对…

Python游戏开发-超级海盗!!!

开发环境配置 安装python环境后,下载pygame模块,使用如下命令 pip install pygame 注:该项目使用了一些新特性,使用3.10以上的版本 游戏项目介绍 游戏分为两个模块,分别是编辑模块和关卡模块,在编辑模…

【个人博客系统网站】框架升级 · 工程目录 · 数据库设计

【JavaEE】进阶 个人博客系统(1) 文章目录 【JavaEE】进阶 个人博客系统(1)1. 使用Spring全家桶 MyBatis框架进行开发2. 页面2.1 登录页2.2 注册页2.3 详情页2.4 我的博客列表页3.5 所有人的博客列表页3.6 添加博客页3.7 修改文…

Redis与Mysql区别

一、关系型数据库 mysql,pgsql,oracle ,sqlserver 支持连表关联查询(会有一些特定的语法特特性) 二、非关系型数据库 redis,mongodb,memcache (key-value) 三、关系型数据库与非关系型数据库的区别: 1&am…

java八股文面试[多线程]——synchronized锁升级过程

速记:偏向-轻量-重量 锁膨胀 上面讲到锁有四种状态,并且会因实际情况进行膨胀升级,其膨胀方向是:无锁——>偏向锁——>轻量级锁——>重量级锁,并且膨胀方向不可逆 一.锁升级理论. 在synchronized锁升级过程…

【UE 材质】实现角度渐变材质、棋盘纹理材质

目标 步骤 一、角度渐变材质 1. 首先通过“Mask”节点将"Texture Coordinate" 节点的R、G通道分离 2. 通过“RemapValueRange”节点将0~1范围映射到-1~1 可以看到此时R通道效果: G通道效果: 继续补充如下节点 二、棋盘纹理材质 原视频链接&…

python调用git出错:ImportError: Failed to initialize: Bad git executable.

报错信息 #报错信息 Traceback (most recent call last): File “”, line 1, in File “C:\Python27\lib\site-packages\git_init_.py”, line 85, in raise ImportError(‘Failed to initialize: {0}’.format(exc)) ImportError: Failed to initialize: Bad git executab…

在windows下安装配置skywalking

1.下载地址 Downloads | Apache SkyWalkinghttp://skywalking.apache.org/downloads/ 2.文件目录说明 将文件解压后,可看到agent和bin目录: Agent:作为探针,安装在服务器端,进行数据采集和上报。 Config&#xff1a…

[国产MCU]-W801开发实例-用户报文协议(UDP)数据接收和发送

用户报文协议(UDP)数据接收和发送 文章目录 用户报文协议(UDP)数据接收和发送1、UDP简单介绍2、W801的UDP创建逻辑2.1 UDP使用步骤2.2 代码实现1、UDP简单介绍 用户数据报协议 (UDP) 是一种跨互联网使用的通信协议,用于对时间敏感的传输,例如视频播放或 DNS查找。它通过在数…

Leetcode54螺旋矩阵

思路:用set记录走过的地方,记下走的方向,根据方向碰壁变换 class Solution:def spiralOrder(self, matrix: list[list[int]]) -> list[int]:max_rows len(matrix)max_cols len(matrix[0])block_nums max_cols * max_rowscount 1i 0j…

DB-GPT使用

一、源码安装 安装 请按照以下步骤安装DB-GPT 1. Hardware Requirements 如果你的显存不够,DB-GPT支持8-bit和4-bit量化版本 2. Install git clone https://github.com/eosphoros-ai/DB-GPT.git目前使用Sqlite作为默认数据库,因此DB-GPT快速部署不…