Pywin32如何将.docx文件保存为pdf?

9

我正在使用Word 2013自动创建一个报告文件并将其保存为pdf格式。

但是,当我调用SaveAs2()函数时,脚本弹出“另存为”窗口,并抛出以下异常:

(-2147352567, 'Exception occurred.', (0, u'Microsoft Word', u'Command failed', u'wdmain11.chm', 36966, -2146824090), None)

这是我的代码,用于打开并另存为一个新文件:

self.path = os.path.abspath(path)

self.wordApp = win32.Dispatch('Word.Application')  #create a word application object
self.wordApp.Visible = False  # if false hide the word application (app does't open but still usable)

self.document = self.wordApp.Documents.Open(self.path + "/" + documentRef)  # opening the template file



absFileName = "D:\\test.pdf"
        self.document.SaveAs2(FileName=absFileName,FileFormat=17)

我正在使用:

Python2.7和pywin32 (build 219)

有没有人知道为什么它无法工作?


为什么不使用reportlab创建报告呢?这样所有的内容都在Python中,您就不必担心这些转换问题了。 - Mike Driscoll
3个回答

5
有几个不错的库可以处理这个任务:

此外,还有一个在ActiveState Recipe中完成这个的例子:使用DOCXtoPDF将Microsoft Word文件转换为PDF


如果您坚持要使用Windows API,则还有一个通过win32com完成此操作的示例,在此处将doc和docx文件转换为pdf


您也可以使用comtypes完成此操作(感谢.doc to pdf using python

示例:

import os
import sys


import comtypes.client


wdFormatPDF = 17


def covx_to_pdf(infile, outfile):
    """Convert a Word .docx to PDF"""

    word = comtypes.client.CreateObject('Word.Application')
    doc = word.Documents.Open(infile)
    doc.SaveAs(outfile, FileFormat=wdFormatPDF)
    doc.Close()
    word.Quit()

2
嗨,詹姆斯,感谢您的回答和建议!我已经尝试了您使用comtypes和ActiveState的示例,但不幸的是,在保存部分时它会产生与上述相同的问题。 至于python-docx,它不允许将其保存为pdf文档,而所有其他库似乎都无法获取docx头。 - RenShan
James,python-docx库非常棒(我已经在使用它了),但无法用于生成PDF。你需要一个“渲染器”才能实现这一点。 - Mau

1
看起来“Office 2013”是瓶颈。
我在使用Word 2013(“Office 2013”)时遇到了相同的问题,但是当我尝试在“Office 365”和“Office 2010”中运行您的代码片段时,它可以正常工作。
我现在可以推荐两个解决方案:
- 尝试不同的MS Office版本(已测试365和2010) - 使用一些在线API将其转换为PDF
注意: 更改模块/库无法解决此问题, 只有正确的Office版本才能解决问题。

0

使用这个,不要忘记像这样安装win32:

pip install pywin32

将文档转换为PDF的函数如下:

import win32com.client as win32  
def convert_to_pdf(doc):
    """Convert given word document to pdf"""
    word = win32.DispatchEx("Word.Application")
    new_name = doc.replace(".docx", r".pdf")
    worddoc = word.Documents.Open(doc)
    worddoc.SaveAs(new_name, FileFormat=17)
    worddoc.Close()
    return None

path_to_word_document = os.path.join(os.getcwd(), 'report_1.docx')
convert_to_pdf(path_to_word_document)

给我我的星星,我真的需要它 :-) 要了解更多,请查阅图书馆中的文档 https://pypi.org/project/pywin32/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接