Python办公自动化:5分钟搞定PDF批量提取首页并合并(附完整代码)

Python办公自动化:5分钟搞定PDF批量提取首页并合并(附完整代码) Python办公自动化5分钟搞定PDF批量提取首页并合并附完整代码在信息爆炸的时代PDF文档已成为办公场景中最常见的文件格式之一。无论是学术论文、商业合同还是项目报告我们经常需要从大量PDF中快速提取关键页面进行汇总。传统手动操作不仅耗时费力还容易出错。本文将介绍如何用Python实现PDF首页的批量提取与合并让繁琐的文档处理工作变得轻松高效。1. 准备工作与环境配置在开始自动化处理之前我们需要确保Python环境已正确配置。推荐使用Python 3.6及以上版本以获得最佳的库兼容性。首先安装必要的依赖库pip install pypdf2PyPDF2是Python中处理PDF文件的利器它提供了丰富的功能读取PDF文件内容提取特定页面合并多个PDF文件加密/解密PDF文档提示如果工作中经常需要处理PDF文件建议同时安装pdfplumber库pip install pdfplumber它特别适合提取PDF中的表格和文本内容。2. 批量提取PDF首页的两种方案根据实际需求我们提供两种不同的解决方案满足不同场景下的使用需求。2.1 方案一保留单独首页并合并这种方案适合需要同时保留每个PDF的单独首页和合并版本的场景比如学术论文管理或合同归档。from PyPDF2 import PdfReader, PdfWriter, PdfMerger import os # 设置工作目录替换为你的PDF文件夹路径 pdf_folder D:/工作文档/季度报告 os.chdir(pdf_folder) # 创建保存首页的文件夹 if not os.path.exists(../FirstPages): os.mkdir(../FirstPages) # 提取每个PDF的首页并单独保存 for filename in os.listdir(): if filename.endswith(.pdf): try: reader PdfReader(filename) writer PdfWriter() writer.add_page(reader.pages[0]) output_path f../FirstPages/firstpage_{filename} with open(output_path, wb) as f: writer.write(f) except Exception as e: print(f处理文件 {filename} 时出错: {str(e)}) # 合并所有首页为一个PDF merger PdfMerger() for pdf_file in os.listdir(../FirstPages): if pdf_file.endswith(.pdf): merger.append(f../FirstPages/{pdf_file}) merger.write(../FirstPages/merged_first_pages.pdf) merger.close()代码亮点解析使用try-except块增强代码健壮性避免单个文件出错导致程序中断输出文件名添加firstpage_前缀便于识别显式调用close()方法释放资源2.2 方案二直接合并首页如果只需要最终的合并文件不需要保留单独的首页PDF可以采用这种更高效的方案。from PyPDF2 import PdfReader, PdfWriter import os # 设置工作目录 pdf_folder D:/工作文档/客户合同 os.chdir(pdf_folder) # 创建输出文件夹 output_dir ../MergedFirstPages if not os.path.exists(output_dir): os.mkdir(output_dir) # 直接收集所有首页并合并 writer PdfWriter() processed_files 0 for filename in os.listdir(): if filename.endswith(.pdf): try: reader PdfReader(filename) writer.add_page(reader.pages[0]) processed_files 1 except Exception as e: print(f跳过文件 {filename}: {str(e)}) # 保存合并后的PDF output_path f{output_dir}/all_first_pages.pdf with open(output_path, wb) as f: writer.write(f) print(f成功处理 {processed_files} 个PDF文件)性能优化建议对于超大PDF文件100MB可添加strictFalse参数PdfReader(filename, strictFalse)处理完成后打印统计信息方便确认操作结果3. 高级应用与技巧掌握了基础操作后我们可以进一步优化脚本使其更加智能和实用。3.1 按文件名排序合并默认情况下合并顺序取决于操作系统返回的文件列表顺序。如果需要按特定顺序合并可以添加排序逻辑# 在合并前对文件列表进行排序 pdf_files [f for f in os.listdir() if f.endswith(.pdf)] pdf_files.sort() # 按文件名排序 # 也可以自定义排序规则 pdf_files.sort(keylambda x: int(x.split(_)[1].split(.)[0])) # 按文件名中的数字排序3.2 添加页码和目录合并后的PDF可以添加页码和简单目录提升可读性from reportlab.pdfgen import canvas from io import BytesIO from PyPDF2 import PdfReader def add_page_number(pdf_path): packet BytesIO() can canvas.Canvas(packet) # 读取原始PDF获取页数 reader PdfReader(pdf_path) total_pages len(reader.pages) # 为每页添加页码 for page_num in range(total_pages): can.drawString(550, 30, fPage {page_num1}/{total_pages}) can.showPage() can.save() packet.seek(0) return PdfReader(packet) # 使用示例 original_pdf PdfReader(merged.pdf) numbered_pdf add_page_number(merged.pdf) writer PdfWriter() for page in original_pdf.pages: writer.add_page(page) writer.add_page(numbered_pdf.pages[0]) # 添加页码层 with open(merged_with_numbers.pdf, wb) as f: writer.write(f)3.3 处理加密PDF如果PDF有密码保护可以在读取时提供密码reader PdfReader(encrypted.pdf, passwordyourpassword)注意此方法仅适用于已知密码的情况不适用于破解加密PDF。4. 常见问题与解决方案在实际应用中可能会遇到各种问题。以下是几个典型场景的解决方法。4.1 文件编码问题当文件名包含非ASCII字符时可能会出现编码错误。解决方案for filename in os.listdir(): try: # 尝试正常处理 reader PdfReader(filename) except UnicodeEncodeError: # 处理特殊字符文件名 encoded_name filename.encode(utf-8).decode(latin-1) reader PdfReader(encoded_name)4.2 大文件处理优化处理大型PDF文件时内存管理尤为重要# 使用with语句确保资源释放 with open(large.pdf, rb) as f: reader PdfReader(f) first_page reader.pages[0] writer PdfWriter() writer.add_page(first_page) with open(first_page.pdf, wb) as out_f: writer.write(out_f)4.3 跨平台路径处理不同操作系统使用不同的路径分隔符使用os.path模块可以保证兼容性import os # 不推荐 path folder/subfolder/file.pdf # 推荐 path os.path.join(folder, subfolder, file.pdf)5. 扩展应用场景掌握了PDF首页提取技术后可以将其应用于更多办公自动化场景。5.1 自动生成文档摘要结合文本提取技术可以从首页提取关键信息生成摘要import re from PyPDF2 import PdfReader def extract_summary(pdf_path): reader PdfReader(pdf_path) first_page reader.pages[0] text first_page.extract_text() # 提取标题假设标题是第一行 title text.split(\n)[0] # 提取关键词简单实现 words re.findall(r\b[A-Z][a-z]\b, text) keywords list(set(words))[:5] return { title: title, keywords: keywords, page_count: len(reader.pages) }5.2 批量重命名PDF文件根据首页内容自动重命名文件for filename in os.listdir(): if filename.endswith(.pdf): info extract_summary(filename) new_name f{info[title]}.pdf os.rename(filename, new_name[:50]) # 限制文件名长度5.3 与邮件系统集成自动将处理结果通过邮件发送import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.application import MIMEApplication def send_email_with_pdf(to_email, pdf_path): msg MIMEMultipart() msg[Subject] PDF处理结果 msg[From] your_emailexample.com msg[To] to_email # 添加正文 body 您好\n\n附件是处理后的PDF文件。\n\n此致 msg.attach(MIMEText(body, plain)) # 添加PDF附件 with open(pdf_path, rb) as f: attach MIMEApplication(f.read(), _subtypepdf) attach.add_header(Content-Disposition, attachment, filenameos.path.basename(pdf_path)) msg.attach(attach) # 发送邮件 with smtplib.SMTP(smtp.example.com, 587) as server: server.starttls() server.login(username, password) server.send_message(msg)在实际项目中我发现将PDF处理脚本与Windows任务计划或Mac的launchd结合可以实现完全自动化的定期文档处理流程。例如设置每周五下午自动扫描特定文件夹处理新增的PDF文件并将结果发送给相关人员。这种自动化方案特别适合需要定期处理大量文档的行政、法务和学术研究岗位。