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节:综合实战:周报一键生成(待发布)
相关推荐
cvcode_study4 小时前
Ollama+ComfyUI 多模态
大数据·人工智能·python
Bode_20024 小时前
决策设计方法
人工智能·交互·智能工厂
AI砖家5 小时前
Kimi K3 本地部署全解析:需要什么配置的电脑,到底要花多少钱?
人工智能·ai编程
H0311169855 小时前
教学设计PPT模板平台选用参考
人工智能
众壹新能源科技5 小时前
功率预测误差考核怎么降?从气象源到上报口径的排查清单
运维·人工智能·自动化
这张生成的图像能检测吗5 小时前
(论文速读)SubspaceAD:用 PCA 子空间做 Training-Free Few-Shot 异常检测
人工智能·机器学习·pca·异常检测·少样本学习
QT界面美化性能优化5 小时前
QT+AI:使用AI技术为QT应用程序赋能
c++·人工智能·qt·opencv·qt教程·qt6.3
LadiesAndGentlemen5 小时前
开源地理空间智能项目中的本体思想 4-4:收尾篇——五种做法怎么选,治理之后还剩什么活
人工智能·语言模型·开源·aigc·知识图谱
四方云5 小时前
把电话能力无缝嵌入企业自有CRM
大数据·人工智能
STQY燊桐启元(深圳)电子科技6 小时前
医疗精密电源散热方案:相变陶瓷片保障医疗设备长效稳定低干扰
大数据·网络·人工智能