如何使用 Python 将 .pptx 转换为 .pdf
How to convert a .pptx to .pdf using Python
几个小时以来,我一直在寻找通过 Python 脚本将 .pptx 文件转换为 .pdf 文件的方法,但似乎没有任何效果。
我试过的方法:我试过 1) this script which calls windows32.client, and 2) unoconv,但其中 none 似乎对我有用。
遇到的问题: 使用第一个选项中的脚本会引发错误 (com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2147024894), None)
),而在第二个选项中 Python 似乎无法识别unoconv
即使在使用 pip 安装之后。
我也看到了一些推荐的Pandoc,但是我不明白Python如何使用它。
我使用的版本: Python 2.7.9,Windows 8.1
我在 this post and the answer from this question 的帮助下找到了答案。
请注意,comtypes
仅适用于 Windows。其他平台不支持。
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 是执行此任务的绝佳工具,它确实内置于 python 中。
关于您的问题,这可能与 python 解释器在安装后在主 unoconv 文件中设置的方式反复出现的问题有关。
用python3解释器运行它,在unoconv文件(/usr/bin/unoconv
)中用#!/usr/bin/env python3
或#!/usr/bin/python3
替换#!/usr/bin/env python
。
一个班轮:
sudo sed -i -e '1s:#!/usr/bin/env python$:#!/usr/bin/env python3:' /usr/bin/unoconv
您还可以将 /usr/bin/unoconv
符号链接到 /usr/local/bin/unoconv
。
我正在使用此解决方案,但我需要搜索所有 .pptx、.ppt,然后将它们全部转换为 .pdf (python 3.7.5)。希望有用...
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
try and except 是针对那些我无法阅读的文档,直到最后一个文档才会退出代码。我建议将每种格式放在一边:首先是 .pptx,然后是 .ppt(反之亦然)。
我认为必须更新答案,因为 comtypes
不再有效。
所以这是有效的代码(已接受答案的更新版本):
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()
看看下面的片段。它使用 unoconv 并且在 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)
此代码段可用于 different-2 格式转换。
我需要一种将 PPTX 文件保存为 PDF 和带注释的 PDF 的方法。这是我的解决方案
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()
要使用它,
PPTtoPDF ('.\Test.pptx', '.\Test.pdf' )
PPTtoPDFNote('.\Test.pptx', '.\Test_with_Note.pdf')
注意:始终最好使用 Windows 平台,即使用 comtypes
以便它始终支持 Microsoft Powerpoint 中的新格式和功能。
为了在 google 云函数上将 .pptx/.docx 转换为 pdf,我参考了这个 github 存储库 https://github.com/zdenulo/gcp-docx2pdf/tree/master/cloud_function,他们使用 google 驱动器 api的。
在这个 repo 中,他们使用 mime 类型的 docx 将 .docx 文件转换为 .pdf 文件,通过 google 驱动器,您也可以使用其他 mime 类型,如 mime 类型的 pptx(参考:https://developers.google.com/drive/api/v3/mime-types)转换 google 驱动器上的文件。
其余所有代码与 github 存储库中提到的相同。
几个小时以来,我一直在寻找通过 Python 脚本将 .pptx 文件转换为 .pdf 文件的方法,但似乎没有任何效果。
我试过的方法:我试过 1) this script which calls windows32.client, and 2) unoconv,但其中 none 似乎对我有用。
遇到的问题: 使用第一个选项中的脚本会引发错误 (com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2147024894), None)
),而在第二个选项中 Python 似乎无法识别unoconv
即使在使用 pip 安装之后。
我也看到了一些推荐的Pandoc,但是我不明白Python如何使用它。
我使用的版本: Python 2.7.9,Windows 8.1
我在 this post and the answer from this question 的帮助下找到了答案。
请注意,comtypes
仅适用于 Windows。其他平台不支持。
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 是执行此任务的绝佳工具,它确实内置于 python 中。 关于您的问题,这可能与 python 解释器在安装后在主 unoconv 文件中设置的方式反复出现的问题有关。
用python3解释器运行它,在unoconv文件(/usr/bin/unoconv
)中用#!/usr/bin/env python3
或#!/usr/bin/python3
替换#!/usr/bin/env python
。
一个班轮:
sudo sed -i -e '1s:#!/usr/bin/env python$:#!/usr/bin/env python3:' /usr/bin/unoconv
您还可以将 /usr/bin/unoconv
符号链接到 /usr/local/bin/unoconv
。
我正在使用此解决方案,但我需要搜索所有 .pptx、.ppt,然后将它们全部转换为 .pdf (python 3.7.5)。希望有用...
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
try and except 是针对那些我无法阅读的文档,直到最后一个文档才会退出代码。我建议将每种格式放在一边:首先是 .pptx,然后是 .ppt(反之亦然)。
我认为必须更新答案,因为 comtypes
不再有效。
所以这是有效的代码(已接受答案的更新版本):
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()
看看下面的片段。它使用 unoconv 并且在 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)
此代码段可用于 different-2 格式转换。
我需要一种将 PPTX 文件保存为 PDF 和带注释的 PDF 的方法。这是我的解决方案
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()
要使用它,
PPTtoPDF ('.\Test.pptx', '.\Test.pdf' )
PPTtoPDFNote('.\Test.pptx', '.\Test_with_Note.pdf')
注意:始终最好使用 Windows 平台,即使用 comtypes
以便它始终支持 Microsoft Powerpoint 中的新格式和功能。
为了在 google 云函数上将 .pptx/.docx 转换为 pdf,我参考了这个 github 存储库 https://github.com/zdenulo/gcp-docx2pdf/tree/master/cloud_function,他们使用 google 驱动器 api的。 在这个 repo 中,他们使用 mime 类型的 docx 将 .docx 文件转换为 .pdf 文件,通过 google 驱动器,您也可以使用其他 mime 类型,如 mime 类型的 pptx(参考:https://developers.google.com/drive/api/v3/mime-types)转换 google 驱动器上的文件。 其余所有代码与 github 存储库中提到的相同。