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