如何使用 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 格式转换。

Original Snippet

我需要一种将 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 存储库中提到的相同。