鱼C论坛

 找回密码
 立即注册
查看: 4502|回复: 2

如何从pdf中提取表格(图片型pdf)

[复制链接]
发表于 2022-12-21 10:29:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. def getFile(url,name):
  2.     print("提取pdf")
  3.     file_name = name
  4.     u = urllib.request.urlopen(url)
  5.     block_sz = 8192
  6.     with open("D:\\report\"+file_name, 'wb') as f:
  7.         while True:
  8.             buffer = u.read(block_sz)
  9.             if buffer:
  10.                 f.write(buffer)
  11.             else:
  12.                 break
  13.     print("Sucessful to download" + " " + file_name)
复制代码


无法提取,请教一下有没有其他可行的方法

中信建投2022-12-21.pdf

1.17 MB, 下载次数: 8

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-12-21 14:13:56 | 显示全部楼层
本帖最后由 Mike_python小 于 2022-12-22 10:13 编辑
  1. import pdfplumber
  2. import pandas as pd

  3. def read_pdf(read_path, save_path):
  4.     pdf_2020 = pdfplumber.open(read_path)
  5.     result_df = pd.DataFrame()
  6.     for page in pdf_2020.pages:
  7.         table = page.extract_table()
  8.         print(table)
  9.         df_detail = pd.DataFrame(table[1:], columns=table[0])
  10.         result_df = pd.concat([df_detail, result_df], ignore_index=True)
  11.     result_df.dropna(axis=1, how='all', inplace=True)
  12.     result_df.columns = ['奖项', '作品编号', '作品名称', '参赛学校', '作者', '指导老师']
  13.     result_df.to_excel(excel_writer=save_path, index=False, encoding='utf-8')

  14. read_path = r'2020年中国大学生计算机设计大赛参赛作品获奖名单.pdf'
  15. save_path = r'2020年中国大学生计算机设计大赛参赛作品获奖名单.xlsx'
  16. read_pdf(read_path, save_path)
复制代码


https://blog.csdn.net/m0_59236127/article/details/122712637这个链接可能会帮到你

如果这个回答对你有帮助,请设置“最佳答案”!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-21 15:00:54 | 显示全部楼层
本帖最后由 编程追风梦 于 2022-12-21 15:02 编辑

这里使用camelot提取数据
  1. import camelot
  2. tables = camelot.read_pdf(pdf_filepath, pages='1-end')
  3. for item in tables:
  4.     df = item.df
  5.     # item.to_csv('test.csv')
  6.     # item.to_excel('test.xlsx')
复制代码

  • pages使用’1-end’就可以读取pdf文件所有页
  • 这里将每个表格数据转换为pandas DataFrame(df)
  • 也可以直接导出CSV,Excel文件:to_csv,to_excel
但现实中我们的需求往往更复杂

实例需求:多个pdf文件,每个pdf可能有多页,要求提取指定列的所有数据,并去重,最终导出excel文件

  1. import camelot
  2. import glob
  3. import openpyxl

  4. # 导出excel文件
  5. def write_excel_xlsx(path, sheet_name, value):
  6.     index = len(value)
  7.     workbook = openpyxl.Workbook()
  8.     sheet = workbook.active
  9.     sheet.title = sheet_name

  10.     for i in range(0, index):
  11.         sheet.cell(row=i+1, column=1, value=str(value[i]))

  12.     workbook.save(path)
  13.     print("xlsx格式表格写入数据成功!")

  14. directory = './*.pdf'
  15. files = [filename for filename in glob.glob(directory)]

  16. result = []

  17. for pdf_filepath in files:
  18.     print(pdf_filepath)
  19.     tables = camelot.read_pdf(pdf_filepath, pages='1-end')
  20.     for item in tables:
  21.         df = item.df
  22.         try:
  23.             # 这里取第6列数据
  24.             itemData = df[5].to_list()
  25.             result = result + itemData
  26.             print(itemData)
  27.         except Exception:
  28.             print('异常')
  29. # 过滤空白和标题数据
  30. result = [x for x in result if x != '' and x != '标题名']
  31. # 去重
  32. result = list(set(result))
  33. write_excel_xlsx('./result.xlsx', 'sheet1', result)
复制代码

  • 使用glob遍历文件夹下所有pdf文件,批量处理
  • 使用camelot提取表格数据为pandas DataFrame
  • 取第6列数据,并过滤掉空白数据和标题数据,同时过滤重复数据
  • 使用openpyxl导出第6列数据到excel文件

转载原文:https://codeantenna.com/a/sIZGHFRXvF
                  https://blog.csdn.net/m0_59236127/article/details/122712637

如果文章帮助到你的话,给我个最佳答案吧,我缺最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-25 13:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表