python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python PDF转PPTX

Python代码轻松实现将PDF转换为PPTX文件

作者:用户835629078051

本文将以 Spire.PDF for Python 为例,介绍如何用几行代码把 PDF 转换为 PowerPoint 演示文稿,并说明处理加密 PDF、批量转换以及与其他格式互转时的注意点,希望对大家有所帮助

整理资料、制作汇报材料时,经常需要把现成的 PDF 报告、产品手册或合同重新做成可编辑的幻灯片。手动把 PDF 里的每一页内容搬到 PowerPoint 里,既费时又容易丢掉排版细节;如果有一批 PDF 需要统一处理,逐页复制就更不现实。用 Python 可以自动完成这类转换:加载 PDF 后直接另存为 PPTX,每个 PDF 页面会对应到一张幻灯片,页面上的文字、图片和矢量图形都尽量保留原有版式。

本文以 Spire.PDF for Python 为例,介绍如何用几行代码把 PDF 转换为 PowerPoint 演示文稿,并说明处理加密 PDF、批量转换以及与其他格式互转时的注意点。

为什么用 Python 转换 PDF 为 PowerPoint

通过脚本转换有几个实际好处:

环境准备

安装 Spire.PDF 库:

pip install Spire.PDF

在脚本中引入模块:

from spire.pdf.common import *
from spire.pdf import *

将 PDF 转换为 PowerPoint

转换的核心只有三步:创建 PdfDocument、加载 PDF、用 SaveToFile() 指定 FileFormat.PPTX 保存。

from spire.pdf.common import *
from spire.pdf import *
pdf = PdfDocument()
pdf.LoadFromFile("Input.pdf")
pdf.SaveToFile("Output.pptx", FileFormat.PPTX)
pdf.Close()

PdfDocument 表示一份 PDF 文档,LoadFromFile() 从磁盘读入文件。SaveToFile() 的第二个参数是目标格式,传入 FileFormat.PPTX 后,库会按页面把内容写入幻灯片,每个 PDF 页面生成一张幻灯片。处理完成后调用 Close() 释放文档占用的资源。

转换加密的 PDF

如果 PDF 带有打开密码,只需在 LoadFromFile() 里附加密码参数,其余步骤不变:

pdf = PdfDocument()
pdf.LoadFromFile("Encrypted.pdf", "password")
pdf.SaveToFile("Output.pptx", FileFormat.PPTX)
pdf.Close()

不确定文件是否加密时,可以先用静态方法 PdfDocument.IsPasswordProtected() 判断,再决定是否传入密码:

from spire.pdf import *
pdf = PdfDocument()
if PdfDocument.IsPasswordProtected("Input.pdf"):
    pdf.LoadFromFile("Input.pdf", "password")
else:
    pdf.LoadFromFile("Input.pdf")
pdf.SaveToFile("Output.pptx", FileFormat.PPTX)
pdf.Close()

IsPasswordProtected() 接收文件路径并返回布尔值,用于在批量任务里提前区分加密与非加密文件,避免读取失败导致整个流程中断。

复用同一套 API 转换到其他格式

SaveToFile() 的格式参数是通用的,把 FileFormat.PPTX 换成其他取值,就能把同一份 PDF 转成别的目标格式:

pdf.SaveToFile("Output.docx", FileFormat.DOCX)   # 转 Word
pdf.SaveToFile("Output.xlsx", FileFormat.XLSX)   # 转 Excel
pdf.SaveToFile("Output.html", FileFormat.HTML)   # 转 HTML
pdf.SaveToFile("Output.svg", FileFormat.SVG)     # 转 SVG

如果只是想把 PDF 当作静态素材放进幻灯片,也可以把每一页渲染成图片,再插入演示文稿。这种方式不依赖版式重建,图片外观最接近原始页面:

for i in range(pdf.Pages.Count):
    with pdf.SaveAsImage(i) as image:
        image.Save("slide-{0}.png".format(i))

pdf.Pages.Count 返回页面总数,SaveAsImage(i) 把第 i 页渲染为图像对象,用 with 语句管理资源并调用 Save() 写盘。

实用提示

方法补充

将 PDF 转换为 PPTX,最稳定、最常用的方式是:把 PDF 每一页渲染成高清图片,再将图片逐页插入到 PPTX 幻灯片中。这种方式能最大程度保留原始排版、图表、图片和字体样式,转换速度快,代码也最简单。

缺点:生成的 PPTX 每页是图片,文字不可编辑。如果你需要可编辑文本,则需要 OCR 或商业库支持,效果通常也会打折扣。

下面给出基于 PyMuPDF + python-pptx 的免费开源方案,并附上商业库备选。

1.安装依赖

pip install PyMuPDF python-pptx

2.完整代码:PDF 转 PPTX(每页一张幻灯片)

import io
import fitz  # PyMuPDF
from pptx import Presentation
from pptx.util import Emu
def pdf_to_pptx(pdf_path: str, pptx_path: str, dpi: int = 200):
    """
    将 PDF 每一页渲染为图片,并插入到 PPTX 的每一张幻灯片中。
    :param pdf_path: 输入 PDF 文件路径
    :param pptx_path: 输出 PPTX 文件路径
    :param dpi: 渲染分辨率,建议 150-300。数值越高越清晰,文件也越大。
    """
    # 打开 PDF
    doc = fitz.open(pdf_path)
    # 创建 PPTX
    prs = Presentation()
    # 以 PDF 第一页的尺寸作为幻灯片尺寸(单位:pt)
    first_page = doc[0]
    slide_width_pt = first_page.rect.width
    slide_height_pt = first_page.rect.height
    # 1 pt = 12700 EMU
    prs.slide_width = Emu(int(slide_width_pt * 12700))
    prs.slide_height = Emu(int(slide_height_pt * 12700))
    # 遍历 PDF 每一页
    for page_num in range(len(doc)):
        page = doc[page_num]
        # 渲染为图片(PNG 字节流)
        pix = page.get_pixmap(dpi=dpi)
        img_bytes = pix.tobytes("png")
        img_stream = io.BytesIO(img_bytes)
        # 添加一张空白幻灯片(布局索引 6 通常为空白)
        slide = prs.slides.add_slide(prs.slide_layouts[6])
        # 计算图片放置尺寸,保持宽高比
        page_ratio = page.rect.width / page.rect.height
        slide_ratio = slide_width_pt / slide_height_pt
        if abs(page_ratio - slide_ratio) < 0.01:
            # 比例一致,直接铺满
            slide.shapes.add_picture(
                img_stream, 0, 0,
                width=prs.slide_width,
                height=prs.slide_height
            )
        else:
            # 比例不同,居中缩放
            if page_ratio > slide_ratio:
                width = prs.slide_width
                height = int(width / page_ratio)
            else:
                height = prs.slide_height
                width = int(height * page_ratio)
            left = int((prs.slide_width - width) / 2)
            top = int((prs.slide_height - height) / 2)
            slide.shapes.add_picture(
                img_stream, left, top,
                width=width,
                height=height
            )
        print(f"已处理第 {page_num + 1} / {len(doc)} 页")
    # 保存 PPTX
    prs.save(pptx_path)
    doc.close()
    print(f"转换完成:{pptx_path}")
if __name__ == "__main__":
    pdf_to_pptx("input.pdf", "output.pptx", dpi=200)

3.代码说明

部分说明
fitz.open(pdf_path)打开 PDF 文件
page.get_pixmap(dpi=dpi)将页面渲染为位图,dpi 控制清晰度
pix.tobytes("png")将位图转为 PNG 字节流
prs.slide_layouts[6]使用空白幻灯片布局,避免出现默认占位符
Emu(...)将 pt 转换为 PPTX 使用的 EMU 单位(1 pt = 12700 EMU)
add_picture将图片插入幻灯片,支持指定位置和宽高
宽高比计算当 PDF 页面比例与幻灯片比例不一致时,居中缩放,避免拉伸变形

4.批量转换多个 PDF

import glob
import os

def batch_convert(pdf_dir: str, output_dir: str, dpi: int = 200):
    os.makedirs(output_dir, exist_ok=True)
    for pdf_file in glob.glob(os.path.join(pdf_dir, "*.pdf")):
        filename = os.path.splitext(os.path.basename(pdf_file))[0]
        output_path = os.path.join(output_dir, f"{filename}.pptx")
        try:
            pdf_to_pptx(pdf_file, output_path, dpi=dpi)
        except Exception as e:
            print(f"转换失败 {pdf_file}: {e}")

# 使用
batch_convert("./pdfs", "./pptx_output", dpi=200)

总结

本文介绍了用 Python 把 PDF 转换为 PowerPoint 演示文稿的方法:通过 PdfDocument.LoadFromFile() 加载文件、SaveToFile(path, FileFormat.PPTX) 输出幻灯片,并借助密码参数处理加密 PDF。同一套 API 还能把 PDF 转换到 Word、Excel、HTML、SVG 等格式,或在需要时把页面渲染为图片。把这些步骤与文件遍历结合起来,就能把 PDF 到演示文稿的转换嵌入资料归档、报表整理等自动化流程中。

到此这篇关于Python代码轻松实现将PDF转换为PPTX文件的文章就介绍到这了,更多相关Python PDF转PPTX内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文