如何批量为多份PDF添加文件名书签并完成合并?
批量合并PDF并添加文件名作为对应书签的实现方法
你不需要单独为每个PDF添加书签后再合并,直接在合并流程中就能完成书签添加,这样更高效且无需生成中间文件。以下是优化后的代码:
import os from PyPDF2 import PdfFileMerger, PdfFileReader # 设置存放PDF的文件夹路径 pdf_dir = r'C:\your_pdf_directory' # 替换为你的PDF文件夹路径 output_path = './merged_result.pdf' # 初始化合并器 merger = PdfFileMerger() current_page = 0 # 遍历文件夹中的PDF文件(可按文件名排序保证顺序) for filename in sorted(os.listdir(pdf_dir)): if filename.lower().endswith('.pdf'): pdf_path = os.path.join(pdf_dir, filename) # 获取不带后缀的文件名作为书签名称 bookmark_name = os.path.splitext(filename)[0] # 读取PDF并添加到合并器 reader = PdfFileReader(pdf_path) merger.append(reader) # 添加书签,指向当前PDF的第一页 merger.addBookmark(bookmark_name, current_page) # 更新当前页码,用于下一个书签的定位 current_page += reader.getNumPages() # 保存合并后的PDF with open(output_path, 'wb') as output_file: merger.write(output_file) print(f"合并完成,结果已保存至 {output_path}")
关键说明:
- 直接合并+书签:利用
PdfFileMerger的append方法添加PDF,同时通过addBookmark在对应起始页码插入书签,省去单独处理每个PDF的步骤。 - 页码跟踪:通过
current_page变量记录每一份PDF的起始页码,确保书签定位准确。 - 排序处理:用
sorted()对文件名排序,保证合并顺序符合预期(可根据需求调整排序逻辑)。 - 过滤PDF:通过
endswith('.pdf')只处理PDF文件,避免文件夹中其他文件干扰。
替代方案(按你原思路:先批量加书签再合并)
如果你坚持先给每个PDF单独添加书签再合并,也可以遍历文件夹批量处理单个PDF:
import os from PyPDF2 import PdfFileReader, PdfFileWriter pdf_dir = r'C:\your_pdf_directory' processed_dir = './processed_pdfs' # 创建处理后的PDF存放文件夹 os.makedirs(processed_dir, exist_ok=True) for filename in os.listdir(pdf_dir): if filename.lower().endswith('.pdf'): pdf_path = os.path.join(pdf_dir, filename) bookmark_name = os.path.splitext(filename)[0] reader = PdfFileReader(pdf_path) writer = PdfFileWriter() # 添加所有页面 for page_num in range(reader.getNumPages()): writer.addPage(reader.getPage(page_num)) # 添加书签 writer.addBookmark(bookmark_name, 0) # 保存处理后的PDF output_path = os.path.join(processed_dir, f"processed_{filename}") with open(output_path, 'wb') as output_file: writer.write(output_file) print("所有PDF已添加书签,存放在processed_pdfs文件夹中") # 后续合并processed_dir中的PDF即可(你已实现合并功能,此处省略)
内容的提问来源于stack exchange,提问作者user20242302
相关产品推荐
相关产品推荐

