Python全能 PDF 工具:一行代码轻松合并、拆分、加密和解密文件!
简介:
PyPDF2 是一个 Python 库,用于操作 PDF 文件。它提供了多种功能,可以让你轻松地读取、写入、合并、拆分、旋转以及加密 PDF 文件等。PyPDF2 不支持修改已有的 PDF 内容(如文本编辑),但它可以在 PDF 文件的结构上进行很多处理,如提取文本、重新排列页面等。
import PyPDF2 # 导入 PyPDF2 库用于 PDF 操作
class PdfManager:
def __init__(self, file_path=None):
# 构造函数,初始化 PdfManager 类,可以选择传入一个文件路径
self.file_path = file_path # 存储传入的文件路径
self.reader = None # 初始化 PDF 读取器
self.writer = PyPDF2.PdfWriter() # 初始化 PDF 写入器
if file_path: # 如果传入了文件路径
self._load_pdf(file_path) # 调用内部方法加载 PDF 文件
def _load_pdf(self, file_path):
"""加载 PDF 文件"""
# 该方法会打开 PDF 文件并使用 PyPDF2 进行读取
with open(file_path, 'rb') as file: # 以二进制方式打开 PDF 文件
self.reader = PyPDF2.PdfReader(file) # 使用 PdfReader 读取文件内容
def read_pdf(self):
"""读取 PDF 内容并返回其中的文本"""
# 该方法会提取 PDF 文件中的所有文本内容
if not self.reader: # 如果文件未加载
raise ValueError("PDF 文件未加载") # 抛出错误
text = "" # 初始化文本变量,用来存储 PDF 提取的文本
for page in self.reader.pages: # 遍历所有页面
text += page.extract_text() # 提取页面中的文本并添加到 text 变量
return text # 返回提取的文本内容
def merge_pdfs(self, pdf_list, output_path):
"""合并多个 PDF 文件"""
# 该方法用于将多个 PDF 文件合并成一个文件
merger = PyPDF2.PdfMerger() # 初始化 PDF 合并器
for pdf in pdf_list: # 遍历传入的 PDF 文件列表
merger.append(pdf) # 将每个 PDF 文件添加到合并器中
merger.write(output_path) # 将合并后的文件写入到指定路径
merger.close() # 关闭合并器
def split_pdf(self, output_folder):
"""拆分 PDF 文件"""
# 该方法会将 PDF 文件拆分成多个单独的页面
if not self.reader: # 如果文件未加载
raise ValueError("PDF 文件未加载") # 抛出错误
num_pages = len(self.reader.pages) # 获取 PDF 文件中的页面数
for page_num in range(num_pages): # 遍历每一页
writer = PyPDF2.PdfWriter() # 创建一个新的 PDF 写入器
writer.add_page(self.reader.pages[page_num]) # 将当前页添加到写入器
output_path = f"{output_folder}/page_{page_num + 1}.pdf" # 生成拆分后的文件路径
with open(output_path, 'wb') as output_file: # 以写入模式打开新文件
writer.write(output_file) # 将当前页写入新文件
def rotate_pages(self, degrees):
"""旋转所有页面"""
# 该方法会旋转 PDF 文件中的每一页
if not self.reader: # 如果文件未加载
raise ValueError("PDF 文件未加载") # 抛出错误
for page in self.reader.pages: # 遍历每一页
page.rotate_clockwise(degrees) # 按照指定角度顺时针旋转页面
self.writer.add_page(page) # 将旋转后的页面添加到写入器中
def save_pdf(self, output_path):
"""保存 PDF 文件"""
# 该方法会将操作后的 PDF 文件保存到指定路径
with open(output_path, 'wb') as output_file: # 以写入模式打开输出文件
self.writer.write(output_file) # 将写入器中的内容写入文件
def encrypt_pdf(self, password, output_path):
"""加密 PDF 文件"""
# 该方法会对 PDF 文件进行加密,只有输入密码才能打开
if not self.reader: # 如果文件未加载
raise ValueError("PDF 文件未加载") # 抛出错误
for page in self.reader.pages: # 遍历每一页
self.writer.add_page(page) # 将每一页添加到写入器
self.writer.encrypt(password) # 使用指定的密码加密 PDF 文件
self.save_pdf(output_path) # 将加密后的文件保存到指定路径
def decrypt_pdf(self, password, output_path):
"""解密 PDF 文件"""
# 该方法会对已加密的 PDF 文件进行解密
if not self.reader: # 如果文件未加载
raise ValueError("PDF 文件未加载") # 抛出错误
if self.reader.decrypt(password): # 尝试使用密码解密 PDF 文件
for page in self.reader.pages: # 如果解密成功,遍历每一页
self.writer.add_page(page) # 将解密后的页面添加到写入器
self.save_pdf(output_path) # 保存解密后的 PDF 文件
else: # 如果密码错误
raise ValueError("密码错误,无法解密文件") # 抛出错误
if __name__ == '__main__':
# 示例用法:
# 加载 PDF 文件并读取内容
pdf_manager = PdfManager("example.pdf") # 创建 PdfManager 对象并加载文件
print(pdf_manager.read_pdf()) # 打印 PDF 文件的文本内容
# 合并多个 PDF 文件
pdf_manager.merge_pdfs(["file1.pdf", "file2.pdf"], "merged_output.pdf") # 合并两个文件并保存
# 拆分 PDF 文件
pdf_manager.split_pdf("output_folder") # 将 PDF 文件拆分为多个页面并保存
# 旋转 PDF 文件页面并保存
pdf_manager.rotate_pages(90) # 顺时针旋转每一页 90 度
pdf_manager.save_pdf("rotated_example.pdf") # 保存旋转后的 PDF 文件
# 加密 PDF 文件
pdf_manager.encrypt_pdf("your_password", "encrypted_example.pdf") # 使用密码加密 PDF 文件
# 解密 PDF 文件
pdf_manager.decrypt_pdf("your_password", "decrypted_example.pdf") # 使用密码解密 PDF 文件并保存
注释说明:
- 构造函数 (__init__):初始化时可以选择加载一个 PDF 文件。
- 加载 PDF 文件 (_load_pdf):私有方法,用于读取并加载 PDF 文件。
- 读取 PDF 内容 (read_pdf):提取 PDF 中的文本内容。
- 合并 PDF 文件 (merge_pdfs):将多个 PDF 文件合并成一个新的 PDF 文件。
- 拆分 PDF 文件 (split_pdf):将 PDF 文件拆分成多个单独的页面文件。
- 旋转页面 (rotate_pages):旋转 PDF 文件中的所有页面。
- 保存 PDF 文件 (save_pdf):将当前操作后的 PDF 文件保存到指定路径。
- 加密 PDF 文件 (encrypt_pdf):给 PDF 文件加密,需要设置密码。
- 解密 PDF 文件 (decrypt_pdf):使用密码解密加密过的 PDF 文件。