在Python中如何优雅地处理PDF文件

2023-11-14

1. 引言

PDF文档是我们在日常工作中经常会遇到的文件格式,有时我们需要编辑并从中提取一些有用的数据。在本文中,我将向大家介绍如何使用Python中的PDF库从PDF文档中提取文本、表格和图像以及其他类型的数据。
闲话少说,我们直接开始吧!

2. 从PDF文件中获取文本

在Python中有多种库可以帮助我们方便的从PDF文件中获取对应的文本,其中最为常用的是PyPdf2,我们不妨来举个栗子来看看相应的函数的使用方法。

样例代码如下:

# importing module
import PyPDF2
 
# create a pdf file object
pdfFileObj = open('file.pdf', 'rb')
 
# create a pdf reader object
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
 
# creating a page object
pageObj = pdfReader.getPage(0)
 
# extracte text from page
print(pageObj.extractText())
 
# closing the pdf file object
pdfFileObj.close()

在上述代码中,我们逐行来分析:

  • 首先我们导入我们的第三方库PyPDF2
  • 接着我们使用函数open()以二进制方式读入我们的PDF文件
  • 将读入的文件对象传递给PdfFileReader函数
  • 获取PDF某个页面的对象,生成pageObj
  • 使用函数extractText()来提取文本信息
  • 最后我们使用close函数来将PdfFileObj关闭

最终,关闭文件是必须的。如果我们让它保持打开状态,并试图读取另一个文件,此时它会给我们提示一个文件读取的错误。
上述代码展示了提取单个页面的逻辑,进而我们可以使用循环语句来读取所有的页面,样例代码如下:

# importing module
import PyPDF2
 
# create a pdf file object
pdfFileObj = open('file.pdf', 'rb')
 
# create a pdf reader object
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
 
for i in range(pdfReader.numPages):
    pageObj = pdfReader.getPage(i)
    print(pageObj.extractText())
 
# closing the pdf file object
pdfFileObj.close()

举例,假设我们需要的PDF文件如下:

在这里插入图片描述

则上述代码的运行结果如下:

A Simple PDF File  This is a small demonstration .pdf file -  
just for use in the Virtual Mechanics tutorials. More text. And more  
text. And more text. And more text. And more text.  
And more text. And more text. And more text. And more text. And more  
text. And more text. Boring, zzzzz. And more text. And more text. And  
more text. And more text. And more text. And more text. And more text.  
And more text. And more text.  
And more text. And more text. And more text. And more text. And more  
text. And more text. And more text. Even more. Continued on page 2 ...

3. 从PDF文件中获取表格

使用PyPDF2提取表不太方便,为了正确地从PDF文件中提取表格,我们需要采用计算机视觉的方法首先检测这些表格,然后进行机器学习计算,最后在将其提取出来。

为了完成这项任务,这里推荐一个第三方python模块,叫做Tabula,该模块专门用于从pdf中读取和提取表格,并以CSV格式存储。

样例代码如下:

import tabula

# Read pdf into list of DataFrame
df = tabula.read_pdf("test.pdf", pages='all')
print(df)

上述代码的解析如下:

  • 首先我们引入我们所需的第三方库tabula
  • 接着我们使用函数read_pdf来读取pdf文件,并提取所有页面中的表格
  • 最后我们使用打印函数将提取到的表格进行打印

当然,我们也可以将提取得到的数据以csv的方式进行存储,样例代码如下:

import tabula

# convert PDF into CSV file
tabula.convert_into("test.pdf", "output.csv", output_format="csv", pages='all')

4. 从PDF文件中获取图片

在Python中为了从PDF文件中提取图像,我们必须使用其他第三方模块。

安装我们所需的第三方库PyMuPDF以及图像处理库Pillow,安装代码如下:

pip install PyMuPDF Pillow

从PDF文件中提取图片的示例代码如下:

import fitz
import io
from PIL import Image

pdf_file = fitz.open("test2.pdf")
# iterate over PDF pages

for page_index in range(len(pdf_file)):
    # get the page itself
    page = pdf_file[page_index]
    image_list = page.getImageList()

    for image_index, img in enumerate(page.getImageList(), start=1):
        # get the XREF of the image
        xref = img[0]
        
        # extract the image bytes
        base_image = pdf_file.extractImage(xref)
        image_bytes = base_image["image"]
        
        # get the image extension
        image_ext = base_image["ext"]
        
        # load it to PIL
        image = Image.open(io.BytesIO(image_bytes))
        
        # save it
        image.save(open(f"image{page_index+1}_{image_index}.{image_ext}", "wb"))

假设我们的PDF文件内容如下:
在这里插入图片描述

我们测试上述代码,得到结果如下:

在这里插入图片描述

5. 总结

本文重点介绍了在Python中如何利用功能强大的第三方库来从PDF文件中获取文本表格和图像数据,并给出了相应的代码示例!

您学废了吗?

在这里插入图片描述
关注公众号《AI算法之道》,获取更多AI算法资讯。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Python中如何优雅地处理PDF文件 的相关文章

随机推荐

  • 剑指Offer第十九题:顺时针打印矩阵

    题目描述 输入一个矩阵 按照从外向里以顺时针的顺序依次打印出每一个数字 例如 如果输入如下4 X 4矩阵 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1 2 3 4 8 12 16 15 1
  • 微信JSSDK动态引入

    由于项目中使用到了微信和企业微信的js方法 所以引入了微信jsSDK1 2 0版本的文件 但是后期需要使用微信开放标签 所以微信端的js文件版本需要升级到1 6 0 但是企业微信目前最高支持1 2 0版本 所以添加了如下方法 在vue项目的
  • JS继承

    最近在面试中被问到js的继承 当时回答的不太好 所以今天特别总结一下 我们先来看一个基于原型链的继承例子 父类 function Person 子类 function Student 继承 Student prototype new Per
  • Github上关于iOS的各种开源项目集合(强烈建议大家收藏,查看,总有一款你需要)

    转载地址 http blog csdn net hbblzjy article details 52083919 下拉刷新 EGOTableViewPullRefresh 最早的下拉刷新控件 SVPullToRefresh 下拉刷新控件 M
  • 分数混合运算简便方法_《分数乘法》中的简便运算指导

    六年级上册 分数乘法 是在学生学习了运用乘法运算定律和整数 小数乘法简便计算以及分数加 减 乘法计算的基础上进行教学的 这一节课学生进一步理解整数乘法的运算定律不仅适用于小数 整数乘法 而且也适用于分数乘法 使计算更简便 是让学生在经历探索
  • java.lang.NoClassDefFoundError: org/springframework/context/event/EventListenerFactory

    集成rabbitmq的时候报错 只要看到NoClassDefFoundError基本都是jira包冲突了 1 首先找到相关类 spring tx有2个版本 2 利用IDEAL插件mavenhelper看一下 把高版本排除掉就可以了 java
  • 统计学习系列之参数估计

    参数估计 1 什么是参数估计 简单来说是 参数估计是指使用样本统计量估计总体的参数的 百度百科的解释如下 参数估计 parameter estimation 统计推断的一种 根据从总体中抽取的随机样本来估计总体分布中未知参数的过程 从估计形
  • 使用cmake配置aws-cpp-sdk以及在cmake项目中使用

    目录 环境 配置cmake 编译aws cpp sdk 1 使用git bash下载aws cpp sdk项目到指定目录 2 使用clion打开项目 3 设置cmake编译选项 4 BUILD INSTALL 项目 在cmake项目中使用a
  • 【服务器】ASUS ESC4000-E11 安装系统

    ASUS ESC4000 E11说明书 没找到 ASUS ESC4000 E11的说明书 下面是ESC4000A E11的说明书 https manualzz com doc 65032674 asus esc4000a e11 serve
  • E: 仓库 “http://mirrors.aliyun.com/ubuntu eoan Release” 没有 Release 文件 —— 解决方案

    Ubuntu 20 04 更新的时候 遇到如下问题 可以通过修改源 来进行修复 1 登录如下网址 LUG s repo file generator 2 选择对应的 Ubuntu 版本 这里我是 Ubuntu 20 04 点击 Downlo
  • vue实现excel文件上传并解析数据

    vue实现excel文件上传并解析数据 1 安装xlsx并引入 2 页面使用上传组件 3 补充完善 不使用action实现自定义上传 1 安装xlsx并引入 npm install xlsx 0 17 0 save import XLSX
  • 如何将已加好的脚注或尾注转换成中括号“[]”格式

    下面让流程更加清晰 1 正常插入所有尾注 2 点击word文档上方 编辑 选项按钮 3 点击 查找 4 点击 替换 选项 5 在 查找内容 框中输入 e 这是尾注的象征符 在 替换为 框中输入 6 点击下方的 全部替换
  • 9.调试技巧与调试工具

    9
  • Unix网络编程5种IO模型

    IO模型 用一幅图表示所支持的I O模型 纵向维度是 阻塞 Blocking 非阻塞 Non blocking 横向维度是 同步 异步 总结起来是四种模型 同步阻塞 同步非阻塞 异步阻塞 异步非阻塞 Unix网络编程 中划分出了 第五种 模
  • mysql数据库入门教程

    Markdown database notebook Markdown database notebook 1 1 Mysql知识 基础 1 1 1 Msyql的基本知识 1 2 Mysql知识 深入 1 2 1 Mysql的储存引擎 1
  • DIV与Table布局在大型网站的可用性比较

    DIV与TABLE本身并不存在什么优缺点 所谓web标准只是推荐的是正确的使用标签 好比说 DIV用于布局 而TABLE则本来就是转二维数据的 让TABLE做该做的事 并不是说页面里不出现TABLE就是多么多么牛 用DIV进行排版的优势就是
  • jQuery-migrate 插件---各类版本下载

    步骤 1 CDN jquery migrate 2 找到所需版本打开 3 全选复制到自己创建的记事本 4 复制 5 粘贴到IntelliJ IDEA 模块下的 webapp js 没有自己手动创建目录 jquery migrate 1 4
  • Oracal的Lpad函数

    lpad函数是Oracle数据库函数 lpad函数从左边对字符串使用指定的字符进行填充 从其字面意思也可以理解 l是left的简写 pad是填充的意思 所以lpad就是从左边填充的意思 语法格式如下 lpad string padded l
  • unity笔记-20161109

    1 Animator CullingMode 动画器剔除模式 AlwaysAnimate Always animate the entire character Object is animated even when offscreen
  • 在Python中如何优雅地处理PDF文件

    1 引言 PDF文档是我们在日常工作中经常会遇到的文件格式 有时我们需要编辑并从中提取一些有用的数据 在本文中 我将向大家介绍如何使用Python中的PDF库从PDF文档中提取文本 表格和图像以及其他类型的数据 闲话少说 我们直接开始吧 2