本文目录导读:
- 方法一:使用PyPDF2库(推荐)
- 方法二:使用pypdf库(PyPDF2的继任者)
- 方法三:实用案例:文件夹内所有PDF合并
- 方法四:带进度条的合并(适合大文件)
- 方法五:处理密码保护的PDF
- 实用小技巧
- 常见问题解决
- 完整脚本模板
我来为您详细介绍Python合并PDF的几种实操方法。
使用PyPDF2库(推荐)
安装
pip install PyPDF2
基础合并
import PyPDF2
import os
def merge_pdfs_basic(pdf_list, output_path):
"""
合并多个PDF文件
:param pdf_list: PDF文件路径列表
:param output_path: 输出文件路径
"""
# 创建PDF合并对象
merger = PyPDF2.PdfMerger()
# 逐个添加PDF文件
for pdf in pdf_list:
merger.append(pdf)
# 写入合并后的文件
with open(output_path, 'wb') as f:
merger.write(f)
print(f"合并完成!输出文件:{output_path}")
# 使用示例
pdf_files = ['file1.pdf', 'file2.pdf', 'file3.pdf']
merge_pdfs_basic(pdf_files, 'merged_output.pdf')
高级用法:选择指定页面
def merge_specific_pages(pdf_list, output_path):
"""
合并PDF并选择特定页面
"""
merger = PyPDF2.PdfMerger()
# 添加第一个PDF的所有页面
merger.append('file1.pdf')
# 添加第二个PDF的第1-3页
with open('file2.pdf', 'rb') as f:
pdf_reader = PyPDF2.PdfReader(f)
merger.append('file2.pdf', pages=(0, 2)) # 第1-3页(索引0-2)
# 添加第三个PDF的偶数页
merger.append('file3.pdf', pages=[0, 2, 4]) # 第1,3,5页
with open(output_path, 'wb') as f:
merger.write(f)
# 使用示例
merge_specific_pages(pdf_files, 'selective_merge.pdf')
使用pypdf库(PyPDF2的继任者)
安装
pip install pypdf
合并代码
from pypdf import PdfWriter
import os
def merge_with_pypdf(pdf_list, output_path):
"""
使用pypdf库合并PDF
"""
merger = PdfWriter()
for pdf in pdf_list:
merger.append(pdf)
# 写入输出文件
with open(output_path, 'wb') as f:
merger.write(f)
# 使用示例
pdf_files = ['doc1.pdf', 'doc2.pdf', 'doc3.pdf']
merge_with_pypdf(pdf_files, 'merged_document.pdf')
实用案例:文件夹内所有PDF合并
完整脚本
import os
import PyPDF2
from pathlib import Path
def merge_all_pdfs_in_folder(folder_path, output_filename='merged.pdf'):
"""
合并文件夹中的所有PDF文件
"""
# 获取文件夹路径并创建输出路径
folder = Path(folder_path)
output_file = folder / output_filename
# 收集所有PDF文件
pdf_files = list(folder.glob('*.pdf'))
pdf_files.sort() # 按文件名排序
if not pdf_files:
print("未找到PDF文件!")
return
print(f"找到 {len(pdf_files)} 个PDF文件")
# 合并文件
merger = PyPDF2.PdfMerger()
for pdf_file in pdf_files:
print(f"添加文件: {pdf_file.name}")
merger.append(str(pdf_file))
# 保存合并文件
with open(str(output_file), 'wb') as f:
merger.write(f)
print(f"合并完成!输出文件:{output_file}")
# 使用示例
merge_all_pdfs_in_folder('./pdf_files', 'combined.pdf')
带进度条的合并(适合大文件)
安装tqdm
pip install tqdm
带进度条的合并
import PyPDF2
from pathlib import Path
from tqdm import tqdm
import time
def merge_with_progress(pdf_list, output_path):
"""
带进度条的PDF合并
"""
merger = PyPDF2.PdfMerger()
print("开始合并PDF文件...")
for pdf_file in tqdm(pdf_list, desc="合并进度", unit="file"):
merger.append(str(pdf_file))
time.sleep(0.1) # 模拟处理时间(实际使用时删掉)
print("正在写入合并文件...")
with open(output_path, 'wb') as f:
merger.write(f)
print(f"合并完成!文件大小:{os.path.getsize(output_path)/1024:.2f} KB")
# 使用示例
pdf_files = [f'document_{i}.pdf' for i in range(1, 11)] # 模拟10个文件
merge_with_progress(pdf_files, 'merged_with_progress.pdf')
处理密码保护的PDF
import PyPDF2
def merge_protected_pdfs():
"""
合并带密码保护的PDF
"""
merger = PyPDF2.PdfMerger()
# 添加密码保护的PDF
with open('protected.pdf', 'rb') as file:
pdf_reader = PyPDF2.PdfReader(file)
if pdf_reader.is_encrypted:
pdf_reader.decrypt('your_password') # 输入密码
merger.append(pdf_reader)
# 添加普通PDF
merger.append('normal.pdf')
# 设置输出文件的密码
merger.encrypt('output_password')
with open('protected_merged.pdf', 'wb') as f:
merger.write(f)
# 使用示例
merge_protected_pdfs()
实用小技巧
按创建日期排序合并
import os
from datetime import datetime
def merge_by_date(folder_path):
"""按创建日期排序合并"""
pdf_files = []
for file in os.listdir(folder_path):
if file.endswith('.pdf'):
full_path = os.path.join(folder_path, file)
creation_time = os.path.getctime(full_path)
pdf_files.append((creation_time, full_path))
# 按创建时间排序
pdf_files.sort()
# 合并
merger = PyPDF2.PdfMerger()
for _, pdf_path in pdf_files:
merger.append(pdf_path)
merger.write('sorted_merged.pdf')
合并并添加书签
def merge_with_bookmarks(pdf_list, titles, output_path):
"""
合并PDF并添加书签
:param pdf_list: PDF文件列表
:param titles: 对应的书签标题列表
"""
merger = PyPDF2.PdfMerger()
for i, (pdf, title) in enumerate(zip(pdf_list, titles)):
merger.append(pdf, outline_item=title)
with open(output_path, 'wb') as f:
merger.write(f)
# 使用示例
pdf_files = ['ch1.pdf', 'ch2.pdf', 'ch3.pdf']
chapter_titles = ['第一章', '第二章', '第三章']
merge_with_bookmarks(pdf_files, chapter_titles, 'bookmarked_merge.pdf')
常见问题解决
处理编码错误
with open(pdf_file, 'rb') as file: # 使用二进制模式
merger.append(file)
大文件处理
# 分批处理大文件
def merge_large_files(pdf_files, output_path):
merger = PyPDF2.PdfMerger()
for i, pdf in enumerate(pdf_files):
try:
merger.append(pdf)
print(f"成功添加第{i+1}个文件")
except Exception as e:
print(f"添加第{i+1}个文件时出错: {e}")
merger.write(output_path)
完整脚本模板
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import sys
import PyPDF2
from pathlib import Path
def main():
"""主函数"""
# 配置参数
input_folder = "./pdfs" # 输入文件夹
output_file = "result.pdf" # 输出文件名
# 获取所有PDF文件
pdf_files = list(Path(input_folder).glob("*.pdf"))
if not pdf_files:
print("错误:未找到PDF文件!")
sys.exit(1)
print(f"发现 {len(pdf_files)} 个PDF文件")
# 执行合并
merger = PyPDF2.PdfMerger()
for pdf in sorted(pdf_files):
print(f"正在合并: {pdf.name}")
merger.append(str(pdf))
# 保存结果
merger.write(output_file)
print(f"合并完成!输出文件: {output_file}")
if __name__ == "__main__":
main()
这些方法涵盖了大多数PDF合并的需求,选择哪种方法取决于您的具体场景:
- 简单合并:使用PyPDF2或pypdf
- 需要选择页面:使用页面选择功能
- 处理大量文件:添加进度条
- 需要书签:使用outline_item参数
有任何具体问题或需要更多功能,欢迎继续询问!
标签: PDF合并