2024年4月1日 星期一

Python : 匯出 PDF 表格為試算表資料

2024年4月1日 星期一

很多行政工作如果規畫、整合得當是可以不用花那麼多時間的;反之,沒有整合,就是整死人。記得以前看學校幹事們忙著在電腦上剪剪貼貼資料,忙得人仰馬翻的,總覺得,為什麼運用電腦了,還需要這樣子「愚公移山」;關係夠好,看不下去了,就會幫忙弄些小工具,來處理資料。前幾天同事問我有沒有辦法將別人 PDF 檔中的表格資料匯出到試算表,並且將列變成行、直變橫?PDF 中的表格長這樣子:

第一個想法,Python 應該可以!幾個程序能做到,轉檔應該就有望了:

  • 以 Python 讀取 PDF 的資料,並解析出表格文字內容。
  • 去掉不要的資料。
  • 將表格內容進行旋轉(transpose)。

由讀 PDF 讀入表格資料

讓 Python 讀入 PDF 資料,並解析出表格文字內容,我試了:

  • tabula-py
  • Camelot (camelot-py)

測試過,感覺 Camelot 比較可以跟後續的資料旋轉接軌,就專心研究 camelot-py 了。

關於 camelot-py 的安裝

在 Windows 上使用 camelot-py 大概會遇到這個錯誤訊息:

OSError: Ghostscript is not installed. You can install it using the instructions here: https://camelot-py.readthedocs.io/en/master/user/install-deps.html

主要是因為讀入 PDF 檔案時,如果沒有指定「backend」參數,它預設會使用預設值「backend="ghostscript"」,而大部份的電腦中可能沒安裝ghostscript,有興趣可以參考錯誤訊息中的說明文件:

因為 ghostscript 的安裝顯得較複雜,所以我選擇在 Windows 中用「backend="poppler"」,只要先執行以下兩行指令安裝 pdftopng 跟 opencv 即可:

pip install pdftopng
pip install opencv-python

倒過來,如果在 Google Colab 的環境中,安裝 pdftopng 反而會累死人(我是沒成功),安裝 ghostscript 容易多了:

!apt install python3-tk ghostscript
!pip install  ghostscript

關於 camelot-py 的使用

假設 pdf_file_name 是 PDF 的路徑,pages 中放了要讀入資料的頁碼 list,只要這樣就可以讀取資料:

import camelot
pdfTable = camelot.read_pdf(pdf_file_name, pages=pages)

如果不是用 ghostscript,就用:

import camelot
pdfTable = camelot.read_pdf(pdf_file_name, pages=pages, backend="poppler")

接下來我們就可以針對 pdfTable 來存取(轉換)資料,詳情可以參考 camelot-py 中,有關 Table 的說明:

我使用 pdfTable[0].df ,將抓到資料轉為 pandas.DataFrame 的格式,方便後續的資料處理。

資料處理

前面提到利用 pdfTable[0].df ,可以將指定頁資料轉為 pandas.DataFrame 物件,假設將內容指定給變數 df,我想針對 df 再進行一些處理:

  • 只取出指定的列(之後會旋轉為欄)。
  • 去掉原始資料最右側的「小計」那欄。
  • 暫存原始資料最左側欄的資料(最後為試算表中的欄位名稱)。
  • 去掉流水號不是數字(空格或是「以下空白」)的資料。
  • 將一頁頁資料合併在一起

pandas 的 DataFrame,在存取資料時,幾個關鍵詞跟對象有關:

  • index
  • colunms
  • axis

幾個關鍵詞跟過濾、移動指標有關:

  • isin
  • iloc
  • loc

資料的刪除、旋轉、合併的關鍵詞:

  • drop
  • transpose
  • concat

詳細的說明都可以在pandas的網站查到:

為了寫這個資料轉換的工具,第一次玩  Camelot 和 pandas,雖然還沒有很深入研究,但工具有了初步的成果了,將它移植到 Google Colab 中,想玩玩看(哈!不能提供有個資的 PDF 啦!) ,或是對原始碼有興趣(別嫌我,醜是一定的,就好玩,亂寫的),網址如下:

pdf-to-excel.ipynb 的截圖

改天再補記一下曾經卡關很久的地方。

相關文章


沒有留言:

張貼留言

 
雄::gsyan © 2009. Design by Pocket