如何用Python提取PPTX文件占位符中嵌入的图片?
提取PPT中所有图片(含占位符内图片)
当前代码可提取幻灯片独立形状及组内的图片,但无法获取占位符中嵌入的图片,且已通过shape.width > 250000设置最小宽度过滤条件。以下是修复后的完整代码:
import os import pptx from pptx.enum.shapes import MSO_SHAPE_TYPE ppFileName = "Test.pptx" directory = os.path.dirname(__file__) imageDirectory = directory + "\\Images " + ppFileName.replace(".pptx", "") if not os.path.exists(imageDirectory): os.makedirs(imageDirectory) def saveImage(shape, slideNumber, imageNumber): image = shape.image imageBytes = image.blob imageFileName = f"Slide {slideNumber} Image {imageNumber}.{image.ext}" imagePath = imageDirectory + "\\" + imageFileName with open(imagePath, 'wb') as file: file.write(imageBytes) return imageNumber + 1 # 返回更新后的计数,确保序号连续 prs = pptx.Presentation(directory + "\\" + ppFileName) slideNumber = 0 for slide in prs.slides: imageNumber = 0 for shape in slide.shapes: # 处理独立图片形状 if shape.shape_type == MSO_SHAPE_TYPE.PICTURE and shape.width > 250000: imageNumber = saveImage(shape, slideNumber, imageNumber) # 处理组内图片 elif shape.shape_type == MSO_SHAPE_TYPE.GROUP and shape.width > 250000: for s in shape.shapes: if s.shape_type == MSO_SHAPE_TYPE.PICTURE and s.width > 250000: imageNumber = saveImage(s, slideNumber, imageNumber) # 处理占位符中的图片 elif shape.shape_type == MSO_SHAPE_TYPE.PLACEHOLDER: # 检查占位符是否包含图片 if hasattr(shape, 'image') and shape.image is not None and shape.width > 250000: imageNumber = saveImage(shape, slideNumber, imageNumber) slideNumber += 1
关键修改说明:
- 新增占位符处理分支:针对
MSO_SHAPE_TYPE.PLACEHOLDER类型的形状,通过hasattr(shape, 'image')判断是否包含图片资源,符合尺寸要求则执行保存 - 修复计数逻辑:原代码中图片序号仅在函数内递增,改为函数返回更新后的计数,保证每张图片的序号连续不重复
- 组内图片补全过滤:给组内的子图片也加上宽度判断,避免不符合尺寸要求的小图被误提取
内容的提问来源于stack exchange,提问作者Baron McDonald
相关产品推荐
相关产品推荐

