top of page
Search
Learn with Shin

如何利用Python處理PDF



今天要跟大家一起看一下工作或生活中都常常會接觸到的 -- PDF檔案。


PDF(全名Portable Document Format)的檔案中除了文字以外,可以有圖片,表格,甚至是動畫 -- 相當的賞心悅目。除了方便在網路上傳送,經常看到譬如說個人履歷表、銀行交易紀錄、公司財務報表、海報、廣告文案等等頃向會印出來的文件也都會使用PDF。


只是,美麗的東西往往都是帶刺的🌹。這些豐富的要素,使得處理PDF的資料具有相當程度的挑戰性。


大家有沒有曾經為了擷取PDF中的內容而氣到內傷的經驗?如果單純手動Copy & Paste裡面的內容,往往需要做不少後製的格式調整。


PDF某種程度是設計讓你無法輕易去更改,它就像一張畫布的概念。為了維持檔案的呈現樣貌,PDF中有許許多多複雜的要素存在,有興趣的話可以參考這裡




接下來,我們來看看如何使用Python來幫助我們處理PDF檔案吧。


Python其實有不少處理PDF格式的Library,但是許多用法並不是那麼直覺。


因此,我們今天要來介紹的是個人覺得最簡單好用的 - pdfplumber。


首先安裝如下:


pip install pdfplumber==0.5.25


擷取文字


第一個最常會用到的,就是擷取PDF中的文字部分。話不多說,就直接來看例子吧!


這裡是我們會用到的PDF檔案 (摘錄自Google的財務報表)



Code如下:



就這麼幾行code,我們就抓到了第一頁的文字了!!

  • 利用pdfplumber.open這個函數,並指定檔案路徑來生成PDF的物件。

  • 接著,利用.pages這個屬性,可以指定你要的頁數,在這裡我們指定要第一頁(pages[0])。

  • 這個page本身也是一個物件,可以用page.extract_text來將文字內容擷取出來。

(這裡注意到,這個文字串的分行是完全按照PDF本身的長相,所以有時候你可能會覺得怎麼有些地方斷的怪怪的。因為PDF是一個固定的長相,不會根據你的閱覽畫面的尺寸去做調整。)


接下來,由於抓出來的text是一整個string,所以如果想要能更細部的去分析,我們可以簡單利用.split將它分行。"\n" 代表的是一個斷行的特殊字元。



這樣一來,如果我們有特定的資料需要去擷取,就容易處理多了。例如我可以去尋找每一行中含有 "shares"的句子:


擷取表格


再來,假設我們想要報表裡面的表格類型(table)的資料,


嗯~,當然我們用剛剛的.extract_text其實也可以抓到裡面的內容,畢竟都是text。不過這樣一來我們就得特別知道表格的位置及特徵,然後需要的話還得在自己建構一個表格。


其實,抓取PDF中的表格具有相當的挑戰性,因為PDF中並沒有真的有table的概念😟。


幸運的是,pdfplumber有提供.extract_table用來擷取內容中看起來像table的格式。


請看下面的例子:


抓是抓到了,只是看起來好樣有一些雜音,像是空白的string以及一堆None...

所以稍微做一點清理:


這樣看起來應該好多了!


接著根據你的需求也可以把它轉成DataFrame。


這裡要再重申一次,根據表格的呈現方式,往往擷取當中的資料不見得會很單純。例如說格子(cell)的高低不一樣、或是分隔線的有無,等等因素都可能導致無法成功抓取表格。



合併PDF


OK,接下來的Use case稍有不同,但是我覺得應該還蠻有用的,所以想跟大家也一起來看一下🙂。


假設我們有另外一個PDF檔案如下,



今天我想把這個檔案中的內容跟之前的PDF結合成一個PDF檔。怎麼樣可以利用Python來做到這一點呢??


對於這項任務(簡單來說就是把分別的PDF檔中的部分page擷取出來,做成一個新的PDF檔),我們會用到另外一個也很好用的Library,叫做PyPDF2。


安裝如下:


 pip install PyPDF2==1.26.0

話不多說,Code範例如下:



幾個重點:

  • 利用PyPDF2的PdfFileReader,並提供檔案的路徑來讀取該PDF

  • 範例中,我們單純要檔案的第一頁,利用pdf_reader.getPage(0)

  • 透過PyPDF2的PdfFileWriter生成的物件,我們可以使用.addPage來加入剛剛我們拿到的page。

  • 這裡我們用一個For loop,才不用寫兩次一樣的東西


將我們想要的pages都加入至PdfFileWriter物件後,接著就可以將它寫入檔案:



注意用到的模式是 "wb",因為我們寫入的是bytes,不是string喔。



這樣一來,我們就成功的將兩個不同的PDF檔的頁面結合成一個新的PDF檔了喔!😃

👏👏👏


結語


今天跟大家介紹了:

  • PDF的基本用途及構造

  • 如何用pdfplumber來擷取PDF中的文字與表格內容

  • 如何用PyPDF2來把分別的PDF檔中的部分page擷取出來,做成一個新的PDF檔

由於各種PDF的生成方式及呈現的複雜度,使得實作上處理PDF經常是一個具有相當挑戰性的任務。但是沒辦法,PDF是現今普遍會看到的資料來源的一種😢,因此當需要的時候,知道如何處理PDF將是相當重要。


今天到這裡,希望對大家有幫助喔~🙂

1 Comment


啟峰 高
啟峰 高
Jun 11, 2023

是不是中文不行?我按照範例不行找中文。

Like
Post: Blog2_Post
bottom of page