在現今電腦化(或稱無紙化)的辦公環境中,往往因為工作需求需將一些資料在不同辦公文件之間轉移,如若需要呈現簡報(.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檔案。
(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.輸出結果如下圖。
-----如果文章對您有幫助,打開微信掃一掃,請作者喝杯咖啡。-----
沒有留言:
張貼留言