python 使用word转pdf遇到的问题

项目场景:

今天处理一个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()

这个是我电脑最终可运行的代码,不同电脑可能配置有差异,我电脑出现的问题如下。


问题描述:

  1. 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'
    
  2. 无效的类字符串
    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)
    
  3. 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
    

原因分析:

  1. No module named ‘win32com’
    这里提示没有win32com这个module,根据提示,我们很容易知道,这个问题的关键点就在win32com这个module上,所以我们只要添加好这个module就行了。

  2. 无效的类字符串
    报错出在Dispatch实例化的时候,根据错误提示,可知Dispatch里面的参数com接口是不对或不存在的,此时我们需要检查一下是否存在是否有该Com接口。

  3. raise AttributeError("%s.%s" % (self.username, attr))
    这里提示AttributeError: Open.SaveAs,可知是我们打开文件出现的问题,我们在此处需要做的就是检查下我们的文档是否被占用等等。


解决方案:

  1. No module named ‘win32com’
    这里我们直接添加pypiwin32接口:

    python -m pip install pypiwin32
    
  2. 无效的类字符串
    这里我的电脑microsoft office并没有安装,所以不能使用Word.Application,之后我使用我电脑的wps套件(wps.Application),依然失败,之后发现是金山WPS调用,抢先版的用KWPS,正式版WPS,所以最后改成(kwps.Application),此时并没有成功,还是报错,然后发现是注册表的问题,打开wps(首页->设置->配置和修复工具->高级->重置修复->重新注册主键)之后即可。

  3. raise AttributeError("%s.%s" % (self.username, attr))
    这个问题最后发现是文件被占用,直接任务管理器里禁用相关进程即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lhuann_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值