Word/PDF 文档处理:模板填充与格式转换

合同模板、证明模板、报告模板...每次都要手动改内容?这一节讲如何用 Python 自动填充 Word 模板、读取 PDF 内容、批量转换格式。让文档处理像填表一样简单。


1. Word 文档自动化

python-docx 库

安装:

bash 复制代码
pip install python-docx

读取 Word

python 复制代码
from docx import Document

doc = Document("合同.docx")

# 读取所有段落
for para in doc.paragraphs:
    print(para.text)

# 读取表格
for table in doc.tables:
    for row in table.rows:
        for cell in row.cells:
            print(cell.text)

写入 Word

python 复制代码
from docx import Document
from docx.shared import Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH

doc = Document()

# 添加标题
doc.add_heading("测试文档", 0)

# 添加段落
p = doc.add_paragraph("这是第一段")
p.add_run("这是加粗").bold = True

# 添加表格
table = doc.add_table(rows=2, cols=3)
table.style = "Light Grid Accent 1"

# 填充表格数据
data = [("姓名", "年龄", "部门"), ("张三", "28", "技术部")]
for i, row_data in enumerate(data):
    row = table.rows[i]
    for j, cell_data in enumerate(row_data):
        row.cells[j].text = cell_data

# 保存
doc.save("输出.docx")

2. 模板填充

基础模板替换

python 复制代码
from docx import Document

# 准备数据
data = {
    "name": "张三",
    "id": "2024001",
    "date": "2024年1月15日",
    "amount": "壹万元整"
}

# 加载模板
doc = Document("合同模板.docx")

# 替换占位符
for para in doc.paragraphs:
    for key, value in data.items():
        if f"{{{key}}}" in para.text:
            para.text = para.text.replace(f"{{{key}}}", value)

# 处理表格中的占位符
for table in doc.tables:
    for row in table.rows:
        for cell in row.cells:
            for key, value in data.items():
                if f"{{{key}}}" in cell.text:
                    cell.text = cell.text.replace(f"{{{key}}}", value)

doc.save(f"合同_{data['name']}.docx")

批量生成

python 复制代码
from docx import Document
import pandas as pd

# 读取员工名单
df = pd.read_excel("员工名单.xlsx")

# 加载模板
template = Document("合同模板.docx")

# 批量生成
for _, row in df.iterrows():
    doc = Document()
    # 复制模板内容到新文档
    for para in template.paragraphs:
        doc.add_paragraph(para.text)

    # 替换数据
    for para in doc.paragraphs:
        para.text = para.text.replace("{name}", str(row["姓名"]))
        para.text = para.text.replace("{id}", str(row["工号"]))

    # 保存
    doc.save(f"合同_{row['姓名']}.docx")

print(f"已生成 {len(df)} 份合同")

3. PDF 处理

PDF 读取

安装:

bash 复制代码
pip install pypdf
python 复制代码
from pypdf import PdfReader

reader = PdfReader("报告.pdf")

# 读取所有页面
for i, page in enumerate(reader.pages):
    text = page.extract_text()
    print(f"--- 第{i+1}页 ---")
    print(text[:500])  # 只打印前500字符

PDF 写入

安装:

bash 复制代码
pip install reportlab
python 复制代码
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas

c = canvas.Canvas("报告.pdf", pagesize=A4)
c.drawString(100, 800, "Hello PDF!")
c.save()

Word 转 PDF

需要安装 Word 应用(Windows):

python 复制代码
import win32com.client
import os

def word_to_pdf(word_path, pdf_path):
    word = win32com.client.Dispatch("Word.Application")
    word.Visible = False

    doc = word.Documents.Open(os.path.abspath(word_path))
    doc.SaveAs(os.path.abspath(pdf_path), 17)  # 17 = PDF format
    doc.Close()
    word.Quit()

word_to_pdf("合同.docx", "合同.pdf")

4. 格式转换

Excel 转 Word 报告

python 复制代码
import pandas as pd
from docx import Document
from docx.shared import Inches

# 读取数据
df = pd.read_excel("销售数据.xlsx")

# 创建 Word 文档
doc = Document()
doc.add_heading("销售报告", 0)

# 添加文字
doc.add_paragraph(f"生成时间: 2024年1月15日")
doc.add_paragraph(f"总计销售额: {df['销售额'].sum():,.2f} 元")

# 添加表格
table = doc.add_table(rows=1, cols=3)
table.style = "Light Grid Accent 1"

# 表头
header_cells = table.rows[0].cells
header_cells[0].text = "产品"
header_cells[1].text = "销量"
header_cells[2].text = "销售额"

# 数据行
for _, row in df.iterrows():
    row_cells = table.add_row().cells
    row_cells[0].text = str(row["产品"])
    row_cells[1].text = str(row["销量"])
    row_cells[2].text = str(row["销售额"])

doc.save("销售报告.docx")

多格式批量转换

python 复制代码
import os
from pathlib import Path

input_dir = Path("待转换")
output_dir = Path("已转换")
output_dir.mkdir(exist_ok=True)

for file in input_dir.glob("*.docx"):
    # 转 PDF
    pdf_path = output_dir / f"{file.stem}.pdf"
    word_to_pdf(str(file), str(pdf_path))

    # 转 HTML
    html_path = output_dir / f"{file.stem}.html"
    # 使用 mammoth 库
    import mammoth
    with open(file, "rb") as docx:
        result = mammoth.convert_to_html(docx)
        with open(html_path, "wb") as html:
            html.write(result.value.encode())

print("转换完成!")

5. 实战:批量生成证明

python 复制代码
from docx import Document
from docx.shared import Pt, RGBColor
import pandas as pd

# 读取员工数据
df = pd.read_excel("员工信息.xlsx")

# 模板内容
template_text = """
在职证明

兹证明 {name}(身份证号:{id})为我公司员工,
于 {join_date} 入职,现担任 {position} 一职。

特此证明。

公司名称:北京科技有限公司
日期:{date}
"""

for _, row in df.iterrows():
    # 替换占位符
    content = template_text.format(
        name=row["姓名"],
        id=row["身份证号"],
        join_date=row["入职日期"],
        position=row["职位"],
        date="2024年1月"
    )

    # 创建文档
    doc = Document()
    doc.add_paragraph(content)

    # 设置格式
    for para in doc.paragraphs:
        para.paragraph_format.line_spacing = 1.5

    # 保存
    doc.save(f"证明_{row['姓名']}.docx")

print(f"已生成 {len(df)} 份证明")

6. 注意事项

问题 解决方案
Word 模板占位符不生效 确认占位符格式,如 {name}
批量生成速度慢 使用 python-docx 更快,win32com 较慢
PDF 中文乱码 使用支持中文的字体
转换后格式丢失 检查转换库的兼容性

小结

学会的 要点
Word 读取 python-docx 读取段落和表格
Word 写入 添加标题、段落、表格
模板填充 批量替换占位符
PDF 读取 pypdf 提取文字
格式转换 Word↔PDF、Word↔HTML

下节预告

第3节:数据分析与可视化------数据清洗、图表生成、自动报告


📺 系列文章: 智能办公自动化

  • 第1节:Excel 自动化(已发布)
  • 第2节:Word/PDF 文档处理(本文)
  • 第3节:数据分析与可视化(待发布)
  • 第4节:邮件与消息自动化(待发布)
  • 第5节:综合实战:周报一键生成(待发布)
相关推荐
IvanCodes3 小时前
RAG 实战教程(一):RAG 工作原理与完整流程——分片、索引、召回、重排和生成
人工智能·后端·agent
今天AI了吗3 小时前
合规场景下的 AI 推理可解释性:Attention 可视化与推理路径追踪的工程实践
人工智能
周末程序猿4 小时前
浅析大模型推理十二篇之KV Cache
人工智能
鱼樱前端4 小时前
用 AI 做内容变收入
前端·人工智能·ai编程
Dawson Zhu4 小时前
基于Palantir Foundry构建半导体制造AI友好型数据中台:从良率分析场景谈起
人工智能·语言模型·架构·制造·agi
fthux5 小时前
装闭 RenoPit 源码解析(04):装修图纸和合同文件上传处理流程
人工智能·ai·开源·github·open source·renopit
weixin_446260856 小时前
从被动镜像到主动智能体:面向网络物理人工智能的整体论数字孪生(HDT-Net)
网络·人工智能
秋枫要学习6 小时前
你的鼠标,正在被 AI 抢走
人工智能·计算机外设
满怀冰雪7 小时前
19-图像数据处理:PaddleVision Transform 实战
人工智能·深度学习·计算机视觉·paddle