• 21天学习挑战赛——Python pdfplumber读取PDF写入Excel


    目录

    1. pdfplumber模块概述

    2. pdfplumber模块操作PDF

    2.1 加载PDF

    2.2 pdfplumber.PDF类

    2.3 pdfplumber.Page类

    3. 实战操作

    3.1 提取单个PDF全部页数

    3.2 批量提取多个PDF文件 


    就是不想让自己留遗憾,继续加油。🌈

    活动地址:CSDN21天学习挑战赛

    1. pdfplumber模块概述

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

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

    2. pdfplumber模块操作PDF

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

    PDF部分截图如下所示:

    2.1 加载PDF

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

    参数格式

    • password :要加载受密码保护的PDF,请传递 password 关键字参数
    • laparams :要将布局参数设置为 pdfminer.slx 的布局引擎,请传递 laparams 关键字参数

     用法举例:

    1. import pdfplumber
    2. with pdfplumber.open('pdf文件/1.pdf') as pdf:
    3. print(pdf) #输出:
    4. print(type(pdf)) #输出:

    2.2 pdfplumber.PDF类

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

    属性说明
    .metadata从PDF的info中获取元数据 键/值对 字典。通常包括“CreationDate”,“ModDate”,“Producer”等
    .pages返回一个包含 pdfplumber.Page 实例的列表,每一个实例代表PDF每一页的信息

    用法举例 :

    1. import pdfplumber
    2. with pdfplumber.open('pdf文件/1.pdf') as pdf:
    3. #读取PDF信息
    4. 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'}
    5. #输出总页数
    6. 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时,这些缓存的属性可能需要大佬内存。可以使用此方法刷新缓存并释放内存。

    用法举例:

    1. import pdfplumber
    2. import xlwt
    3. with pdfplumber.open('pdf文件/1.pdf') as pdf:
    4. #1.读取第一页的页码、页宽、页高
    5. first_page = pdf.pages[0] #pdfplumber.Page对象的第一页
    6. #查看页码
    7. print('页码:',first_page.page_number) #输出:页码: 1
    8. #查看页宽
    9. print('页宽:',first_page.width) #输出:页宽: 595.3
    10. #查看页高
    11. print('页高:',first_page.height) #输出:页高: 841.9
    12. #2.读取文本第一页
    13. text = first_page.extract_text()
    14. print(text)
    15. # 输出:店铺名 价格 销量 地址
    16. # 小罐茶旗舰店 449 474 安徽
    17. # 零趣食品旗舰店 6.9 60000 福建
    18. # ...
    19. # 嘉禹沪晓旗舰店 598 1517 上海
    20. #3.读取表格第一页
    21. table_1 = first_page.extract_table() #读取表格数据
    22. #3.1创建Excel表对象
    23. workbook = xlwt.Workbook(encoding='utf8')
    24. #3.2新建Sheet表
    25. worksheet = workbook.add_sheet('Sheet1')
    26. #3.3自定义列名
    27. col1 = table_1[0]
    28. print(col1) #输出:['店铺名', '价格', '销量', '地址']
    29. #3.4将列属性元组col写进Sheet表单中第一行
    30. for i in range(len(col1)):
    31. worksheet.write(0,i,col1[i])
    32. #3.5将数据写入Sheet表单中
    33. for i in range(len(table_1[1:])):
    34. data = table_1[1:][i]
    35. for j in range(len(col1)):
    36. worksheet.write(i+1, j, data[j])
    37. #3.6保存文件
    38. workbook.save('1.xls')

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

    3. 实战操作

    3.1 提取单个PDF全部页数

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

    运行结果:

    3.2 批量提取多个PDF文件 

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

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

    运行结果:

  • 相关阅读:
    海康威视嵌入式软件一面(技术面)
    C/C++自动 21 级(含卓越 211)《软件技术基础》期末大作业
    分不清bind、apply、call?手写实现一下就明白了
    高并发、多线程、分布式都不懂,你拿什么跳槽阿里、腾讯、京东?还不好好学习啊
    设计模式之桥接模式
    第四章:控制结构
    Vue2中10种组件通信方式和实践技巧
    开源 github flow的版本发布
    BCT(block change tracking)引起的异机恢复问题
    Shell 脚本学习笔记
  • 原文地址:https://blog.csdn.net/m0_52162042/article/details/126293838