75_Python自动化办公之Word与PDF
Python自动化办公Word文档与PDF处理实战文章目录Python自动化办公Word文档与PDF处理实战前言一、python-docx创建与编辑Word文档二、读取和修改现有Word文档三、实战批量生成Word合同四、PyPDF2PDF合并、拆分与提取五、提取PDF文本和元数据✅ 亮点总结适用场景扩展方向前言在日常办公中Word文档的生成与编辑、PDF文件的合并拆分提取是极其常见的需求。无论是自动生成合同、批量修改报告模板还是整理扫描件PDF手动操作都耗时耗力而且容易出错。Python的python-docx和PyPDF2库让我们能够以编程方式高效完成这些任务实现真正的一键自动化。本文将带你系统学习这两个库的核心用法从零基础到实战应用全覆盖。学习建议自动化办公的核心思路是模板 数据填充——先将文档的固定格式设计好Word模板再用Python程序动态填入变化的数据。这样的效率远高于每次都从零构建整个文档。对于追求高效率的开发者来说这是一项投入产出比极高的技能。一、python-docx创建与编辑Word文档python-docx是操作Office Open XML格式(.docx)的纯Python库。它不依赖Windows系统上的Word软件可以在任何平台的服务器上运行——这意味着你写的自动化脚本可以直接部署到Linux服务器上批量处理文档。pipinstallpython-docx安装注意python-docx处理的是.docx格式Office 2007之后的版本不支持老旧的.doc格式。如果需要处理.doc文件推荐使用textract库或先将.doc手动转换为.docx。理解对象模型Document文档 → Paragraph段落 → Run文本片段。Run是python-docx中最小的样式单元——同一个段落中如果前半部分是普通文字、后半部分需要加粗显示就必须把这两部分分别放到不同的Run中。这是初学者最容易混淆的概念也是面试中常被问到的知识点。以下代码演示了从创建文档到添加标题、段落、表格、图片的完整流程fromdocximportDocumentfromdocx.sharedimportInches,Pt,RGBColorfromdocx.enum.textimportWD_ALIGN_PARAGRAPH docDocument()# 添加标题doc.add_heading(项目计划书,level1)doc.add_heading(一、项目背景,level2)# 添加段落paragraphdoc.add_paragraph(这是一个关于Python自动化办公的)runparagraph.add_run(示例项目)run.boldTruerun.font.sizePt(14)run.font.color.rgbRGBColor(0x42,0x7C,0xC4)# 添加带样式的文本doc.add_paragraph(项目目标实现办公流程自动化,styleList Bullet)doc.add_paragraph(预计周期3个月,styleList Bullet)# 添加表格tabledoc.add_table(rows4,cols3,styleLight Grid Accent 1)headers[阶段,任务,负责人]fori,headerinenumerate(headers):table.rows[0].cells[i].textheader data[[需求分析,收集整理需求文档,张三],[开发实现,编码与单元测试,李四],[测试上线,集成测试与部署,王五],]fori,row_datainenumerate(data,1):forj,valueinenumerate(row_data):table.rows[i].cells[j].textvalue# 添加图片doc.add_picture(logo.png,widthInches(2.0))doc.save(项目计划书.docx)代码解读Document()创建一个空白文档对象这相当于Word软件中的新建空白文档。add_heading()添加标题level参数从0到9对应不同的标题层级。add_paragraph()返回一个Paragraph对象通过它的add_run()方法可以在段落后追加不同样式的文本。add_table(rows4, cols3)创建4行3列的表格——注意这里需要提前知道行列数后续可以通过表格对象的add_row()方法动态追加行。常见陷阱保存文档时如果目标文件已被其他程序如Word软件打开会抛出PermissionError。务必在保存前确保文件未被占用。另外图片路径建议使用绝对路径或者确保相对路径在运行脚本的工作目录下正确解析。二、读取和修改现有Word文档在实际工作中我们更多时候是在已有文档模板的基础上做修改而非从零创建。python-docx提供了完整的读取和遍历文档的能力fromdocximportDocument docDocument(项目计划书.docx)# 遍历所有段落forparaindoc.paragraphs:print(f[{para.style.name}]{para.text})# 读取表格fortableindoc.tables:forrowintable.rows:cells[cell.textforcellinrow.cells]print(\t.join(cells))# 修改内容并保存doc.paragraphs[1].text更新版项目背景doc.save(项目计划书_修订版.docx)遍历技巧doc.paragraphs返回文档中所有段落的列表包括标题、正文、空白段落等。需要注意的是表格中的文字不在doc.paragraphs中需要单独通过doc.tables遍历。这也是初学者查找内容时常踩的坑——明明看到表格中有文字遍历段落却找不到。实际应用修改模板文档时常见的做法是在模板中放入占位符如{{甲方}}、{{金额}}然后遍历所有段落和表格单元格用str.replace()替换占位符内容。这样模板的设计和数据的填充完全分离非技术人员也可以独立调整模板样式。三、实战批量生成Word合同这是自动化办公最经典的应用场景之一。假设你需要为几十甚至上百家合作方生成格式一致的合同手工操作不仅费时还容易遗漏或出错。下面的代码展示了如何用Python批量生成fromdocximportDocument contracts[{甲方:公司A,乙方:公司X,金额:50000},{甲方:公司B,乙方:公司Y,金额:80000},{甲方:公司C,乙方:公司Z,金额:120000},]forcontractincontracts:docDocument()doc.add_heading(合作协议,level1)doc.add_paragraph(f甲方{contract[甲方]})doc.add_paragraph(f乙方{contract[乙方]})doc.add_paragraph(f合同金额{contract[金额]:,}元)doc.add_paragraph(一、合作内容)doc.add_paragraph(双方本着互利共赢的原则就技术开发项目达成以下合作协议...)filenamef合同_{contract[甲方]}_{contract[乙方]}.docxdoc.save(filename)print(f已生成:{filename})性能建议当合同数量很大比如上千份时每份都Document()然后save()的开销不小。优化的思路有两个一是将模板作为文件复制后打开修改而不是每次从零创建二是使用多进程并行处理充分利用多核CPU。但在实际项目中数百份以内单进程足以在几秒到一两分钟内完成。实际痛点如果合同内容包含复杂的表格嵌套或特定排版纯用python-docx构建会比较吃力。此时更好的方案是先用Word设计好模板文件Python只负责打开模板、替换占位符、另存为新文件。这在面试中也经常被问到“如何高效地批量生成复杂格式的Word文档”四、PyPDF2PDF合并、拆分与提取与Word操作不同PDF是一种只读友好的格式——它主要用于分发和展示而非编辑。Python处理PDF的库主要分为创建PDF和操作现有PDF两类。PyPDF2属于后者专注于对已有PDF文件进行合并、拆分、旋转、元数据提取等操作。pipinstallPyPDF2库的选择Python的PDF库生态比较复杂。PyPDF2适合基础的合并拆分pdfplumber擅长提取表格数据reportlab用于从零创建PDFfpdf2同样用于创建PDF但API更简单。选择哪个库取决于你的具体需求不要用一个库做所有事。合并多个PDF文件fromPyPDF2importPdfMerger mergerPdfMerger()pdf_files[报告_第一部分.pdf,报告_第二部分.pdf,报告_第三部分.pdf]forpdfinpdf_files:merger.append(pdf)merger.write(合并后的完整报告.pdf)merger.close()print(PDF合并完成)关键细节merger.append()将PDF文件追加到合并列表中顺序决定了最终输出文件的页面顺序。merger.close()不能省略——它负责写入输出文件并释放资源。如果你忘记调用close()输出的PDF文件可能不完整或损坏这是最常见的bug之一。进阶用法merger.merge()方法可以在特定位置插入PDF页面。例如你要在一份100页报告的第5页后插入一页封面可以使用merger.merge(5, cover_pdf)实现精确的页面插入。拆分PDF提取指定页码范围fromPyPDF2importPdfReader,PdfWriter readerPdfReader(合并后的完整报告.pdf)total_pageslen(reader.pages)print(f文档共{total_pages}页)# 提取前5页另存为新文件writerPdfWriter()foriinrange(min(5,total_pages)):writer.add_page(reader.pages[i])withopen(前5页摘录.pdf,wb)asf:writer.write(f)# 按页码分组拆分forstartinrange(0,total_pages,10):writerPdfWriter()endmin(start10,total_pages)foriinrange(start,end):writer.add_page(reader.pages[i])withopen(f拆分_第{start1}-{end}页.pdf,wb)asf:writer.write(f)拆分场景实际工作中拆分PDF有两种意思——按页码范围拆分如代码所示和按内容拆分如按发票号码将合并的扫描PDF拆分为单张发票。后者需要借助OCR或文本提取单纯靠PyPDF2无法做到。内存注意reader.pages会将整个PDF的页面对象加载到内存中。对于数百页的大PDF内存消耗可以接受但如果处理数千页的巨型PDF建议考虑流式处理或分块读取。在实际项目中100页以内的PDF用PyPDF2完全没问题。五、提取PDF文本和元数据fromPyPDF2importPdfReader readerPdfReader(合并后的完整报告.pdf)# 提取元数据metareader.metadataprint(f标题:{meta.title})print(f作者:{meta.author})print(f页数:{len(reader.pages)})# 逐页提取文本fori,pageinenumerate(reader.pages):textpage.extract_text()print(f\n--- 第{i1}页 ---)print(text[:200])# 打印前200字符预览文本提取的局限extract_text()提取的文本质量取决于PDF本身的生成方式。如果PDF是从Word/文本转换而来的提取效果很好但如果是扫描件生成的图片型PDFextract_text()无法提取任何文字——此时需要使用OCR技术如Tesseract库配合PyPDF2将图片转换为可编辑文本。面试场景“如何批量提取大量PDF中的关键信息”——这道面试题考查的综合能力是先用PyPDF2遍历PDF页面提取文本再用正则表达式从文本中匹配日期、金额、合同号等关键字段最后汇总到Excel中。这是自动化办公中非常典型的ETL流程。python-docx的API设计直观通过段落、Run、表格等核心对象即可完成Word文档的创建与编辑PyPDF2则提供了PDF合并、拆分、文本提取等基础而实用的功能。两者结合可以实现文档自动化处理的完整闭环。实际工作中建议将模板文档预先设计好Python只负责填充数据和生成这样效率最高且输出质量最稳定。✅ 亮点总结python-docx的核心对象模型Document → Paragraph → Run层级清晰易于理解Word 模板填充通过占位符替换实现批量生成合同、报告、通知书PyPDF2的 PDF 合并、拆分、旋转、元数据提取覆盖日常 PDF 操作需求表格操作、图片插入、样式设置等进阶功能满足报告类文档的生成需求适用场景合同/协议批量生成用 Python 读取数据表自动填充 Word 模板生成数百份合同报告自动化从数据库提取数据生成带图表和分析文字的月报/年报 Word 文档PDF 文档管理合并扫描件、提取 PDF 中的文本用于全文检索、按页拆分导出扩展方向学习reportlab库用纯 Python 代码生成高质量的 PDF 文档无需 Word 模板探索pdfplumber库获得比 PyPDF2 更强大的 PDF 表格数据提取能力结合python-pptx库进一步实现 PowerPoint 演示文稿的自动化生成

相关新闻