基于此处的脚本:.doc to pdf using python我有一个半工作脚本,可以将 .docx 文件从 C:\Export_to_pdf 导出到 pdf 到一个新文件夹中。
问题是它通过了前几个文件,然后失败了:
(-2147352567, 'Exception occurred.', (0, u'Microsoft Word', u'Command failed', u'wdmain11.chm', 36966, -2146824090), None)
这显然是一个无用的一般错误消息。如果我使用 pdb 慢慢调试它,我可以遍历所有文件并成功导出。如果我还密切关注 Windows 任务管理器中的进程,我可以看到 WINWORD 启动然后在它应该的时候结束,但是对于较大的文件,内存使用需要更长的时间才能稳定下来。这让我认为,当 WINWORD 在 client.Dispatch 对象上调用下一个方法之前没有时间初始化或退出时,脚本会出错。
win32com 或 comtypes 有没有办法识别并等待进程开始或完成?
我的脚本:
import os
from win32com import client
folder = "C:\\Export_to_pdf"
file_type = 'docx'
out_folder = folder + "\\PDF"
os.chdir(folder)
if not os.path.exists(out_folder):
print 'Creating output folder...'
os.makedirs(out_folder)
print out_folder, 'created.'
else:
print out_folder, 'already exists.\n'
for files in os.listdir("."):
if files.endswith(".docx"):
print files
print '\n\n'
try:
for files in os.listdir("."):
if files.endswith(".docx"):
out_name = files.replace(file_type, r"pdf")
in_file = os.path.abspath(folder + "\\" + files)
out_file = os.path.abspath(out_folder + "\\" + out_name)
word = client.Dispatch("Word.Application")
doc = word.Documents.Open(in_file)
print 'Exporting', out_file
doc.SaveAs(out_file, FileFormat=17)
doc.Close()
word.Quit()
except Exception, e:
print e
工作代码 - 只是用这个替换了 try 块。注意将 DispatchEx 语句移到 for 循环之外,并将 word.Quit() 移到 finally 语句以确保它关闭。
try:
word = client.DispatchEx("Word.Application")
for files in os.listdir("."):
if files.endswith(".docx") or files.endswith('doc'):
out_name = files.replace(file_type, r"pdf")
in_file = os.path.abspath(folder + "\\" + files)
out_file = os.path.abspath(out_folder + "\\" + out_name)
doc = word.Documents.Open(in_file)
print 'Exporting', out_file
doc.SaveAs(out_file, FileFormat=17)
doc.Close()
except Exception, e:
print e
finally:
word.Quit()