ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Python办公16:PDF 强力缝合——将几十个 PDF 合并为单个文档并添加页码

2026/8/27 19:36:43 拓冰建站 浏览量
Python办公16:PDF 强力缝合——将几十个 PDF 合并为单个文档并添加页码 16PDF 强力缝合——将几十个 PDF 合并为单个文档并添加页码第三阶段PDF 与图片处理16-22场景引入年终汇报需要将 15 份部门报告PDF 格式合并成一个总文件并且添加统一的页码。手动操作需要打开每个 PDF复制页面粘贴到总文件——不仅慢而且可能丢失格式。本节教你用 Python 一行代码完成合并还能自动添加页码。技术原理使用PyPDF2或pypdf库操作 PDF多个 PDF 文件 ↓ PdfMerger 逐个追加 ↓ 添加页码可选 ↓ 输出合并后的单个 PDF合并方式方式说明适用场景简单拼接按文件顺序追加章节报告合并指定顺序按列表顺序合并按部门/日期排序插入页码在每页底部添加页码正式文档添加书签在每个文件开始处添加书签方便跳转环境准备pipinstallpypdf reportlabpypdfPDF 合并核心库PyPDF2 的继任者reportlab用于添加页码水印完整代码importosfrompathlibimportPathfrompypdfimportPdfReader,PdfWriter,PdfMerger# 方案 1简单合并 defmerge_pdfs_simple(pdf_files,output_file合并结果.pdf): 将多个 PDF 文件按顺序合并为一个 参数: pdf_files: PDF 文件路径列表 output_file: 输出文件名 mergerPdfMerger()forpdf_fileinpdf_files:ifos.path.exists(pdf_file):merger.append(pdf_file)print(f已添加:{os.path.basename(pdf_file)})else:print(f[跳过] 文件不存在:{pdf_file})merger.write(output_file)merger.close()print(f\n合并完成:{output_file})# 方案 2带书签的合并 defmerge_pdfs_with_bookmarks(pdf_files,output_file合并结果_带书签.pdf): 合并 PDF 并添加书签每个文件一个书签 mergerPdfMerger()forpdf_fileinpdf_files:ifnotos.path.exists(pdf_file):continuebookmark_namePath(pdf_file).stem merger.append(pdf_file)# 获取此文件在合并文件中的起始页码total_pagessum(PdfReader(f).get_num_pages()forfinpdf_files[:pdf_files.index(pdf_file)1]ifos.path.exists(f))start_pagetotal_pages-PdfReader(pdf_file).get_num_pages()# 添加书签merger.add_outline_item(bookmark_name,start_page)print(f已添加书签:{bookmark_name}(第{start_page1}页))merger.write(output_file)merger.close()print(f\n合并完成:{output_file})# 方案 3批量合并文件夹中的所有 PDF defmerge_folder_pdfs(folder_path,output_file合并结果.pdf,sorted_byname): 自动合并文件夹中的所有 PDF 参数: folder_path: PDF 文件所在文件夹 output_file: 输出文件名 sorted_by: 排序方式 name(文件名) / date(修改日期) folderPath(folder_path)pdf_filessorted(folder.glob(*.pdf),keylambdaf:f.stat().st_mtimeifsorted_bydateelsef.name)ifnotpdf_files:print(f文件夹{folder_path}中没有 PDF 文件)returnprint(f找到{len(pdf_files)}个 PDF 文件:)forfinpdf_files:print(f -{f.name})merge_pdfs_with_bookmarks([str(f)forfinpdf_files],output_file)# 方案 4添加页码 defadd_page_numbers(input_pdf,output_file带页码版本.pdf): 为 PDF 添加页码每页底部居中 fromreportlab.lib.pagesizesimportA4fromreportlab.pdfgenimportcanvasimportio readerPdfReader(input_pdf)writerPdfWriter()total_pageslen(reader.pages)fori,pageinenumerate(reader.pages):# 创建页码水印packetio.BytesIO()ccanvas.Canvas(packet,pagesizeA4)width,heightA4# 绘制页码c.setFont(Helvetica,9)page_numberf-{i1}-text_widthc.stringWidth(page_number,Helvetica,9)c.drawString((width-text_width)/2,30,page_number)c.save()packet.seek(0)# 叠加水印到原页面watermarkPdfReader(packet)page.merge_page(watermark.pages[0])writer.add_page(page)withopen(output_file,wb)asf:writer.write(f)print(f页码已添加:{output_file})# 使用示例 if__name____main__:# 方案 1手动指定文件列表# pdf_files [# 第1章.pdf,# 第2章.pdf,# 第3章.pdf,# ]# merge_pdfs_simple(pdf_files, 完整手册.pdf)# 方案 2批量合并文件夹merge_folder_pdfs(rD:\部门报告,output_file年度总报告.pdf,sorted_byname)# 方案 3添加页码# add_page_numbers(年度总报告.pdf, 年度总报告_带页码.pdf)常见问题Q1合并后中文显示为乱码reportlab默认不支持中文。需要使用中文字体fromreportlab.pdfbaseimportpdfmetricsfromreportlab.pdfbase.ttfontsimportTTFont pdfmetrics.registerFont(TTFont(SimSun,C:/Windows/Fonts/simsun.ttc))c.setFont(SimSun,9)Q2合并后文件很大PDF 中可能包含大量内嵌字体和图片。可以尝试压缩pipinstallpypdfpypdf 在合并时不会重复嵌入相同字体文件体积通常比预期小。Q3加密的 PDF 无法合并需要先解密readerPdfReader(encrypted.pdf)ifreader.is_encrypted:reader.decrypt(password)总结功能核心类/函数说明合并PdfMerger()追加多个 PDF书签add_outline_item()添加跳转标记页码reportlabmerge_page()底部叠加页码水印排序sorted(glob(), key...)按名称或日期排序本节掌握了 PDF 批量合并与页码添加的技能。下一节预告17PDF 暴力拆分——按页数或指定范围提取 PDF 核心页面