SuPG 发表于 2022-8-2 10:16

【自学笔记】Python 利用pdfplumber批量将PDF转EXCEL

本帖最后由 SuPG 于 2022-8-23 09:20 编辑

自学python,用于办公,由于有大量的可编辑型PDF需要转成EXCEL,因此写了下面这一段!
新手写,请多多包涵:lol


import pdfplumber
import os,time
from openpyxl import Workbook


## 第一步
### 提取文件夹中所有文件的路径
def listdir(path,list_name):
    for file in os.listdir(path):
      file_path = os.path.join(path,file)#获取该文件夹下所有文件的路径
      if os.path.isdir(file_path):#判断是否为文件夹,若是则继续判断该文件夹内是否还含有文件夹,该循环会将全部文件夹都纳入判断范围
            listdir(file_path,list_name)
      else:
            list_name.append(file_path)#将文件的路径都添加到list中


## 第二步
### 方法1 识别文件夹下全部PDF,识别内容分别保存到多个工作簿中,保存名称为该PDF的名称。(一个PDF文件对应一个工作簿)
def SplitToWorkbook(pdflist_name):
    for pdflistname in pdflist_name:
      pdf = pdfplumber.open(pdflistname)#打开文件
      workbook = Workbook()#启动excel
      sheet = workbook.active
      for i in range(len(pdf.pages)):#判断页码
            firstpagepdf = pdf.pages
            table = firstpagepdf.extract_table()#识别表格
            try:
                for row in table:
                  sheet.append(row)
            except:
                pass
      if sheet.max_row == 1:
            pass
      else:
            Dirpath = 'A' + str(sheet.max_row + 1)# sheet.max_row的意思是获取最大使用行数
            sheet = pdflistname# 添加路径
            workbook.save(filename=(pdflistname.split('.') + '.xlsx'))


### 方法2 识别文件夹下全部PDF文件,识别内容拆分保存到同一个工作簿的不同工作表(sheet)内。(将参与识别的PDF文件保存成同一工作簿里面的多个独立工作表)
def SplitToSheet(pdflist_name,dirpath):
    workbook = Workbook()
    sheet = workbook.active #唤醒表格
    for i in range(len(pdflist_name)): #获取文件数,用于后续迭代
      pdf = pdfplumber.open(pdflist_name)
      if i == 0:
            sheet.title = pdflist_name.split('\\')[-1]
            for page in range(len(pdf.pages)): #获取PDF总页数
                firstpagepdf = pdf.pages
                table = firstpagepdf.extract_table()
                try:
                  for row in table:
                        sheet.append(row)
                except:
                  pass
            if sheet.max_row == 1:
                workbook.remove(sheet)#删除空表格
            else:
                Dirpath = 'A' + str(sheet.max_row+ 1) # sheet.max_row的意思是获取最大使用行数
                sheet = pdflist_name # 将该文件的地址保存到最后一行
      else:
            sheet = workbook.create_sheet(title=pdflist_name.split('\\')[-1]) #创建新表
            for page in range(len(pdf.pages)):
                firstpagepdf = pdf.pages
                table = firstpagepdf.extract_table()
                try:
                  for row in table:
                        sheet.append(row)
                except:
                  pass
            if sheet.max_row == 1:
                workbook.remove(sheet)#删除空表格
            else:
                Dirpath = 'A' + str(sheet.max_row + 1)# sheet.max_row的意思是获取最大使用行数
                sheet = pdflist_name# 将该文件的地址保存到最后一行
      workbook.save(filename=dirpath + '\SplitToSheet.xlsx') #保存地址



### 方法3 识别文件夹下全部PDF文件,识别内容均保存到同一个工作表(sheet)中。(将参与识别的PDF文件保存到同一工作簿及同一个工作表中)
def SplitToOneSheet(pdflist_name, dirpath):
    workbook = Workbook()
    sheet = workbook.active
    arow = 'A' + str(sheet.max_row) # max_row指该文档中已使用的行,从1开始
    bcolumn = 1
    for pdflistname in pdflist_name:
      pdf = pdfplumber.open(pdflistname)
      sheet = pdflistname
      for i in range(len(pdf.pages)):
            firstpagepdf = pdf.pages
            table = firstpagepdf.extract_table()
            try:
                # for row in table:
                #   sheet.append(row)
                for a,row in enumerate(table,start=bcolumn):
                  for b , value in enumerate(row,start=1):
                        sheet.cell(row=a,column=b).value = value
            except:
                pass
            arow = 'A' + str(sheet.max_row + 1)
            bcolumn = int(sheet.max_row) + 1
    workbook.save(filename=dirpath + '\SplitToOneSheet.xlsx') #保存地址

if __name__=='__main__':
    dirpath = r'C:\Users\JiaJun\Desktop\新建文件夹' # 需要识别的文件夹地址
    list_name = [] # 用于保存文件路径
    pdflist_name = [] # 用于保存文件路径
    listdir(dirpath, list_name)   #添加文件路径
    for i in range(len(list_name)):
      # if list_name.split('.')[-1] =='pdf' and time.localtime(os.path.getmtime(list_name)) == 2022 and time.localtime(os.path.getmtime(list_name)) == 6:
      if list_name[-3:] == 'pdf': # 判断是否是pdf文件,是则会添加到pdflist中
            pdflist_name.append(list_name)
    print('该文件夹下的文件有:',list_name)
    print('需要做PDF文件识别的有:', pdflist_name)

    # 下面三个方法可供选择
    # SplitToWorkbook(pdflist_name)             #(一个PDF文件对应一个工作簿)
    # SplitToSheet(pdflist_name,dirpath)      #(将参与识别的PDF文件保存成同一工作簿里面的多个独立工作表)
    # SplitToOneSheet(pdflist_name,dirpath)   #(将参与识别的PDF文件保存到同一工作簿及同一个工作表中)
    print('文件识别完毕!')

yuyue11 发表于 2022-8-6 14:03

啊啊啊啊有没有不用Python的 傻瓜工具
页: [1]
查看完整版本: 【自学笔记】Python 利用pdfplumber批量将PDF转EXCEL