项目场景:
今天处理一个word转pdf文档的功能,代码倒是很简单,不过简单的代码还是遇到了很多问题,这里记录一下。
最终代码
from win32com.client import Dispatch
from os import walk
wdFormatPDF = 17
if __name__ == "__main__":
doc_files = []
word_dir = r"D:\project\word"
pdf_dir = r"D:\project\pdf"
# 根据自己电脑安装配置
word = Dispatch('kwps.Application')
for root, dirs, files in walk(word_dir):
print(files)
for file in files:
if file.endswith(".doc") or file.endswith(".docx"):
print(file)
# doc2pdf(str(root + "\\" + file),str(directory2 + "\\" + file))
input_file = str(root + "\\" + file)
output_file = str(pdf_dir + "\\" + file)
doc = word.Documents.Open(input_file)
doc.SaveAs(output_file.replace(
".doc", ".pdf"), FileFormat=wdFormatPDF)
doc.Close()
word.Quit()
这个是我电脑最终可运行的代码,不同电脑可能配置有差异,我电脑出现的问题如下。
问题描述:
- No module named ‘win32com’
在
时出现如下错误:from win32com.client import Dispatch
Traceback (most recent call last): File "D:\project\python\word_to_pdf.py", line 1, in <module> from win32com.client import Dispatch ModuleNotFoundError: No module named 'win32com'
- 无效的类字符串
在
时出现如下错误:word = Dispatch('Word.Application')
Traceback (most recent call last): File "D:\Anaconda\lib\site-packages\win32com\client\dynamic.py", line 89, in _GetGoodDispatch IDispatch = pythoncom.connect(IDispatch) pywintypes.com_error: (-2147221005, '无效的类字符串', None, None) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "c:\webapps\python\tf_ks_01\lh\word_to_pdf.py", line 12, in <module> word = Dispatch('wps.Application') File "D:\Anaconda\lib\site-packages\win32com\client\__init__.py", line 95, in Dispatch dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx) File "D:\Anaconda\lib\site-packages\win32com\client\dynamic.py", line 114, in _GetGoodDispatchAndUserName return (_GetGoodDispatch(IDispatch, clsctx), userName) File "D:\Anaconda\lib\site-packages\win32com\client\dynamic.py", line 91, in _GetGoodDispatch IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch) pywintypes.com_error: (-2147221005, '无效的类字符串', None, None)
- raise AttributeError("%s.%s" % (self.username, attr))
在
时出现如下错误:doc.SaveAs(output_file.replace(".doc", ".pdf"), FileFormat=wdFormatPDF)
Traceback (most recent call last): File "c:\webapps\python\tf_ks_01\lh\word_to_pdf.py", line 24, in <module> doc.SaveAs(output_file.replace( File "D:\Anaconda\lib\site-packages\win32com\client\dynamic.py", line 527, in __getattr__ raise AttributeError("%s.%s" % (self._username_, attr)) AttributeError: Open.SaveAs
原因分析:
-
No module named ‘win32com’
这里提示没有win32com这个module,根据提示,我们很容易知道,这个问题的关键点就在win32com这个module上,所以我们只要添加好这个module就行了。 -
无效的类字符串
报错出在Dispatch实例化的时候,根据错误提示,可知Dispatch里面的参数com接口是不对或不存在的,此时我们需要检查一下是否存在是否有该Com接口。 -
raise AttributeError("%s.%s" % (self.username, attr))
这里提示AttributeError: Open.SaveAs,可知是我们打开文件出现的问题,我们在此处需要做的就是检查下我们的文档是否被占用等等。
解决方案:
-
No module named ‘win32com’
这里我们直接添加pypiwin32接口:python -m pip install pypiwin32
-
无效的类字符串
这里我的电脑microsoft office并没有安装,所以不能使用Word.Application,之后我使用我电脑的wps套件(wps.Application),依然失败,之后发现是金山WPS调用,抢先版的用KWPS,正式版WPS,所以最后改成(kwps.Application),此时并没有成功,还是报错,然后发现是注册表的问题,打开wps(首页->设置->配置和修复工具->高级->重置修复->重新注册主键)之后即可。 -
raise AttributeError("%s.%s" % (self.username, attr))
这个问题最后发现是文件被占用,直接任务管理器里禁用相关进程即可。