Search code examples
pythonpdfconverterspowerpointcomtypes

Error using comtypes.client to convert a .pptx file into .pdf


I'm trying to convert a .pptx file to a pdf file. So far I got:

PP_FORMAT_PDF = 32

def _convert_powerpoint2pdf(input_path, output_path):
    try:
        import comtypes
        import comtypes.client
    except ImportError as error:
        raise 
    else:
        powerpoint = slides = None
        try:
            comtypes.CoInitialize()
            powerpoint = comtypes.client.CreateObject('Powerpoint.Application')
            slides = powerpoint.Presentations.Open(input_path)
            slides.SaveAs(output_path, FileFormat=PP_FORMAT_PDF)
        except WindowsError as error:
            raise
        except comtypes.COMError as error:
            raise IOError(error)
        finally:
            slides and slides.Close()
            powerpoint and powerpoint.Quit()
            comtypes.CoUninitialize()

Error:

Traceback (most recent call last):
  File "C:/Users/Mathias/git/pdfconv/tests\test_converter.py", line 89, in test_convert_presentation2pdf_pptx
    pdfconv.converter.convert_presentation2pdf(input_path, output_path)
  File "c:\users\mathias\git\pdfconv\pdfconv\converter.py", line 116, in convert_presentation2pdf
    _convert_powerpoint2pdf(input_path, output_path)
  File "c:\users\mathias\git\pdfconv\pdfconv\converter.py", line 179, in _convert_powerpoint2pdf
    slides.SaveAs(output_path, FileFormat=PP_FORMAT_PDF)
_ctypes.COMError: (-2147467259, 'Unbekannter Fehler', (u'Presentation (unknown member) : PowerPoint kann ^0 auf ^1 nicht speichern.', u'Microsoft PowerPoint 2013', u'', 0, None))

Almost the same code works perfectly fine for Word and Excel. Has anyone an idea what I am doing wrong?


Solution

  • Consider this solution as detailed here: How to convert a .pptx to .pdf using Python.

    The solution from the above resource (which worked for me today) is:

    import comtypes.client
    
    def PPTtoPDF(inputFileName, outputFileName, formatType = 32):
        powerpoint = comtypes.client.CreateObject("Powerpoint.Application")
        powerpoint.Visible = 1
    
        if outputFileName[-3:] != 'pdf':
            outputFileName = outputFileName + ".pdf"
        deck = powerpoint.Presentations.Open(inputFileName)
        deck.SaveAs(outputFileName, formatType) # formatType = 32 for ppt to pdf
        deck.Close()
        powerpoint.Quit()