如何用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
相关产品推荐
相关产品推荐

