如何使用Python将.pptx转换为.pdf

时间:2015-07-18 03:27:10

标签: python pdf converter powerpoint

我一直在寻找通过Python脚本将.pptx文件转换为.pdf文件几个小时,但似乎没有任何工作。

我尝试了什么:我尝试过1)this script调用windows32.client和2)unoconv,但它们似乎都不适用于我。

遇到的问题:使用第一个选项中的脚本会引发错误(com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2147024894), None)),而在第二个选项中,Python似乎无法识别unoconv使用pip安装它。

我也看到了一些推荐的Pandoc,但我无法理解如何将它用于Python。

我正在使用的版本: Python 2.7.9,Windows 8.1

5 个答案:

答案 0 :(得分:16)

我在this post的帮助和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()

答案 1 :(得分:2)

我正在使用此解决方案,但我需要搜索所有.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和except是针对那些我直到最后一个文档都无法阅读且不会退出代码的文档。而且我建议不要使用每种格式:首先是.pptx,然后是.ppt(反之亦然)。

答案 2 :(得分:1)

看看下面的代码片段。它使用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)

此代码段可用于不同2格式的转换。

Original Snippet

答案 3 :(得分:0)

unoconv是执行此任务的好工具,它确实是用python构建的。 关于您的问题,这可能与重复出现的问题有关,即在安装后在主要unoconv文件中设置python解释器的方式。

要使用python3解释器运行它,请在unoconv文件(#!/usr/bin/env python)中将#!/usr/bin/env python3替换为#!/usr/bin/python3/usr/bin/unoconv

一个班轮:

sudo sed -i -e '1s:#!/usr/bin/env python$:#!/usr/bin/env python3:' /usr/bin/unoconv

您还可以将/usr/bin/unoconv链接到/usr/local/bin/unoconv

答案 4 :(得分:0)

我认为必须更新答案,因为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()