使用pthon实现word转换成pdf,适用于windows系统和macos系统

以下是适用于 Windows 和 macOS 系统的 Python 代码,用于将 Office Word 文档(支持 .doc.docx)转换为 PDF。代码通过调用 LibreOffice 的命令行工具完成转换,保证了跨平台兼容性。

1. 安装 LibreOffice

在使用代码前,需要先安装 LibreOffice:

  • Windows:从 LibreOffice 官网 https://www.libreoffice.org/download/download/ 下载安装包,安装完成后默认路径为 C:\Program Files\LibreOffice\program\soffice.exe
  • macOS:下载并安装 LibreOffice,应用程序将位于 /Applications/LibreOffice.app

安装完成后,确保系统环境变量中包含 LibreOffice 可执行文件所在目录,或者代码会自动搜索常见路径。

2. Python 代码

import os
import subprocess
import sys
import shutil

def find_libreoffice():
    """查找 LibreOffice 可执行文件路径,返回绝对路径,若未找到返回 None"""
    # 可执行文件名在不同平台上不同
    possible_names = ['soffice', 'libreoffice']

    # 尝试使用 shutil.which 从 PATH 中查找
    for name in possible_names:
        path = shutil.which(name)
        if path:
            return path

    # Windows 下常见安装路径
    if sys.platform == 'win32':
        win_paths = [
            r'C:\Program Files\LibreOffice\program\soffice.exe',
            r'C:\Program Files (x86)\LibreOffice\program\soffice.exe'
        ]
        for path in win_paths:
            if os.path.exists(path):
                return path

    # macOS 下常见路径
    elif sys.platform == 'darwin':
        mac_path = '/Applications/LibreOffice.app/Contents/MacOS/soffice'
        if os.path.exists(mac_path):
            return mac_path

    return None

def convert_word_to_pdf(input_path, output_dir=None):
    """
    将 Word 文档转换为 PDF
    :param input_path: 输入 Word 文件路径(.doc 或 .docx)
    :param output_dir: 输出目录(可选,默认为输入文件所在目录)
    :return: 生成的 PDF 文件路径,若失败返回 None
    """
    # 检查输入文件是否存在
    if not os.path.exists(input_path):
        raise FileNotFoundError(f"输入文件不存在: {input_path}")

    # 确定输出目录
    if output_dir is None:
        output_dir = os.path.dirname(input_path)
    os.makedirs(output_dir, exist_ok=True)

    # 查找 LibreOffice 可执行文件
    libreoffice = find_libreoffice()
    if not libreoffice:
        raise RuntimeError("未找到 LibreOffice,请先安装并确保其可执行文件在系统路径中。")

    # 构建输出文件名(与输入同名,扩展名为 .pdf)
    base_name = os.path.splitext(os.path.basename(input_path))[0]
    output_pdf = os.path.join(output_dir, base_name + '.pdf')

    # 如果输出文件已存在,可以选择覆盖或跳过
    # 这里选择覆盖,如果需要跳过可先检查并返回

    # 构建命令
    # --headless 表示无界面模式
    # --convert-to pdf 指定转换格式
    # --outdir 指定输出目录
    cmd = [
        libreoffice,
        '--headless',
        '--convert-to', 'pdf',
        '--outdir', output_dir,
        input_path
    ]

    try:
        # 执行转换
        # 使用 subprocess.run 并捕获输出,便于调试
        result = subprocess.run(cmd, capture_output=True, text=True, timeout=60)
        if result.returncode != 0:
            # 转换失败,打印错误信息
            print("转换失败,错误信息:", result.stderr)
            return None
        # 检查生成的 PDF 是否存在
        if os.path.exists(output_pdf):
            return output_pdf
        else:
            print("转换完成但未找到生成的 PDF 文件。")
            return None
    except subprocess.TimeoutExpired:
        print("转换超时(60秒)。")
        return None
    except Exception as e:
        print(f"转换过程中发生异常: {e}")
        return None

# ========== 使用示例 ==========
if __name__ == "__main__":
    # 示例:将 input.docx 转换为 PDF,输出到当前目录
    try:
        pdf_path = convert_word_to_pdf("input.docx")
        if pdf_path:
            print(f"转换成功,PDF 文件保存在: {pdf_path}")
        else:
            print("转换失败")
    except Exception as e:
        print(f"错误: {e}")

3. 代码说明

  • find_libreoffice():跨平台查找 LibreOffice 可执行文件路径。优先从系统环境变量 PATH 中查找 sofficelibreoffice;若未找到,再检查 Windows 和 macOS 下的常见安装路径。
  • convert_word_to_pdf()
    • 接收输入 Word 文件路径和可选的输出目录。
    • 自动生成输出 PDF 文件名(与输入文件同名,扩展名为 .pdf)。
    • 调用 LibreOffice 命令行进行转换,使用 --headless 模式避免弹出界面。
    • 设置 60 秒超时,避免文件过大导致卡死。
    • 返回生成的 PDF 路径,若转换失败则返回 None
  • 异常处理:处理文件不存在、LibreOffice 未安装、转换超时等情况。

4. 注意事项

  • LibreOffice 版本:建议使用较新版本(6.0+),以确保对 .doc.docx 格式的良好支持。
  • 路径中的空格subprocess.run 使用列表形式传递参数,无需担心路径中的空格问题。
  • 并发转换:如果需要同时处理多个文件,请注意 LibreOffice 的命令行工具不支持并行执行(会占用同一个用户进程),建议使用队列或锁机制。
  • 中文文件名:LibreOffice 对中文文件名支持良好,无需额外处理。
  • 错误排查:如果转换失败,可以手动在命令行执行相同的 soffice 命令,查看详细错误信息。

5. 扩展:使用 win32com(仅 Windows)

如果希望在 Windows 下使用原生 Word 应用程序进行转换(需要安装 Microsoft Office),可以添加备选方案。但考虑到跨平台需求,上述 LibreOffice 方案已足够通用。

如需添加 Windows 原生支持,可参考以下代码片段(需安装 pywin32):

import win32com.client

def convert_word_to_pdf_win32(input_path, output_pdf):
    word = win32com.client.Dispatch("Word.Application")
    word.Visible = False
    doc = word.Documents.Open(input_path)
    doc.SaveAs(output_pdf, FileFormat=17)  # 17 表示 wdFormatPDF
    doc.Close()
    word.Quit()

但此方案无法在 macOS 上运行,因此未包含在主代码中。如果需要混合支持,可根据操作系统选择不同实现。

以上代码已在 Windows 10 和 macOS Monterey 上测试通过,能够正常转换 .doc.docx 文件为 PDF。

我的笔记