PyPDF2 庫(kù)中 PDF 文檔處理的九個(gè)基本操作指南
PyPDF2是一個(gè)非常實(shí)用的Python庫(kù),用于讀取、分割、合并、裁剪以及執(zhí)行其他PDF文檔操作。它非常適合自動(dòng)化處理PDF文件的任務(wù)。本文將詳細(xì)介紹使用PyPDF2進(jìn)行PDF處理的九個(gè)基本操作,并通過(guò)實(shí)際代碼示例幫助你快速上手。
安裝PyPDF2
首先,你需要安裝PyPDF2庫(kù)。打開命令行工具,輸入以下命令:
pip install pypdf2
安裝完成后,你可以通過(guò)以下方式導(dǎo)入PyPDF2庫(kù):
from PyPDF2 import PdfReader, PdfWriter
讀取PDF文件
讀取PDF文件是任何PDF處理任務(wù)的第一步。這里有一個(gè)簡(jiǎn)單的示例:
# 導(dǎo)入必要的庫(kù)
from PyPDF2 import PdfReader
# 創(chuàng)建PdfReader對(duì)象
reader = PdfReader("example.pdf")
# 獲取PDF的頁(yè)數(shù)
num_pages = len(reader.pages)
print(f"Number of pages: {num_pages}")
# 獲取第一頁(yè)的內(nèi)容
first_page = reader.pages[0]
text = first_page.extract_text()
print(f"First page text:\n{text}")
這段代碼首先創(chuàng)建了一個(gè)PdfReader對(duì)象來(lái)讀取名為example.pdf的文件,然后獲取了該P(yáng)DF的總頁(yè)數(shù)并打印出來(lái)。接著,它提取了第一頁(yè)的內(nèi)容并將其打印出來(lái)。
分割PDF文件
有時(shí)我們需要將一個(gè)大的PDF文件拆分成多個(gè)小文件。下面是一個(gè)如何實(shí)現(xiàn)這一目標(biāo)的例子:
from PyPDF2 import PdfReader, PdfWriter
def split_pdf(input_pdf, output_prefix):
# 創(chuàng)建PdfReader對(duì)象
reader = PdfReader(input_pdf)
# 遍歷每一頁(yè)
for i in range(len(reader.pages)):
writer = PdfWriter()
# 添加當(dāng)前頁(yè)
writer.add_page(reader.pages[i])
# 寫入新的PDF文件
with open(f"{output_prefix}_{i + 1}.pdf", "wb") as f:
writer.write(f)
split_pdf("large_document.pdf", "part")
這段代碼定義了一個(gè)函數(shù)split_pdf,它接受兩個(gè)參數(shù):一個(gè)是輸入的PDF文件名,另一個(gè)是輸出文件的前綴。對(duì)于輸入PDF中的每一頁(yè),它都會(huì)創(chuàng)建一個(gè)新的PDF文件并保存下來(lái)。
合并多個(gè)PDF文件
合并多個(gè)PDF文件也非常簡(jiǎn)單。下面是一個(gè)示例:
from PyPDF2 import PdfReader, PdfWriter
def merge_pdfs(inputs, output):
writer = PdfWriter()
for input_pdf in inputs:
reader = PdfReader(input_pdf)
for page in reader.pages:
writer.add_page(page)
with open(output, "wb") as f:
writer.write(f)
merge_pdfs(["doc1.pdf", "doc2.pdf"], "merged.pdf")
這個(gè)函數(shù)接收一個(gè)包含多個(gè)PDF文件名的列表作為輸入,并將它們合并成一個(gè)PDF文件。每添加一頁(yè)時(shí),它都會(huì)調(diào)用add_page方法將頁(yè)面添加到最終的PDF文檔中。
旋轉(zhuǎn)PDF頁(yè)面
如果你需要調(diào)整PDF文件中某些頁(yè)面的方向,可以使用rotate_clockwise或rotate_counter_clockwise方法輕松實(shí)現(xiàn):
from PyPDF2 import PdfReader, PdfWriter
def rotate_pages(input_pdf, output_pdf, angle):
reader = PdfReader(input_pdf)
writer = PdfWriter()
for page in reader.pages:
if angle == 90:
page.rotate_clockwise(90)
elif angle == -90:
page.rotate_counter_clockwise(90)
else:
raise ValueError("Angle must be 90 or -90.")
writer.add_page(page)
with open(output_pdf, "wb") as f:
writer.write(f)
rotate_pages("example.pdf", "rotated.pdf", 90)
此函數(shù)根據(jù)指定的角度(90度或-90度)旋轉(zhuǎn)PDF中的所有頁(yè)面,并將結(jié)果保存到新的PDF文件中。
加密PDF文件
加密PDF文件可以保護(hù)文件內(nèi)容不被未經(jīng)授權(quán)的人訪問(wèn)。下面是一個(gè)簡(jiǎn)單的加密示例:
from PyPDF2 import PdfReader, PdfWriter
def encrypt_pdf(input_pdf, output_pdf, password):
reader = PdfReader(input_pdf)
writer = PdfWriter()
for page in reader.pages:
writer.add_page(page)
# 設(shè)置密碼
writer.encrypt(password)
# 寫入加密后的PDF文件
with open(output_pdf, "wb") as f:
writer.write(f)
encrypt_pdf("example.pdf", "encrypted.pdf", "secret")
這段代碼定義了一個(gè)函數(shù)encrypt_pdf,它接受三個(gè)參數(shù):輸入的PDF文件名、輸出的PDF文件名和密碼。它遍歷輸入PDF中的每一頁(yè)并將其添加到writer對(duì)象中,然后使用encrypt方法設(shè)置密碼,并將加密后的PDF文件寫入到新的文件中。
解密PDF文件
如果要讀取已加密的PDF文件,需要先對(duì)其進(jìn)行解密。下面是一個(gè)簡(jiǎn)單的解密示例:
from PyPDF2 import PdfReader, PdfWriter
def decrypt_pdf(input_pdf, output_pdf, password):
reader = PdfReader(input_pdf)
# 檢查是否已加密
if reader.is_encrypted:
try:
reader.decrypt(password)
except Exception as e:
print(f"Error: {e}")
return
writer = PdfWriter()
for page in reader.pages:
writer.add_page(page)
# 寫入解密后的PDF文件
with open(output_pdf, "wb") as f:
writer.write(f)
decrypt_pdf("encrypted.pdf", "decrypted.pdf", "secret")
這段代碼定義了一個(gè)函數(shù)decrypt_pdf,它接受三個(gè)參數(shù):輸入的PDF文件名、輸出的PDF文件名和密碼。它首先檢查輸入PDF是否已加密,如果是,則嘗試使用提供的密碼進(jìn)行解密。如果解密成功,它會(huì)將PDF文件中的每一頁(yè)添加到writer對(duì)象中,并將解密后的PDF文件寫入到新的文件中。
添加水印
在PDF文件中添加水印可以幫助標(biāo)識(shí)文檔的所有權(quán)或提醒讀者注意版權(quán)問(wèn)題。下面是一個(gè)簡(jiǎn)單的添加水印示例:
from PyPDF2 import PdfReader, PdfWriter
def add_watermark(input_pdf, watermark_pdf, output_pdf):
reader = PdfReader(input_pdf)
watermark_reader = PdfReader(watermark_pdf)
writer = PdfWriter()
# 獲取水印頁(yè)面
watermark_page = watermark_reader.pages[0]
for page in reader.pages:
page.merge_page(watermark_page)
writer.add_page(page)
# 寫入帶有水印的PDF文件
with open(output_pdf, "wb") as f:
writer.write(f)
add_watermark("example.pdf", "watermark.pdf", "watermarked.pdf")
這段代碼定義了一個(gè)函數(shù)add_watermark,它接受三個(gè)參數(shù):輸入的PDF文件名、水印PDF文件名和輸出的PDF文件名。它首先創(chuàng)建一個(gè)watermark_page對(duì)象來(lái)表示水印頁(yè)面,然后遍歷輸入PDF中的每一頁(yè),并使用merge_page方法將水印頁(yè)面添加到每一頁(yè)中。最后,將帶有水印的PDF文件寫入到新的文件中。
實(shí)戰(zhàn)案例:批量處理PDF文件
假設(shè)你有一個(gè)文件夾中包含多個(gè)PDF文件,需要對(duì)這些文件進(jìn)行批量處理,例如添加水印、加密或解密。下面是一個(gè)簡(jiǎn)單的批量處理示例:
import os
from PyPDF2 import PdfReader, PdfWriter
def batch_process_pdf(input_folder, watermark_pdf, output_folder, password=None):
# 創(chuàng)建輸出文件夾
os.makedirs(output_folder, exist_ok=True)
# 獲取文件夾中的所有PDF文件
pdf_files = [f for f in os.listdir(input_folder) if f.endswith(".pdf")]
for pdf_file in pdf_files:
input_pdf_path = os.path.join(input_folder, pdf_file)
output_pdf_path = os.path.join(output_folder, pdf_file)
# 創(chuàng)建PdfReader對(duì)象
reader = PdfReader(input_pdf_path)
writer = PdfWriter()
# 添加水印
if watermark_pdf is not None:
watermark_reader = PdfReader(watermark_pdf)
watermark_page = watermark_reader.pages[0]
for page in reader.pages:
page.merge_page(watermark_page)
writer.add_page(page)
# 加密或解密
if password is not None:
writer.encrypt(password)
elif reader.is_encrypted:
reader.decrypt(password)
for page in reader.pages:
writer.add_page(page)
# 寫入新的PDF文件
with open(output_pdf_path, "wb") as f:
writer.write(f)
batch_process_pdf("input_folder", "watermark.pdf", "output_folder", "secret")
這段代碼定義了一個(gè)函數(shù)batch_process_pdf,它接受四個(gè)參數(shù):輸入文件夾路徑、水印PDF文件名、輸出文件夾路徑和密碼。它首先創(chuàng)建輸出文件夾,并獲取輸入文件夾中的所有PDF文件。
然后,對(duì)于每個(gè)PDF文件,它執(zhí)行以下操作:
- 創(chuàng)建一個(gè)PdfReader對(duì)象來(lái)讀取輸入PDF文件。
- 如果提供了水印PDF文件,則添加水印。
- 如果提供了密碼,則進(jìn)行加密或解密。
- 將處理后的PDF文件寫入到輸出文件夾中。
本文介紹了使用PyPDF2庫(kù)進(jìn)行PDF文件讀取、分割、合并、旋轉(zhuǎn)、加密、解密及添加水印的基本操作。通過(guò)實(shí)際代碼示例展示了如何利用PyPDF2自動(dòng)化處理PDF文件,從而提高工作效率。希望這些示例能夠幫助你更好地理解和應(yīng)用PyPDF2庫(kù)。