Pywin32 save .docx as pdf

11,421

Solution 1

There are a couple of nice libraries to handle this task:

There is also an example of doing exactly this in this ActiveState Recipe Convert Microsoft Word files to PDF with DOCXtoPDF


If you insist on using Windows API(s) there is also an example of doing this via win32com in this recipe Convert doc and docx files to pdf


You could also do this using comtypes (Thanks to .doc to pdf using python)

Example:

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()

Solution 2

Looks like the "Office 2013" is the bottleneck.

I have the same issue while using Word 2013 ("Office 2013"),
but when I try to run your code snippet with "Office 365" and "Office 2010", it works.

I can recommend two solutions for now:

  • try out different MS Office versions (365 and 2010 tested)
  • use some online API-s to convert it to PDF

Note:
Changing the module/library won't fix the issue,
only the right Office version will.

Share:
11,421
RenShan
Author by

RenShan

Updated on July 26, 2022

Comments

  • RenShan
    RenShan almost 2 years

    I'm using Word 2013 to automatically create a report as a docx and then save it as a pdf format.

    But when I call the function SaveAs2(), the script pop out the "save as" windows and throws this exception :

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

    Here is my code to open and to save as a new file:

    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)
    

    And I'm using : python2.7 with pywin32 (build 219)

    Does someone had an idea why it doesn't work?

  • RenShan
    RenShan almost 9 years
    Hi James and thanks for your answer and your suggestion! I have tried your examples with comtypes and ActiveState but unfortunately, it creates the same trouble as above during the save part. As for python-docx, it doesn’t allow to save it as an pdf [document]( github.com/python-openxml/python-docx/issues/113) and all the other library doesn’t seem to take the docx header.
  • Mau
    Mau over 3 years
    James, the python-docx library is great (already using it) but cannot be used to generate the PDF. You need a "renderer" to be able to do that.