2023年1月7日 星期六

[Python]如何將批量的PDF資料匯總為Excel清單?

 在現今電腦化(或稱無紙化)的辦公環境中,往往因為工作需求需將一些資料在不同辦公文件之間轉移,如若需要呈現簡報(.ppt),可能需將word的部分文字複製到ppt上;若需要分析論文中的表格數據,可能需將pdf轉換成excel。然而,若僅僅是少數文件的轉換,或許可簡單用複製和貼上的功能來處理,但若是批量轉換的工作,為了避免重複性勞力和容易出錯,藉由工具來進行批量轉換才是正確的工作方式。

想像一個情境,當企業辦理講座活動,對各個應邀單位發出報名表,當多張報名表回收時,即需要一個匯總清單,以進一步了解此次參與講座的學員背景/企業寶號/職稱等等。下列是以該情境作為範例,在範例進行之前,先簡易描述完成該項工作的工具結構,如下。


1.在Python中,常用於處理PDF的安裝包有兩個,pdfminer3k和pdfplumber,差異簡易描述如下:
   pdfminer3k:將PDF作純文本轉換工作,常用於自然語言分析工作上。
   pdfplumber:可按頁數處理PDF檔案,同時可將PDF中的表格輸出成list。

2.另外,針對PDF讀取結果,Python需要將結果寫入excel檔案中,可藉由操作excel的安裝包, openpyxl,來處理。

3.為了搭配自動找尋pdf檔案的數量,需要借用安裝包,os,來操作文件和目錄系統。
批量轉換報名表(.pdf),並匯總成excel檔案的簡易範例如下:

    a.報名表的原pdf截圖如下,共有三個pdf檔案。


    
    b.幾個主要的代碼段,說明如下:

 (i)為了因應檔案個數未知且達成批量轉換,因此借用os指令在資料夾中篩選出目標檔案(.pdf),如# find .pdf file in the folder的代碼段。

 (ii)將pdf匯入python中,並將每個pdf檔案中的姓名/職稱/手機/email資料抽取和轉換成list,如# pdf import的代碼段。

 (iii)將抽取資料存入excel檔案中,其中包含定義sheet和表頭名稱,如# 開啟空白excel, 並存入pdf讀取表格資料的代碼段。

===================代碼段===============
import pdfplumber
from openpyxl import Workbook  # 存取xlsx的安裝包
import os
 
# list files in the path
file_list = os.listdir()
 
# find .pdf file in the folder
pdf_file = list()  # build empty list
for file_name in file_list:
    sub_name = file_name.split('.')[1]
    if sub_name == 'pdf':
        pdf_file.append(file_name)
 
# pdf import
pdf_table = list()
name = list()
title = list()
mobile = list()
email = list()
for i in range(len(pdf_file)):
    pdf = pdfplumber.open(pdf_file[i])
    page = pdf.pages[0]  # get page.1
    pdf_table.append(page.extract_table())
    if pdf_table[i][2][1] != '':
        name.append(pdf_table[i][2][1])
        title.append(pdf_table[i][3][1])
        mobile.append(pdf_table[i][4][1])
        email.append(pdf_table[i][5][1])
 
# 開啟空白excel, 並存入pdf讀取表格資料
workbook = Workbook()
sheet = workbook.active
sheet.title = "報名匯總"
# 設定A1:姓名 B1:職務 C1:手機 D1:E-mail
row0 = ["姓名", "職務", "手機", "E-mail"]
sheet.append(row0)
for i in range(len(name)):
    sheet.cell(row=2 + i, column=1).value = name[i]
    sheet.cell(row=2 + i, column=2).value = title[i]
    sheet.cell(row=2 + i, column=3).value = mobile[i]
    sheet.cell(row=2 + i, column=4).value = email[i]
workbook.save(filename="報名清單.xlsx")

===================代碼段===============

c.輸出結果如下圖。








-----如果文章對您有幫助,打開微信掃一掃,請作者喝杯咖啡。-----



沒有留言:

張貼留言