首頁 > 軟體

一文教會你用Python讀取PDF檔案

2022-08-09 14:00:04

實戰場景

Python 工程師在日常的工作中,經常會碰到解析和處理PDF檔案的情況,實戰中需求主要分為如下情況:

  • 提取 PDF 中的文字
  • 將 PDF 中每頁轉換為圖片
  • word 轉換為PDF
  • PDF生成,編輯,匯入匯出
  • PDF線上渲染

除了最後一項需要前端配合以外,其餘內容都可以直接在 python 端進行實現。

本次實戰選擇 pdfplumber 庫進行學習,可以提前安裝該庫,不過有一點需要注意,該庫主要用於讀取 PDF 進行操作,寫入和編輯無法實現,即本文學習一款專注於 PDF 內容提取的庫。

> pip install pdfplumber -i https://pypi.tuna.tsinghua.edu.cn/simple

pdfplumber 庫具備如下特點:

  • 可以存取PDF物件中的任意元素詳細資訊;
  • 可以提取文字和表格,而且用法簡單;
  • 整合了視覺化偵錯。

Python PDF 實戰編碼

下面可以編寫 PDF 操作的基礎程式碼。

import pdfplumber

with pdfplumber.open('./dddd.pdf') as pdf:
    for page in pdf.pages:
        print(page.extract_text())

        # 每頁列印一分頁分隔
        print('---------- 分頁分隔 ----------')

匯入 pdfplumber 模組之後,使用 pdfplumber.open('./dddd.pdf') 開啟本地 pdf 檔案,然後通過 pdf.pages 遍歷所有頁,在通過頁物件.extract_text() 方法,提取文字資訊。

pdfplumber.open() 方法的簽名如下所示:

pdfplumber.open("檔名", password = "密碼", laparams = { "line_overlap": 0.7 })

其中各引數描述如下:

  • file_name:檔名,必選引數;
  • password:PDF的密碼;
  • laparams:佈局引數。

除此之外,如果希望讀取 PDF,還可以使用 load() 方法,該方法也會返回 pdfplumber.PDF 類的範例。

pdfplumber.PDF 物件範例,主要有兩個重要屬性:

  • .metadata:從PDF的Info中獲取後設資料鍵 /值對字典。 通常包括“ CreationDate”,“ ModDate”,“ Producer”等;
  • .pages:包含 pdfplumber.Page 範例的列表,每一個範例代表PDF每一頁的資訊。

上文提及的 pdfplumber.Page 範例是 pdfplumber 的核心,後續對 PDF 的操作大量圍繞該類的屬性和方法實施,其重要屬性如下所示:

  • page_number:頁碼順序,第一頁的序號是 1;
  • witdh:寬度;
  • height:高度;
  • .objects/.chars/.lines/.rects/.curves/.figures/.images:獲取PDF頁中的重要資料。

核心方法如下所示:

  • extract_text():提取頁中的文字;
  • extract_words():提取所有單詞及其相關資訊;
  • extract_tables(): 提取頁面的表格。

extract_text() 呈現結果

extract_words() 呈現結果

extract_tables() 呈現效果,由於 PDF 中無表格,所有每頁得到的都是空!

補充

當然Python除了讀取PDF檔案,還有一些其他功能,例如加密PDF,旋轉和疊加頁面等,下面是實現的範例程式碼

旋轉和疊加頁面

import PyPDF2

from PyPDF2.pdf import PageObject

# 建立一個讀PDF檔案的Reader物件

reader = PyPDF2.PdfFileReader('resources/XGBoost.pdf')

# 建立一個寫PDF檔案的Writer物件

writer = PyPDF2.PdfFileWriter()

# 對PDF檔案所有頁進行迴圈遍歷

for page_num in range(reader.numPages):

      # 獲取指定頁碼的Page物件

      current_page = reader.getPage(page_num) # type: PageObject

      if page_num % 2 == 0:

         # 奇數頁順時針旋轉90度

         current_page.rotateClockwise(90)

      else:

# 偶數頁反時針旋轉90度

             current_page.rotateCounterClockwise(90)

      writer.addPage(current_page)

# 最後新增一個空白頁並旋轉90度

page = writer.addBlankPage() # type: PageObject

page.rotateClockwise(90)

# 通過Writer物件的write方法將PDF寫入檔案

with open('resources/XGBoost-modified.pdf', 'wb') as file:

    writer.write(file)

加密PDF檔案

import PyPDF2

reader = PyPDF2.PdfFileReader('resources/XGBoost.pdf')
writer = PyPDF2.PdfFileWriter()

for page_num in range(reader.numPages):
     writer.addPage(reader.getPage(page_num))

# 通過encrypt方法加密PDF檔案,方法的引數就是rre

#設定的密碼
writer.encrypt('foobared')

with open('resources/XGBoost-encrypted.pdf', 'wb') as file:

       writer.write(file)

批次新增水印

import PyPDF2

from PyPDF2.pdf import PageObject

reader1 = PyPDF2.PdfFileReader('resources/XGBoost.pdf') reader2 = PyPDF2.PdfFileReader('resources/watermark.pdf')
writer = PyPDF2.PdfFileWriter()

# 獲取水印頁
watermark_page = reader2.getPage(0)

for page_num in range(reader1.numPages):

     current_page = reader1.getPage(page_num) # type: PageObject                                           current_page.mergePage(watermark_page)

     # 將原始頁和水印頁進行合併
     writer.addPage(current_page) 

# 將PDF寫入檔案
with open('resources/XGBoost-watermarked.pdf', 'wb') as file:

       writer.write(file)

到此這篇關於一文教會你用Python讀取PDF檔案的文章就介紹到這了,更多相關Python讀取PDF檔案內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com