Python Word 转 PDF 和 PDF 转 Word 指南

在文档处理中,Word 和 PDF 是两种最常见的格式,用途却截然不同:Word 便于编辑排版,PDF 适合分发和打印。日常工作中经常需要在两者之间转换------把合同、报告从 Word 导成 PDF 发给客户,或者把收到的 PDF 转回 Word 以便二次修改。手动逐个处理很耗时,尤其是面对几十上百份文件时。

用 Python 可以批量完成这类转换,一次脚本即可处理整个文件夹。本文以 Spire.Doc for Python 和 Spire.PDF for Python 为例,介绍 Word 转 PDF、PDF 转 Word 两个方向的基本流程,以及转换过程中的一些常用参数。

环境准备

按需安装对应的库。只做 Word 转 PDF 时安装 Spire.Doc:

bash 复制代码
pip install Spire.Doc

只做 PDF 转 Word 时安装 Spire.PDF:

bash 复制代码
pip install Spire.PDF

两个方向都要做,就同时安装:

bash 复制代码
pip install Spire.Doc Spire.PDF

在脚本中分别引入各自的模块。Word 端使用 Document 对象,PDF 端使用 PdfDocument 对象。

将 Word 文档转换为 PDF

Word 转 PDF 是最常见的需求之一,比如把可编辑的文稿固化成不可篡改的最终版。Spire.Doc 的做法很直接:加载 Word 文档,再保存为 PDF 格式。

python 复制代码
from spire.doc import *
from spire.doc.common import *

# 加载 Word 文档
document = Document()
document.LoadFromFile("年度报告.docx")

# 保存为 PDF
document.SaveToFile("年度报告.pdf", FileFormat.PDF)
document.Close()

SaveToFile() 的第一个参数是输出文件路径,第二个参数指定输出格式。这里传入 FileFormat.PDF,库会完成从 Word 到 PDF 的格式转换,包括分页、字体和图片等布局信息的还原。

如果源文件是旧版的 .doc 格式,加载时显式指定格式会更稳妥:

python 复制代码
document.LoadFromFile("旧版文档.doc", FileFormat.Doc)

使用参数控制转换效果

直接保存通常就能得到不错的结果,但有些场景需要对输出做精细控制。这时可以借助 ToPdfParameterList 参数对象。

在 PDF 中保留书签

长文档转成 PDF 后,如果希望阅读者能像看目录一样快速跳转,可以按文档标题自动生成书签:

python 复制代码
from spire.doc import *
from spire.doc.common import *

document = Document()
document.LoadFromFile("操作手册.docx")

# 创建转换参数
params = ToPdfParameterList()
# 基于文档标题生成书签
params.CreateWordBookmarks = True
params.CreateWordBookmarksUsingHeadings = True

document.SaveToFile("操作手册.pdf", params)
document.Close()

CreateWordBookmarksUsingHeadingsTrue 时,书签从文档中的标题样式自动生成;设为 False 则只使用文档中显式存在的 Word 书签。

嵌入字体,保证显示一致

转换后的 PDF 在其他机器上打开时,如果目标机器没有安装文档所用的字体,文字可能被替换,导致排版错乱。把字体嵌入到 PDF 可以避免这个问题:

python 复制代码
document = Document()
document.LoadFromFile("宣传单.docx")

params = ToPdfParameterList()
# 将所有字体嵌入 PDF
params.IsEmbeddedAllFonts = True

document.SaveToFile("宣传单.pdf", params)
document.Close()

代价是文件体积会变大,适合对排版一致性要求较高的正式文档。

给生成的 PDF 设置密码

如果 PDF 只允许指定人员查看,可以在转换时直接加密:

python 复制代码
from spire.doc.common import *

document = Document()
document.LoadFromFile("商业计划书.docx")

params = ToPdfParameterList()
params.PdfSecurity.Encrypt(
    "owner123",
    "user123",
    PdfPermissionsFlags.Default,
    PdfEncryptionKeySize.Key128Bit
)

document.SaveToFile("商业计划书.pdf", params)
document.Close()

PdfSecurity.Encrypt() 的前两个参数分别是所有者密码和用户密码:所有者密码拥有最高权限(可更改权限),用户密码是打开文件需要的密码。

将 PDF 文档转换为 Word

反向转换也很常见:PDF 内容需要修改、引用或重新排版时,转回 Word 是最方便的方式。使用 Spire.PDF 的 PdfDocument 对象,加载 PDF 后直接保存为 Word 格式。

python 复制代码
from spire.pdf import *
from spire.pdf.common import *

# 加载 PDF 文档
pdf = PdfDocument()
pdf.LoadFromFile("客户需求.pdf")

# 保存为 .docx
pdf.SaveToFile("客户需求.docx", FileFormat.DOCX)
pdf.Close()

FileFormat.DOCX 对应较新的 Word 格式。如果接收方需要使用旧版 Word,也可以换成 FileFormat.DOC 输出 .doc 文件:

python 复制代码
pdf.SaveToFile("客户需求.doc", FileFormat.DOC)

需要说明的是,PDF 本身并不保存段落、表格这类语义信息,转回 Word 后得到的是一份可编辑的文本版式。PDF 中原本是图片的内容,转换后仍是图片,不会自动变成可编辑文字。所以这类转换适合"需要编辑文本"的场景,而不适合"需要编辑图片内容"的场景。

设置转换后 Word 文档的属性

转出的 Word 文档会继承一些基础属性,也可以通过 PdfToDocConverter 提前指定,例如标题、作者、主题等文档属性:

python 复制代码
from spire.pdf import *
from spire.pdf.common import *

# 创建转换器并指定输入 PDF
converter = PdfToDocConverter("调研报告.pdf")
# 设置输出文档的属性
converter.DocxOptions.Title = "调研报告"
converter.DocxOptions.Authors = "市场部"
converter.DocxOptions.Subject = "Q3 用户调研"

# 转换为 .docx
converter.SaveToDocx("调研报告.docx")

DocxOptions 上可以设置标题、作者、主题、类别等多个字段,适合在批量导出时统一为文档补全元数据。

实用提示

  • 批量转换时,用 os.listdir() 遍历目录,对每个文件循环调用 LoadFromFile()SaveToFile(),即可一次处理整个文件夹。
  • Word 转 PDF 的字体问题最常出现在中文文档上,优先使用 IsEmbeddedAllFontsSetCustomFontsFolders() 指定字体目录。
  • 若源 PDF 是扫描件(整页都是图片),转出的 Word 无法直接编辑文字,需要先做 OCR 识别。
  • 转换完成后及时调用 Close() 释放文件句柄,避免占用文件导致后续写入失败。

总结

本文介绍了用 Python 在 Word 和 PDF 之间互相转换的完整流程:Spire.Doc 负责 Word 转 PDF,核心方法是 SaveToFile() 配合 FileFormat.PDF,并可借助 ToPdfParameterList 控制书签、字体嵌入和加密;Spire.PDF 负责 PDF 转 Word,通过 FileFormat.DOCXPdfToDocConverter 完成转换并设置文档属性。两个方向都支持批量处理,掌握这些方法后,可以把繁琐的格式转换工作交给脚本自动完成。

相关推荐
用户8356290780511 小时前
如何使用 Python 加密和保护 Word 文档
后端·python
Fluxproxy1 小时前
AI数据集采集、批量模型推理报错频发?AI项目网络稳定性优化实战
python·ai·ai编程
他们叫我秃子2 小时前
前端开发转 Go 全栈(五):终于遇到熟人了,Go 的闭包和高阶函数原来这么像 JavaScript
前端·后端·go
SomeB1oody2 小时前
【RustyML入门】2.6. 线性判别分析
开发语言·后端·机器学习·rust·教程
妙码生花2 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(五十七):AI时代对组件封装的新理解、agInput 统一入口,动态表单预备
前端·后端·go
Yao8062 小时前
SpringAI + Ollama + DeepSeek + RAG 搭建 AI 航线规划系统
后端
大勇前进2 小时前
SQL Server 分页查询多种写法对比:哪种性能最高?
后端
妙码生花2 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(五十六):附件管理、增加根据文件后缀生成 SVG 文件图标的接口
前端·后端·go
Fanta丶2 小时前
10.Python class类的定义和魔术方法
python