How to convert a .pptx to .pdf using Python
Question:
I have been looking to convert a .pptx file to a .pdf file through a Python script for several hours but nothing seems to be working.
What I have tried: I have tried 1) this script which calls windows32.client, and 2) unoconv, but none of them seem to be working for me.
Problems encountered: Using script from first option throws up an error (com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2147024894), None)
), whereas in second option Python can’t seem to recognize unoconv
even after installing it using pip.
I also saw some recommended Pandoc, but I can’t understand how to use it for Python.
Versions I am using: Python 2.7.9, Windows 8.1
Answers:
I found the answer with the help of this post and the answer from this question.
Note that comtypes
is only available for Windows. Other platforms will not support this.
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()
unoconv is a great tool to perform this task and it is indeed build in python.
Regarding your problem, it might be related to a recurring problem with the way the python interpreter is set in the main unoconv file after it has been installed.
To run it with python3 interpreter, replace #!/usr/bin/env python
with #!/usr/bin/env python3
or #!/usr/bin/python3
in unoconv file (/usr/bin/unoconv
).
one liner:
sudo sed -i -e '1s:#!/usr/bin/env python$:#!/usr/bin/env python3:' /usr/bin/unoconv
You could also symlink /usr/bin/unoconv
to /usr/local/bin/unoconv
.
I was working with this solution but I needed to search all .pptx, .ppt, and then turn them all to .pdf (python 3.7.5). Hope it works…
import os
import win32com.client
ppttoPDF = 32
for root, dirs, files in os.walk(r'your directory here'):
for f in files:
if f.endswith(".pptx"):
try:
print(f)
in_file=os.path.join(root,f)
powerpoint = win32com.client.Dispatch("Powerpoint.Application")
deck = powerpoint.Presentations.Open(in_file)
deck.SaveAs(os.path.join(root,f[:-5]), ppttoPDF) # formatType = 32 for ppt to pdf
deck.Close()
powerpoint.Quit()
print('done')
os.remove(os.path.join(root,f))
pass
except:
print('could not open')
# os.remove(os.path.join(root,f))
elif f.endswith(".ppt"):
try:
print(f)
in_file=os.path.join(root,f)
powerpoint = win32com.client.Dispatch("Powerpoint.Application")
deck = powerpoint.Presentations.Open(in_file)
deck.SaveAs(os.path.join(root,f[:-4]), ppttoPDF) # formatType = 32 for ppt to pdf
deck.Close()
powerpoint.Quit()
print('done')
os.remove(os.path.join(root,f))
pass
except:
print('could not open')
# os.remove(os.path.join(root,f))
else:
pass
The try and except was for those documents I couldn’t read and won’t exit the code until the last document. And I would recommend doing each type of format aside: first .pptx and then .ppt (or viceversa).
I believe the answer has to be updated because because comtypes
doesn’t work anymore.
So this is the code which works (updated version of the accepted answer) :
import win32com.client
def PPTtoPDF(inputFileName, outputFileName, formatType = 32):
powerpoint = win32com.client.DispatchEx("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()
Have a look at the following snippet. It uses unoconv and it’s working ex expected on UBUNTU 20.04.
# requirements
# sudo apt install unoconv
# pip install tqdm
# pip install glob
import glob
import tqdm
path = "<INPUT FOLDER>"
extension = "pptx"
files = [f for f in glob.glob(path + "/**/*.{}".format(extension), recursive=True)]
for f in tqdm.tqdm(files):
command = "unoconv -f pdf "{}"".format(f)
os.system(command)
This snippet can be used for different-2 format conversion.
I need a way to save PPTX file to PDF and PDF with notes. Here is my solution
from comtypes.client import CreateObject, Constants
def PPTtoPDF(inputFileName, outputFileName, formatType = 32):
powerpoint = CreateObject('Powerpoint.Application')
constants = Constants(powerpoint)
powerpoint.Visible = 1
if outputFileName[-3:] != 'pdf':
outputFileName = outputFileName + ".pdf"
deck = powerpoint.Presentations.Open(inputFileName)
deck.SaveAs(outputFileName, constants.PpSaveAsPDF)
deck.Close()
powerpoint.Quit()
def PPTtoPDFNote(inputFileName, outputFileName, formatType = 32):
powerpoint = CreateObject('Powerpoint.Application')
constants = Constants(powerpoint)
powerpoint.Visible = 1
if outputFileName[-3:] != 'pdf':
outputFileName = outputFileName + ".pdf"
deck = powerpoint.Presentations.Open(inputFileName)
deck.ExportAsFixedFormat(
outputFileName,
constants.ppFixedFormatTypePDF,
constants.ppFixedFormatIntentPrint,
False, # No frame
constants.ppPrintHandoutHorizontalFirst,
constants.ppPrintOutputNotesPages,
constants.ppPrintAll
)
deck.Close()
powerpoint.Quit()
To use it,
PPTtoPDF ('.\Test.pptx', '.Test.pdf' )
PPTtoPDFNote('.\Test.pptx', '.Test_with_Note.pdf')
Note: It is always the best to do it using Windows platform, i.e., using comtypes
so that it could always support new format and features in Microsoft Powerpoint.
For converting .pptx/.docx to pdf on google cloud function, I referred to this github repo https://github.com/zdenulo/gcp-docx2pdf/tree/master/cloud_function, they are using google drive api’s.
In this repo they have used mime type of docx to convert .docx file to .pdf file over google drive, you can use other mime types as well, like mime type of pptx(referring: https://developers.google.com/drive/api/v3/mime-types) to convert files over google drive.
Rest all code is same as mentioned in the github repo.
try this code it works with me
import os
import win32com.client as win32
import comtypes
#make sure to initial cometypes
comtypes.CoInitialize()
# Path to input PowerPoint document
input_path = 'path/to/input/document.pptx'
# Path to output PDF file
output_path = 'path/to/output/document.pdf'
# Open PowerPoint document and convert to PDF
powerpoint = win32.Dispatch('Powerpoint.Application')
presentation = powerpoint.Presentations.Open(input_path)
presentation.SaveAs(output_path , 32)
presentation.Close()
powerpoint.Quit()
I have been looking to convert a .pptx file to a .pdf file through a Python script for several hours but nothing seems to be working.
What I have tried: I have tried 1) this script which calls windows32.client, and 2) unoconv, but none of them seem to be working for me.
Problems encountered: Using script from first option throws up an error (com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2147024894), None)
), whereas in second option Python can’t seem to recognize unoconv
even after installing it using pip.
I also saw some recommended Pandoc, but I can’t understand how to use it for Python.
Versions I am using: Python 2.7.9, Windows 8.1
I found the answer with the help of this post and the answer from this question.
Note that comtypes
is only available for Windows. Other platforms will not support this.
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()
unoconv is a great tool to perform this task and it is indeed build in python.
Regarding your problem, it might be related to a recurring problem with the way the python interpreter is set in the main unoconv file after it has been installed.
To run it with python3 interpreter, replace #!/usr/bin/env python
with #!/usr/bin/env python3
or #!/usr/bin/python3
in unoconv file (/usr/bin/unoconv
).
one liner:
sudo sed -i -e '1s:#!/usr/bin/env python$:#!/usr/bin/env python3:' /usr/bin/unoconv
You could also symlink /usr/bin/unoconv
to /usr/local/bin/unoconv
.
I was working with this solution but I needed to search all .pptx, .ppt, and then turn them all to .pdf (python 3.7.5). Hope it works…
import os
import win32com.client
ppttoPDF = 32
for root, dirs, files in os.walk(r'your directory here'):
for f in files:
if f.endswith(".pptx"):
try:
print(f)
in_file=os.path.join(root,f)
powerpoint = win32com.client.Dispatch("Powerpoint.Application")
deck = powerpoint.Presentations.Open(in_file)
deck.SaveAs(os.path.join(root,f[:-5]), ppttoPDF) # formatType = 32 for ppt to pdf
deck.Close()
powerpoint.Quit()
print('done')
os.remove(os.path.join(root,f))
pass
except:
print('could not open')
# os.remove(os.path.join(root,f))
elif f.endswith(".ppt"):
try:
print(f)
in_file=os.path.join(root,f)
powerpoint = win32com.client.Dispatch("Powerpoint.Application")
deck = powerpoint.Presentations.Open(in_file)
deck.SaveAs(os.path.join(root,f[:-4]), ppttoPDF) # formatType = 32 for ppt to pdf
deck.Close()
powerpoint.Quit()
print('done')
os.remove(os.path.join(root,f))
pass
except:
print('could not open')
# os.remove(os.path.join(root,f))
else:
pass
The try and except was for those documents I couldn’t read and won’t exit the code until the last document. And I would recommend doing each type of format aside: first .pptx and then .ppt (or viceversa).
I believe the answer has to be updated because because comtypes
doesn’t work anymore.
So this is the code which works (updated version of the accepted answer) :
import win32com.client
def PPTtoPDF(inputFileName, outputFileName, formatType = 32):
powerpoint = win32com.client.DispatchEx("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()
Have a look at the following snippet. It uses unoconv and it’s working ex expected on UBUNTU 20.04.
# requirements
# sudo apt install unoconv
# pip install tqdm
# pip install glob
import glob
import tqdm
path = "<INPUT FOLDER>"
extension = "pptx"
files = [f for f in glob.glob(path + "/**/*.{}".format(extension), recursive=True)]
for f in tqdm.tqdm(files):
command = "unoconv -f pdf "{}"".format(f)
os.system(command)
This snippet can be used for different-2 format conversion.
I need a way to save PPTX file to PDF and PDF with notes. Here is my solution
from comtypes.client import CreateObject, Constants
def PPTtoPDF(inputFileName, outputFileName, formatType = 32):
powerpoint = CreateObject('Powerpoint.Application')
constants = Constants(powerpoint)
powerpoint.Visible = 1
if outputFileName[-3:] != 'pdf':
outputFileName = outputFileName + ".pdf"
deck = powerpoint.Presentations.Open(inputFileName)
deck.SaveAs(outputFileName, constants.PpSaveAsPDF)
deck.Close()
powerpoint.Quit()
def PPTtoPDFNote(inputFileName, outputFileName, formatType = 32):
powerpoint = CreateObject('Powerpoint.Application')
constants = Constants(powerpoint)
powerpoint.Visible = 1
if outputFileName[-3:] != 'pdf':
outputFileName = outputFileName + ".pdf"
deck = powerpoint.Presentations.Open(inputFileName)
deck.ExportAsFixedFormat(
outputFileName,
constants.ppFixedFormatTypePDF,
constants.ppFixedFormatIntentPrint,
False, # No frame
constants.ppPrintHandoutHorizontalFirst,
constants.ppPrintOutputNotesPages,
constants.ppPrintAll
)
deck.Close()
powerpoint.Quit()
To use it,
PPTtoPDF ('.\Test.pptx', '.Test.pdf' )
PPTtoPDFNote('.\Test.pptx', '.Test_with_Note.pdf')
Note: It is always the best to do it using Windows platform, i.e., using comtypes
so that it could always support new format and features in Microsoft Powerpoint.
For converting .pptx/.docx to pdf on google cloud function, I referred to this github repo https://github.com/zdenulo/gcp-docx2pdf/tree/master/cloud_function, they are using google drive api’s.
In this repo they have used mime type of docx to convert .docx file to .pdf file over google drive, you can use other mime types as well, like mime type of pptx(referring: https://developers.google.com/drive/api/v3/mime-types) to convert files over google drive.
Rest all code is same as mentioned in the github repo.
try this code it works with me
import os
import win32com.client as win32
import comtypes
#make sure to initial cometypes
comtypes.CoInitialize()
# Path to input PowerPoint document
input_path = 'path/to/input/document.pptx'
# Path to output PDF file
output_path = 'path/to/output/document.pdf'
# Open PowerPoint document and convert to PDF
powerpoint = win32.Dispatch('Powerpoint.Application')
presentation = powerpoint.Presentations.Open(input_path)
presentation.SaveAs(output_path , 32)
presentation.Close()
powerpoint.Quit()