一文教會你用Python讀取PDF文件
實戰(zhàn)場景
Python 工程師在日常的工作中,經常會碰到解析和處理PDF文件的情況,實戰(zhàn)中需求主要分為如下情況:
- 提取 PDF 中的文字
- 將 PDF 中每頁轉換為圖片
- word 轉換為PDF
- PDF生成,編輯,導入導出
- PDF在線渲染
除了最后一項需要前端配合以外,其余內容都可以直接在 python 端進行實現。
本次實戰(zhàn)選擇 pdfplumber 庫進行學習,可以提前安裝該庫,不過有一點需要注意,該庫主要用于讀取 PDF 進行操作,寫入和編輯無法實現,即本文學習一款專注于 PDF 內容提取的庫。
> pip install pdfplumber -i https://pypi.tuna.tsinghua.edu.cn/simple
pdfplumber 庫具備如下特點:
- 可以訪問PDF對象中的任意元素詳細信息;
- 可以提取文本和表格,而且用法簡單;
- 集成了可視化調試。
Python PDF 實戰(zhàn)編碼
下面可以編寫 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 的核心,后續(xù)對 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
# 創(chuàng)建一個讀PDF文件的Reader對象
reader = PyPDF2.PdfFileReader('resources/XGBoost.pdf')
# 創(chuàng)建一個寫PDF文件的Writer對象
writer = PyPDF2.PdfFileWriter()
# 對PDF文件所有頁進行循環(huán)遍歷
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文件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python之ThreadPoolExecutor線程池問題
這篇文章主要介紹了Python之ThreadPoolExecutor線程池問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
Python中工作日類庫Busines Holiday的介紹與使用
Python語言是通過區(qū)分類庫的方式來劃分功能。用戶根據自身的需要加載合適的類庫,來完成需要的功能。下面這篇文章主要給大家介紹了關于Python中工作日類庫Busines Holiday使用的相關資料,需要的朋友可以參考借鑒。2017-07-07

