用Python顯示和處理PDF文件

pdf是電子書,文檔經常會用的格式,除了下載各種閱讀器以外,我們也可以用Python批量處理大量PDF文件。本文用到了pypdf2,pdfminer.six,pdf2image來做常規處理。

pypdf2 獲取pdf的基本信息,如作者,書名,頁數等


  5 from PyPDF2 import PdfFileReader
  6
  7 def extract_information(pdf_path,filename):
  8     try:
  9         with open(pdf_path, 'rb') as f:
 10             pdf = PdfFileReader(f)
 11             information = pdf.getDocumentInfo()
 12             number_of_pages = pdf.getNumPages()
 13
 14             title=filename.split('.pdf')[0]
 15             if information.title is not None and len(information.title)>0:
 16                 title=information.title
 17             print(f"{title} page : {number_of_pages}")
 18     except Exception as e:
 19         pass

基於文字的PDF

pdfminer.six 可以取出文本

  8 from io import StringIO
  9 from pdfminer.layout import LAParams
 10 from pdfminer.high_level import extract_text_to_fp

 16   def get_text(path):
 17     output_string = StringIO()
 18     with open(path, 'rb') as fin:
 19         extract_text_to_fp(fin, output_string)
 20     print(output_string.getvalue().strip())

基於掃描圖片的PDF

pdf2image 可以提出所有頁面存爲圖片,但因爲IO的性能問題。作者提出最好用SSD硬盤和多線程。

 6 from pdf2image import convert_from_path
    
 12 def get_cover(path,filename):
 13     images=convert_from_path(path)
 14     images[0].save(filename+'.jpg')

上面的代碼把封面(第一頁)取了出來,保存爲圖片

批量處理

我們可以用Python自帶的文件處理功能,結合上面的三個函數,批量處理books目錄下的大量pdf文件。


 38 if __name__ == '__main__':
 39     book_folder=os.path.join(Path.home(),'books')
 40     for pdf in os.listdir(book_folder):
 41         if pdf.endswith('.pdf'):
 42             path=os.path.join(book_folder,pdf)
 43             title,page=extract_information(path,pdf)
 44             if page>0 and page<50:
 45                 get_text(path)
 46             get_cover(path,pdf)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章