Python中pypdf庫處理PDF文件的詳細說明和常見用法
前言
pypdf
是一個純 Python 庫,用于處理 PDF 文件。它支持讀取、修改、合并、拆分、加密和提取 PDF 文件的文本、元數(shù)據(jù)及頁面內容。pypdf
是 PyPDF2
的繼任者(2022 年更名并重構),提供了更現(xiàn)代化的 API 和更高的性能,適合處理簡單的 PDF 操作任務。
以下是對 pypdf
庫的詳細說明和常見用法。
1. pypdf 庫的作用
- 讀取 PDF:提取文本、元數(shù)據(jù)、頁面數(shù)量等。
- 修改 PDF:合并、拆分、旋轉、裁剪頁面。
- 創(chuàng)建 PDF:生成新 PDF 或添加內容(如文本、水印)。
- 加密/解密:為 PDF 設置密碼或解鎖受保護的 PDF。
- 跨平臺:純 Python 實現(xiàn),無需外部依賴(如 Adobe Acrobat)。
2. 安裝與環(huán)境要求
- Python 版本:支持 Python 3.6+(推薦 3.8+)。
- 依賴:無強制外部依賴,可選依賴:
Pillow
:處理 PDF 中的圖像。pycryptodome
:支持加密/解密。
- 安裝命令:
pip install pypdf
- 可選擴展:
pip install pypdf[image] # 包含 Pillow pip install pypdf[crypto] # 包含 pycryptodome
- 驗證安裝:
import pypdf print(pypdf.__version__) # 示例輸出: 5.0.1
3. 核心功能與用法
pypdf
的核心類包括 PdfReader
(讀取 PDF)、PdfWriter
(修改/創(chuàng)建 PDF)和 PdfMerger
(合并 PDF)。以下是主要功能和示例。
3.1 讀取 PDF
使用 PdfReader
讀取 PDF 文件,提取元數(shù)據(jù)、頁面數(shù)和文本。
from pypdf import PdfReader # 打開 PDF 文件 reader = PdfReader("example.pdf") # 獲取元數(shù)據(jù) metadata = reader.metadata print(metadata) # 輸出: {'/Title': 'Example PDF', '/Author': 'John Doe', ...} # 獲取頁面數(shù) print(len(reader.pages)) # 輸出頁面數(shù) # 提取第一頁文本 page = reader.pages[0] print(page.extract_text())
說明:
reader.metadata
返回 PDF 元數(shù)據(jù)(如標題、作者)。reader.pages
是一個頁面列表,pages[i]
返回第 i 頁(從 0 開始)。page.extract_text()
提取頁面文本(效果依賴 PDF 結構,可能不完整)。
3.2 合并 PDF
使用 PdfMerger
或 PdfWriter
合并多個 PDF 文件。
from pypdf import PdfMerger # 創(chuàng)建合并器 merger = PdfMerger() # 添加 PDF 文件 merger.append("file1.pdf") merger.append("file2.pdf") # 保存合并結果 merger.write("merged.pdf") merger.close()
替代方法(使用 PdfWriter):
from pypdf import PdfReader, PdfWriter writer = PdfWriter() for pdf in ["file1.pdf", "file2.pdf"]: reader = PdfReader(pdf) for page in reader.pages: writer.add_page(page) with open("merged.pdf", "wb") as f: writer.write(f)
說明:
PdfMerger
更適合簡單合并任務。PdfWriter
提供更靈活的控制。
3.3 拆分 PDF
將 PDF 拆分為單個頁面或指定范圍。
from pypdf import PdfReader, PdfWriter reader = PdfReader("example.pdf") # 拆分每一頁為單獨 PDF for i, page in enumerate(reader.pages): writer = PdfWriter() writer.add_page(page) with open(f"page_{i+1}.pdf", "wb") as f: writer.write(f)
說明:
- 每個頁面保存為單獨文件。
- 可通過索引選擇特定頁面范圍。
3.4 旋轉頁面
旋轉 PDF 的頁面。
from pypdf import PdfReader, PdfWriter reader = PdfReader("example.pdf") writer = PdfWriter() # 旋轉第一頁 90 度 page = reader.pages[0] page.rotate(90) writer.add_page(page) # 保存結果 with open("rotated.pdf", "wb") as f: writer.write(f)
說明:
page.rotate(angle)
接受角度(順時針,90 的倍數(shù))。- 旋轉后的頁面添加到新 PDF。
3.5 加密/解密 PDF
為 PDF 設置密碼或解鎖受保護的 PDF。
from pypdf import PdfReader, PdfWriter # 加密 PDF reader = PdfReader("example.pdf") writer = PdfWriter() for page in reader.pages: writer.add_page(page) writer.encrypt(user_password="my_password", algorithm="AES-256") with open("encrypted.pdf", "wb") as f: writer.write(f) # 解密 PDF reader = PdfReader("encrypted.pdf") if reader.is_encrypted: reader.decrypt("my_password") print(reader.pages[0].extract_text())
說明:
encrypt
支持RC4-128
和AES-256
算法。decrypt
需提供正確密碼。
3.6 提取圖像
從 PDF 中提取圖像(需安裝 Pillow
)。
from pypdf import PdfReader reader = PdfReader("example.pdf") page = reader.pages[0] for img in page.images: with open(f"image_{img.name}", "wb") as f: f.write(img.data)
說明:
page.images
返回頁面中的圖像對象。img.data
是圖像的二進制數(shù)據(jù)。
4. 性能與特點
- 高效性:純 Python 實現(xiàn),啟動快,無需外部工具。
- 內存效率:逐頁處理,適合大型 PDF。
- 靈活性:支持頁面級操作和元數(shù)據(jù)修改。
- 局限性:
- 文本提取效果依賴 PDF 結構,復雜格式(如掃描文檔)可能失敗。
- 不支持直接編輯 PDF 內容(如修改文本),需結合其他庫(如
reportlab
)。
5. 實際應用場景
- 文檔處理:合并報告、拆分章節(jié)、提取元數(shù)據(jù)。
- 自動化工作流:批量處理 PDF(如添加水印、加密)。
- 數(shù)據(jù)提取:從 PDF 提取文本或圖像用于分析。
- 電子書管理:調整頁面順序或裁剪邊距。
- 安全管理:為敏感文檔設置密碼。
示例(提取所有頁面文本):
from pypdf import PdfReader reader = PdfReader("example.pdf") text = "" for page in reader.pages: text += page.extract_text() or "" print(text[:200]) # 輸出前 200 字符
6. 注意事項
- 文本提取:
- 掃描或圖像型 PDF 需先用 OCR 工具(如
pytesseract
)處理。 - 復雜布局可能導致文本順序錯誤。
- 掃描或圖像型 PDF 需先用 OCR 工具(如
- 加密限制:
- 某些高強度加密可能需要
pycryptodome
。 - 解密需正確密碼,否則拋出異常。
- 某些高強度加密可能需要
- 文件路徑:
- 確保文件路徑正確,建議使用
pathlib
或絕對路徑。
- 確保文件路徑正確,建議使用
- 版本兼容性:
pypdf
(≥3.0.0)與PyPDF2
不完全兼容,舊代碼需調整。- 最新版本(5.0.1,截至 2025)優(yōu)化了性能和 API。
- 錯誤處理:
- 處理
FileNotFoundError
(文件不存在)。 - 處理
PdfReadError
(文件損壞或加密)。
- 處理
7. 綜合示例
以下是一個綜合示例,展示讀取、合并、加密和提取文本:
from pypdf import PdfReader, PdfWriter, PdfMerger # 讀取 PDF 元數(shù)據(jù)和文本 reader = PdfReader("input.pdf") print("Metadata:", reader.metadata) print("Page count:", len(reader.pages)) print("First page text:", reader.pages[0].extract_text()[:100]) # 合并多個 PDF merger = PdfMerger() merger.append("input1.pdf") merger.append("input2.pdf") merger.write("merged.pdf") merger.close() # 加密合并后的 PDF reader = PdfReader("merged.pdf") writer = PdfWriter() for page in reader.pages: writer.add_page(page.rotate(90)) # 旋轉頁面 writer.encrypt(user_password="secret", algorithm="AES-256") with open("encrypted_rotated.pdf", "wb") as f: writer.write(f)
說明:
- 讀取元數(shù)據(jù)和文本。
- 合并兩個 PDF。
- 旋轉頁面并加密輸出。
8. 資源與文檔
- 官方文檔:https://pypdf.readthedocs.io/
- GitHub 倉庫:https://github.com/py-pdf/pypdf
- PyPI 頁面:https://pypi.org/project/pypdf/
- 教程:https://pypdf.readthedocs.io/en/stable/user/introduction.html
- 遷移指南(從 PyPDF2):https://pypdf.readthedocs.io/en/stable/user/migration.html
到此這篇關于Python中pypdf庫處理PDF文件的詳細說明和常見用法的文章就介紹到這了,更多相關Python pypdf庫處理PDF文件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python?CNN卷積神經(jīng)網(wǎng)絡實戰(zhàn)教程深入講解
CNN,即卷積神經(jīng)網(wǎng)絡,主要用于圖像識別,分類。由輸入層,卷積層,池化層,全連接層(Affline層),Softmax層疊加而成。卷積神經(jīng)網(wǎng)絡中還有一個非常重要的結構:過濾器,它作用于層與層之間(卷積層與池化層),決定了怎樣對數(shù)據(jù)進行卷積和池化2022-12-12Python中如何使用多線程優(yōu)化For循環(huán)
這篇文章主要為大家詳細介紹了在Python中如何使用多線程實現(xiàn)優(yōu)化For循環(huán),文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2025-01-01Python接口自動化之cookie、session應用詳解
本文主要介紹cookie、session原理及在自動化過程中如何利用cookie、session保持會話狀態(tài)的應用,有需要的朋友可以參考下,希望可以有所幫助2021-08-08Python 在區(qū)塊鏈智能合約開發(fā)中的應用與實踐小結
Python作為一種廣泛應用的編程語言,在區(qū)塊鏈智能合約開發(fā)中扮演著重要角色,通過使用Python框架如Brownie和Web3.py,開發(fā)者可以輕松編寫和部署智能合約,感興趣的朋友一起看看吧2024-09-09