想要把PDF格式的文件轉為別的格式,通常有點困難。一般習慣使用Microsoft OFFICE文書處理系統的人,知道可以把WORD文件、EXCEL文件轉換為PDF格式,但是OFFICE沒辦法幫你把PDF逆向轉回WORD文件或EXCEL文件。
PDF是Adobe公司所開發的一種文件格式,全名為Portable Document Format,所謂的portable可攜式,意思是這種文件格式可以跨越操作系統、應用程式的界線,不侷限使用單一特定的應用程式才能打開(相比之下,Word文件就是一定要用微軟的WORD應用程式打開,才能正常顯示)。
本文的主題則是,如何將PDF檔案轉換為純文字檔。
最簡單直觀的方式,是用Adobe Reader這個應用程式。目前它是可以免費下載使用的。用Adobe Reader打開一個PDF文件後,點選「檔案」>>「另存為文字檔」,就可以了。(如果想要轉換為OFFICE裡面的Word、Excel或PowerPoint,則必須付費使用Adobe Acrobat Pro DC。它不只可以用來轉檔,還可以讓你編輯PDF文件。)
補充一點,如果想要知道PDF文件裡的文字是什麼編碼,可以在Adobe Reader內查看,點選「檔案」>>「內容」,再選擇「字型」的標籤頁,就可找到。
也可寫Python程式把PDF轉為純文字格式
接下來要討論的則是,用Python程式將PDF格式轉換為純文字,並另存新檔。目前為止我試過 pdfplumber 和 pypdf2 兩個模塊(module),兩者都有效果好的時候。
pdfplumber:
pdfplumber的特色是程式碼中不需要指明文字的編碼,而且它可以用來轉換中文內容的檔案。pdfplumber似乎是可以自己辨別文字編碼然後進行轉換。不過,可以想像,若PDF文件用的剛好是這個模塊不兼容的編碼,就沒辦法正確轉檔了!我自己試過的例子:現在比較罕見的ETenms-B5-H中文編碼,就沒辦法用pdfplumber轉換出來。
import pdfplumber #引入模塊
file = 'filename.pdf'
pdfob = pdfplumber.open(file) #用模塊開啟要轉換的PDF檔
pgnum = len(pdfob.pages)
textfile = open('new.txt', 'w') #指定並開啟一個純文字檔
for pg in range(pgnum):
page = pdfob.pages[pg] #每次呼叫一頁
text = page.extract_text() #擷取純文字
textfile.write(text) #寫入純文字檔
pdfob.close()
textfile.close()
pypdf2:
pypdf2這個模塊使用時可以註明文字編碼。編碼如果正確的話,有機會轉換出整齊排列的純文字。如前述,用Adobe Reader的應用程式,可以查出文件的編碼。有需要時也可查閱網上資料,找出正確的編碼名稱:https://docs.python.org/2.4/lib/standard-encodings.html
import PyPDF2 as pp2 #引入模塊
PDFfile = open('tobeconverted.pdf', 'rb') #開啟PDF檔,記得模式要寫rb
pdfreader = pp2.PdfFileReader(PDFfile)
textfile = open('catcher.text', 'a')
print(pdfreader.getNumPages()) #取得PDF檔案的頁數
i = 0
while i < pdfreader.getNumPages():
pageinfo = pdfreader.getPage(i) #每次取出一頁
Text = pageinfo.extractText() #提取純文字(下行為另一種寫法,可註明文字編碼)
#Text = pageinfo.extractText().encode('latin1', errors='ignore').decode('utf-8', errors='ignore')
textfile.writelines(Text) #寫入提取的純文字
i = i + 1
PDFfile.close()
textfile.close()
寫Python程式來轉換PDF檔,好處就是不必特地下載任何軟體程式來轉檔。不過,由於文字編碼的類別實在太紛雜了,似乎還沒有一個包山包海什麼編碼都能解的萬能模塊可以用。
再補充一點,其實用來解析PDF檔案的Python模塊還有很多,但如果想處理的檔案含有中文內容,可以先用pdfplumber試試看,可能是最有效率的。而如果是轉換英文檔案,則pdfplumber和pypdf都很有機會成功(若能知道文字編碼為何,那麼pypdf2轉換出來的文字有可能更整齊有序,畢竟轉換出整齊的純文字,才方便後續的閱讀或是整理)。