目录

1. pdfplumber模块概述

2. pdfplumber模块操作PDF

2.1 加载PDF

2.2 pdfplumber.PDF类

2.3 pdfplumber.Page类

3. 实战操作

3.1 提取单个PDF全部页数

3.2 批量提取多个PDF文件 


1. pdfplumber模块概述

        PDF(Portable Document Format)是一种便携文档格式,便于跨操作系统传播文档。PDF文档遵循标准格式,因此存在很多可以操作PDF文档的工具,Python也不例外。

        pdfplumber 属于Python 第三方库。专注于PDF的内容提取,例如可提取PDF中的文本(位置、字体及颜色等)和形状(矩形、直线、曲线),还有解析表格的功能。

2. pdfplumber模块操作PDF

首先需要下载示例PDF:PDF下载地址

PDF部分截图如下所示:

python 修改 pdf 文字 python pdfplumber_pdfplumber

2.1 加载PDF

函数语法:pdfplumber.open('路径/文件名.pdf', password='test', laparams={'line_overlap':0.7})

参数格式

  • password
  • laparams :要将布局参数设置为 pdfminer.slx 的布局引擎,请传递 laparams 关键字参数

 用法举例:

import pdfplumber

with pdfplumber.open('pdf文件/1.pdf') as pdf:
    print(pdf) #输出:<pdfplumber.pdf.PDF object at 0x00000209D8AC57F0>
    print(type(pdf)) #输出:<class 'pdfplumber.pdf.PDF'>

2.2 pdfplumber.PDF类

        pdfplumber.PDF类 表示单个PDF,并具有两个主要属性。

属性

说明

.metadata

从PDF的info中获取元数据 键/值对 字典。通常包括“CreationDate”,“ModDate”,“Producer”等

.pages

返回一个包含 pdfplumber.Page 实例的列表,每一个实例代表PDF每一页的信息

用法举例 :

import pdfplumber

with pdfplumber.open('pdf文件/1.pdf') as pdf:
    #读取PDF信息
    print(pdf.metadata) #输出:{'Author': 'wangwangyuqing', 'Comments': '', 'Company': '', 'CreationDate': "D:20220330113508+03'35'", 'Creator': 'WPS 文字', 'Keywords': '', 'ModDate': "D:20220330113508+03'35'", 'Producer': '', 'SourceModified': "D:20220330113508+03'35'", 'Subject': '', 'Title': '', 'Trapped': 'False'}
    #输出总页数
    print(len(pdf.pages)) #输出:2

2.3 pdfplumber.Page类

  pdfplumber.Page类 是 pdfplumber 整个的核心,大多数操作都围绕这个类进行操作,它具有以下几个属性:

pdfplumber.Page类 属性

属性

说明

.page_number

顺序页码,第一页为1,第二页为2,依此类推。

.width

页面的宽度

.height

页面的高度

.object/.chars/.lines/.rects/.curves/.figures/.images

这些属性中的每一个都是一个列表,每个列表包含一个字典,用于嵌入页面上的每个此类对象。有关详细信息,请参阅下面的“对象”

pdfplumber.Page类 常用方法

方法名

说明

.extract_text()

用来提取页面中的文本,将页面的所有字符对象整理为字符串

.extract_words()

返回所有的单词及相关信息

.extract_tables()

提取页面的表格

.to_image()

用于可视化调试,返回 Pageimage类 的一个实例

.close()

默认情况下,Page对象缓存其布局和对象信息,以避免重新处理它。但是,在解析大型PDF时,这些缓存的属性可能需要大佬内存。可以使用此方法刷新缓存并释放内存。

用法举例:

import pdfplumber
import xlwt

with pdfplumber.open('pdf文件/1.pdf') as pdf:
    #1.读取第一页的页码、页宽、页高
    first_page = pdf.pages[0] #pdfplumber.Page对象的第一页
    #查看页码
    print('页码:',first_page.page_number) #输出:页码: 1
    #查看页宽
    print('页宽:',first_page.width) #输出:页宽: 595.3
    #查看页高
    print('页高:',first_page.height) #输出:页高: 841.9

    #2.读取文本第一页
    text = first_page.extract_text()
    print(text)
    # 输出:店铺名 价格 销量 地址
    #      小罐茶旗舰店 449 474 安徽
    #      零趣食品旗舰店 6.9 60000 福建
    #      ...
    #      嘉禹沪晓旗舰店 598 1517 上海

    #3.读取表格第一页
    table_1 = first_page.extract_table() #读取表格数据
    #3.1创建Excel表对象
    workbook = xlwt.Workbook(encoding='utf8')
    #3.2新建Sheet表
    worksheet = workbook.add_sheet('Sheet1')
    #3.3自定义列名
    col1 = table_1[0]
    print(col1) #输出:['店铺名', '价格', '销量', '地址']
    #3.4将列属性元组col写进Sheet表单中第一行
    for i in range(len(col1)):
        worksheet.write(0,i,col1[i])
    #3.5将数据写入Sheet表单中
    for i in range(len(table_1[1:])):
        data = table_1[1:][i]
        for j in range(len(col1)):
            worksheet.write(i+1, j, data[j])
    #3.6保存文件
    workbook.save('1.xls')

最终生成了一个Excel文件,部分内容如下图所示:

python 修改 pdf 文字 python pdfplumber_数据分析_02

3. 实战操作

3.1 提取单个PDF全部页数

import pdfplumber
import xlwt

with pdfplumber.open('pdf文件/1.pdf') as pdf:
    #1.把所有页的数据存在一个临时列表中
    item = []
    for page in pdf.pages:
        text = page.extract_table()
        for i in text:
            item.append(i)
    #2.创建Excel表对象
    workbook = xlwt.Workbook(encoding='utf8')
    #3.新建Sheet表
    worksheet = workbook.add_sheet('Sheet1')
    #4.自定义列名
    col1 = item[0]
    print(col1) #输出:['店铺名', '价格', '销量', '地址']
    #5.将列属性元组col写进Sheet表单中第一行
    for i in range(len(col1)):
        worksheet.write(0,i,col1[i])
    #6.将数据写入Sheet表单中
    for i in range(len(item[1:])):
        data = item[1:][i]
        for j in range(len(col1)):
            worksheet.write(i+1, j, data[j])
    #7.保存文件
    workbook.save('2.xls')

运行结果:

python 修改 pdf 文字 python pdfplumber_python_03

3.2 批量提取多个PDF文件 

下载的文件夹中有多个PDF文件,所以进行批量提取,并保存到一个Excel文件中。注意:以下代码中的路径填写自己当前电脑的文件路径。

import pdfplumber
import xlwt
import os

#1.获取文件夹下所有的PDF文件路径
file_dir = r'D:\python程序\pdf文件'
file_list = []
for files in os.walk(file_dir):
    print(files) #输出:('D:\\python程序\\pdf文件', [], ['1.pdf', '1的副本.pdf', '1的副本10.pdf', '1的副本11.pdf', '1的副本2.pdf', '1的副本3.pdf', '1的副本4.pdf', '1的副本5.pdf', '1的副本6.pdf', '1的副本7.pdf', '1的副本8.pdf', '1的副本9.pdf'])
    for file in files[2]:
        #以“.”进行分割,如果后缀为PDF或pdf就拼接地址存入file_list
        if file.split('.')[1] == 'pdf' or file.split('.')[1]=='PDF':
            file_list.append(file_dir+'\\'+file)
#2.存入Excel
#2.1把所有PDF文件的所有页的数据存在一个临时列表中
item = []
for file_path in file_list:
    with pdfplumber.open(file_path) as pdf:
        for page in pdf.pages:
            text = page.extract_table()
            for i in text:
                item.append(i)
#2.2创建Excel表对象
workbook = xlwt.Workbook(encoding='utf8')
#2.3新建Sheet表
worksheet = workbook.add_sheet('Sheet1')
#2.4自定义列名
col1 = item[0]
print(col1) #输出:['店铺名', '价格', '销量', '地址']
#2.5将列属性元组col写进Sheet表单中第一行
for i in range(len(col1)):
    worksheet.write(0,i,col1[i])
#2.6将数据写入Sheet表单中
for i in range(len(item[1:])):
    data = item[1:][i]
    for j in range(len(col1)):
        worksheet.write(i+1, j, data[j])
#2.7保存文件
workbook.save('3.xls')

运行结果:

python 修改 pdf 文字 python pdfplumber_pdfplumber_04