1

我正在尝试编写一个脚本来打开用户指定的 ppt,读取它并找到图像文件名。我使用 python pptx 包,因为这让我实际上可以打开 ppt 文件。我试图浏览每张幻灯片并检查该幻灯片的图像,但我不知道如何使用 pptx 包执行此操作,并且该 imo 上的文档并不十分清楚。

因此,在深入研究文档之后,我发现这种工作可以完成:

file = open(fileName, 'rb')
ppt = Presentation(file)
images = []

for slide in ppt.slides:
    for shape in slide.shapes:
        print(shape.image)
        if shape.image:
            if isCorrectImageType(shape.image):
                print(shape.image.filename)
file.close()

def isCorrectImageType(imageShape):
    imgExtension = imageShape.content_type
    filePattern = '(.jpg$|.jpeg$|.png$|.gif$)'
    image = re.search(filePattern, imgExtension)
    print(image.group(0))

    return image.group(0)

这有效,但是它不返回正确的文件名。它返回 image.png 而文件名是 myfile.png

4

1 回答 1

1

如果图像是从文件中插入的,则图像文件名仅存储在 XML 中。如果图像是从二进制流中导入的(通过诸如 之类的程序python-pptx),则没有可用的文件名,因此image.{ext}使用该格式。使用 PowerPoint 将图像粘贴到位时也是如此。

所以文件名不一定总是可用的。

但是,当它记录时,它在descr图片形状的属性中可用:

from pptx.enum.shapes import MSO_SHAPE_TYPE

for shape in slide.shapes:
    if shape.shape_type != MSO_SHAPE_TYPE.PICTURE:
        continue
    picture = shape
    print(picture._pic.nvPicPr.cNvPr.get('descr'))

此代码访问如下所示的 XML:

<p:pic>
  <p:nvPicPr>
    <p:cNvPr id="6" name="Picture 5" descr="python-logo.gif"/>
    <p:cNvPicPr/>
    <p:nvPr/>
  </p:nvPicPr>
  ...

并且应该返回值'python-logo.gif'

于 2017-09-28T17:40:40.363 回答