python 批量word文档转pdf

本文探讨了如何使用win32com库在Windows环境下避免Word文档批量转换时的并发冲突,提供了三种改进方法,包括显式关闭Word应用、延时操作和使用DispatchEx。详细讲解了问题出现的原因及相应的解决方案。
摘要由CSDN通过智能技术生成

这里使用win32com库来实现word文档转pdf

只进行一次word文档转pdf

若路径下只有一个word文件需要转换,可以用以下方法:

from win32com.client import Dispatch
from os import walk
import win32com


def doc2pdf(input_file):
    word = win32com.client.Dispatch('Word.Application')
    doc = word.Documents.Open(input_file)
    if file.endswith(".doc"):     # word文件后缀名有.doc和.docx
        doc.SaveAs(input_file.replace(".doc", ".pdf"), FileFormat=17)
    elif file.endswith(".docx"):
        doc.SaveAs(input_file.replace(".docx", ".pdf"), FileFormat=17)
    doc.Close()
    word.Quit()


if __name__ == "__main__":
    doc_files = []
    directory = "C:\\Users\\86151\\Documents\\0_work document\\test"  # 绝对路径
    for root, dirs, filenames in walk(directory):
        for file in filenames:
            if file.endswith(".doc") or file.endswith(".docx"):
                doc2pdf(str(root + "\\" + file))

批量word文档转换成pdf

若路径下不止一个word文档,也就是需要进行连续批量转换时,继续使用上述方法往往会转换失败。这是为什么呢?
我们来分析一下,doc2pdf()转换函数的思路其实很简单,首先用程序打开word软件,接着用这个软件去打开word文件,进行转换后,关闭文件,关闭软件。代码的思路是没有问题的,但是我们得考虑到,计算机内部进程调度和资源分配的问题。我们可以注意到,main函数中调用doc2pdf()转换函数是用一个for循环,通过不断循环去遍历文件转换文件,而计算机处理进程的速度是相当快的,有可能在一次进程结束准备关闭软件的时候,计算机觉得自己资源又够了,已经开始着手准备下一个进程,想要打开这个软件,这样就产生矛盾了,一头想关闭,同时另一头又想打开,因此在进行第二次转换的时候,自然是打开不了软件的。
会报以下错误:
pywintypes.com_error: (-2147417848, ‘被调用的对象已与其客户端断开连接。’, None, None)
或者 AttributeError: <unknown>.Open
具体解决方法链接

实现批量转换方法1

from win32com.client import Dispatch
from os import walk
import win32com


word = win32com.client.Dispatch('Word.Application')
def doc2pdf(input_file):
    doc = word.Documents.Open(input_file)
    if file.endswith(".doc"):     # word文件后缀名有.doc和.docx
        doc.SaveAs(input_file.replace(".doc", ".pdf"), FileFormat=17)
    elif file.endswith(".docx"):
        doc.SaveAs(input_file.replace(".docx", ".pdf"), FileFormat=17)
    doc.Close()
    

if __name__ == "__main__":
    directory = "C:\\Users\\86151\\Documents\\0_work document\\test"  # 绝对路径
    for root, dirs, filenames in walk(directory):
        for file in filenames:
            if file.endswith(".doc") or file.endswith(".docx"):
                doc2pdf(str(root + "\\" + file))
    word.Quit()

实现批量转换方法2

from win32com.client import Dispatch
from os import walk
import win32com
import time


def doc2pdf(input_file):
    word = win32com.client.Dispatch('Word.Application')
    doc = word.Documents.Open(input_file)
    if file.endswith(".doc"):     # word文件后缀名有.doc和.docx
        doc.SaveAs(input_file.replace(".doc", ".pdf"), FileFormat=17)
    elif file.endswith(".docx"):
        doc.SaveAs(input_file.replace(".docx", ".pdf"), FileFormat=17)
    doc.Close()
    word.Quit()
    time.sleep(5)


if __name__ == "__main__":
    directory = "C:\\Users\\86151\\Documents\\0_work document\\test"  # 绝对路径
    for root, dirs, filenames in walk(directory):
        for file in filenames:
            if file.endswith(".doc") or file.endswith(".docx"):
                doc2pdf(str(root + "\\" + file))

实现批量转换方法3

from win32com.client import Dispatch
from os import walk
import win32com


def doc2pdf(input_file):
    word = win32com.client.DispatchEx('Word.Application')
    doc = word.Documents.Open(input_file)
    if file.endswith(".doc"):     # word文件后缀名有.doc和.docx
        doc.SaveAs(input_file.replace(".doc", ".pdf"), FileFormat=17)
    elif file.endswith(".docx"):
        doc.SaveAs(input_file.replace(".docx", ".pdf"), FileFormat=17)
    doc.Close()
    word.Quit()


if __name__ == "__main__":
    directory = "C:\\Users\\86151\\Documents\\0_work document\\test"  # 绝对路径
    for root, dirs, filenames in walk(directory):
        for file in filenames:
            if file.endswith(".doc") or file.endswith(".docx"):
                doc2pdf(str(root + "\\" + file))
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值