别再问如何用Python提取PDF内容了!
导读
大家好,在之前的办公自动化系列文章中我们已经详细介绍了?如何使用Python批量处理PDF文件,包括合并、拆分、水印、加密等操作。
今天我们再次回到PDF,详细讲解如何使用Python从PDF提取指定的信息
。我们将以一份年度报告PDF为例进行介绍,内含大量文字、表格、图片
,具体如下
模块安装
首先需要安装两个模块,第一个是pdfplumber
,在命令行使用pip安装即可?
pip install pdfplumber
第二个是fitz
, 它是pymupdf
中的一个模块,同样可以使用pip轻松安装
pip install pymupdf
文字信息提取
使用Python提取PDF中文字代码思路如下
- 利用
pdfplumber
打开一个 PDF 文件 - 获取指定的页,或者遍历每一页
- 利用
.extract_text()
方法提取当前页的文字
现在让我们用上述代码尝试提取示例数据中第12页的文字?
import pdfplumber
file_path = r'C:xxxxpractice.PDF'
with pdfplumber.open(file_path) as pdf:
page = pdf.pages[11]
print(page.extract_text())
结果如下图所示
接着可以将内容通过导入python-docx
并借助wordfile.add_paragraph()
写入Word文件中,而这个模块我们已经讲解很多次,此处就不再赘述。
表格信息提取
使用Python提取单个表格和提取单页文字的代码非常类似,用的是.extract_table()
但需要注意的是.extract_table()
默认提取指定页面的第一个表格,如果当前页面有多个表格都需要提取,则要直接使用.extract_tables()
例如示例文件中第 13 页有 2 个表格,我们分别利用.extract_table()
和.extract_tables()
观察输出结果
import pdfplumber
file_path = r'C:xxxxpractice.PDF'
with pdfplumber.open(file_path) as pdf:
page = pdf.pages[12]
print(page.extract_table())
结果如下
可以看到是一个嵌套列表,熟悉这种格式的人会理解想到可以pandas
或者遍历该嵌套列表后借助openpyxl
的sheet.append(list)
写入Excel文件中,
import pdfplumber
file_path = r'C:xxxxpractice.PDF'
with pdfplumber.open(file_path) as pdf:
page = pdf.pages[12]
print(page.extract_tables())
而.extract_tables()
提取当前页所有表格会产生了一个三级嵌套列表,第一层的列表就代表每一个表格,之后也可以利用其他库写入Excel。
图片提取
对于图片提取,现在没有任何一个模块可以做到百分之百的提取。本文只介绍基于fitz
模块的代码,基本思路是通过正则查找图片并将其输出
例如提取示例文件中的图片,代码可以这么写?
import fitz
import re
import os
file_path = r'C:xxxpractice.PDF'
dir_path = r'C:xxx' # 存放图片的文件夹
def pdf2pic(path, pic_path):
checkXO = r"/Type(?= */XObject)"
checkIM = r"/Subtype(?= */Image)"
pdf = fitz.open(path)
lenXREF = pdf._getXrefLength()
imgcount = 0
for i in range(1, lenXREF):
text = pdf._getXrefString(i)
isXObject = re.search(checkXO, text)
isImage = re.search(checkIM, text)
if not isXObject or not isImage:
continue
imgcount += 1
pix = fitz.Pixmap(pdf, i)
new_name = f"img_{imgcount}.png"
if pix.n < 5:
pix.writePNG(os.path.join(pic_path, new_name))
else:
pix0 = fitz.Pixmap(fitz.csRGB, pix)
pix0.writePNG(os.path.join(pic_path, new_name))
pix0 = None
pix = None
pdf2pic(file_path, dir_path)
结果如下
可以看到成功提取了图片,但PDF中的图片远不止这些,如果你有其他思路或者方法可以在留言区与我交流。
写在最后
最后要说明的是,在上一篇文章及本文中我们剖析了每一行代码。但针对PDF的模块较多,且有些模块功能并不完善,代码也没有类似OFFICE三件套操作那般简洁,因此更多时候以理解为主,不需要完全掌握写,会用会改即可!
当然还是希望大家能够理解Python办公自动化的一个核心就是批量操作-解放双手,并且能与日常办公结合让复杂的工作自动化!
-END-
本文为公众号早起Python专栏作者陈熹原创,转载请后台联系,未经授权的任何形式转载均视为侵权!
- maven编译时出现There are test failures
- SpringCloud Eureka自我保护机制
- cordova插件-File Transfer
- 什么是Kotlin?Java终结者?
- cordova插件-Device Motion
- cordova插件-Device Orientation
- cordova插件-Dialogs
- SpringCloud动态刷新配置信息
- cordova插件-Device
- hadoop源码解析2 - conf包中Configuration.java解析
- junit入门实例
- cordova插件- Network Information
- SpringCloud配置中心客户端读取配置
- cordova插件- Inappbrowser
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- linux允许端口远程访问开放端口的方法
- linux操作系统利用python实现任务管理器可视化功能
- Linux下安装PHP curl扩展的方法详解
- 各种OOM代码样例及解决方法
- Linux 中不输入密码运行 sudo 命令的方法
- Linux 查看远程服务器文件状态的方法
- 安装ubuntu时黑屏的解决办法(3种)
- linux输入yum后提示: -bash: /usr/bin/yum: No such file or directory的解决方法
- 分布式锁,三种实现方式,性能对比分析!
- Linux 中锁定和解锁用户帐户的三种方法
- centos8 安装 nginx的详细教程(图文)
- Ubuntu系统日志配置 /var/log/messages的方法
- 在Ubuntu 14 上安装 Nginx-RTMP 流媒体服务器的教程
- centos8自定义目录安装nginx(教程详解)
- VMware下Centos7桥接方式网络配置步骤详解