You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python自动生成带幻灯片链接的PowerPoint目录?

Python 自动生成带幻灯片链接的PPT目录及图片配对方案

1. 依赖安装

先安装所需库:

pip install python-pptx
# 若用Windows原生PowerPoint转PDF,需额外安装
pip install pywin32
# 若用跨平台pdfkit转PDF,需安装
pip install pdfkit

注:使用pdfkit时需额外下载安装wkhtmltopdf并配置路径。

2. 完整示例代码

import os
import random
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN

def get_image_pairs(image_dir):
    """读取文件夹图片并生成随机两两配对,奇数个图片时最后一张单独成组"""
    image_extensions = ('.png', '.jpg', '.jpeg', '.bmp', '.gif')
    images = [
        f for f in os.listdir(image_dir) 
        if os.path.isfile(os.path.join(image_dir, f)) 
        and f.lower().endswith(image_extensions)
    ]
    random.shuffle(images)
    
    pairs = []
    for i in range(0, len(images), 2):
        if i + 1 < len(images):
            pairs.append((images[i], images[i+1]))
        else:
            pairs.append((images[i], None))
    return pairs

def generate_ppt_with_links(image_dir, output_pptx):
    """生成带目录跳转链接的PPT,包含图片配对幻灯片"""
    prs = Presentation()

    # 创建目录页
    title_layout = prs.slide_layouts[0]
    toc_slide = prs.slides.add_slide(title_layout)
    toc_slide.shapes.title.text = "图片配对导航目录"
    toc_slide.placeholders[1].text = "点击目录项跳转至对应幻灯片"

    toc_entries = []

    # 创建图片配对幻灯片
    blank_layout = prs.slide_layouts[5]
    img_left = Inches(1)
    img_top = Inches(1)
    img_width = Inches(5)

    for idx, (img1_name, img2_name) in enumerate(get_image_pairs(image_dir), start=1):
        slide = prs.slides.add_slide(blank_layout)
        # 设置幻灯片标题
        title_shape = slide.shapes.title
        title_shape.text = f"图片配对 {idx}"
        title_shape.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER

        # 插入第一张图片
        img1_path = os.path.join(image_dir, img1_name)
        slide.shapes.add_picture(img1_path, img_left, img_top, width=img_width)

        # 插入第二张图片(若存在)
        if img2_name:
            img2_top = img_top + Inches(3.5)
            img2_path = os.path.join(image_dir, img2_name)
            slide.shapes.add_picture(img2_path, img_left, img2_top, width=img_width)

        # 记录目录项与对应幻灯片编号(PPT内编号从1开始,目录页是第1页,内容页从第2页起)
        toc_entries.append((f"图片配对 {idx}", idx + 1))

    # 给目录页添加带跳转链接的文本
    toc_box = toc_slide.shapes.add_textbox(Inches(1), Inches(2.5), Inches(8), Inches(5))
    toc_frame = toc_box.text_frame

    # 目录标题
    p = toc_frame.add_paragraph()
    p.text = "目录"
    p.font.size = Pt(16)
    p.font.bold = True
    p.space_after = Pt(10)

    # 添加目录项并设置跳转链接
    for entry_name, slide_num in toc_entries:
        p = toc_frame.add_paragraph()
        p.text = entry_name
        p.font.size = Pt(14)
        p.space_after = Pt(5)
        # 设置链接到目标幻灯片
        p.hyperlink.address = f"#{slide_num}"

    prs.save(output_pptx)
    print(f"PPT生成完成:{output_pptx}")

def pptx_to_pdf_win32(input_pptx, output_pdf):
    """Windows下用PowerPoint原生API转带链接的PDF"""
    import win32com.client
    ppt = win32com.client.Dispatch("PowerPoint.Application")
    ppt.Visible = False
    try:
        presentation = ppt.Presentations.Open(os.path.abspath(input_pptx))
        presentation.SaveAs(os.path.abspath(output_pdf), 32)  # 32对应PDF格式
        print(f"PDF生成完成:{output_pdf}")
    finally:
        presentation.Close()
        ppt.Quit()

def pptx_to_pdf_pdfkit(input_pptx, output_pdf):
    """跨平台用pdfkit转PDF,需提前安装wkhtmltopdf"""
    import pdfkit
    # 替换为你的wkhtmltopdf实际路径
    config = pdfkit.configuration(wkhtmltopdf=r'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe')
    pdfkit.from_file(input_pptx, output_pdf, configuration=config)
    print(f"PDF生成完成:{output_pdf}")

if __name__ == "__main__":
    IMAGE_FOLDER = "./images"  # 替换为你的图片文件夹路径
    OUTPUT_PPT = "图片配对展示.pptx"
    OUTPUT_PDF = "图片配对展示.pdf"

    generate_ppt_with_links(IMAGE_FOLDER, OUTPUT_PPT)
    # 二选一使用PDF转换函数
    pptx_to_pdf_win32(OUTPUT_PPT, OUTPUT_PDF)
    # pptx_to_pdf_pdfkit(OUTPUT_PPT, OUTPUT_PDF)

3. 关键说明

  • 图片配对逻辑:示例采用随机打乱后两两分组,可根据需求修改为按文件名排序、自定义分组等规则。
  • 目录跳转:通过hyperlink.address = "#{slide_num}"实现,slide_num为PPT内的幻灯片编号(从1开始计数)。
  • PDF转换:Windows系统推荐用win32com调用原生PowerPoint,兼容性更好;跨平台场景可选择pdfkit。

内容的提问来源于stack exchange,提问作者Colton Campbell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 16:13:20