9/20/2020

PDF轉檔為純文字格式:使用Adobe Reader或Python

想要把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轉換出來的文字有可能更整齊有序,畢竟轉換出整齊的純文字,才方便後續的閱讀或是整理)。


1 則留言:

  1. 非常感謝你的介紹。普通的不是非常隱私的圖片文字我也會考慮選用線上工具將文字從圖片中辨析為可編輯檔案,但是如果圖片裡面包含了重要的資訊,選用PDF辨析軟體進行脫線轉檔可有效保護個人隱私。我一般是使用內建了OCR功能的Renee PDF Aide,辨析準確度高。
    https://www.reneelab.net/free-ocr-converter.html

    回覆刪除