这里使用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))