【问题标题】:Creating a `PicturePlaceholder` in PowerPoint and accessing it with Python-pptx在 PowerPoint 中创建“PicturePlaceholder”并使用 Python-pptx 访问它
【发布时间】:2021-05-31 17:05:01
【问题描述】:

我目前正在使用python-pptx 制作一个 PowerPoint 模板。我在 MS Office 上创建了一个模板,并希望用文本和图像动态填充模板。因此,我创建了包含占位符的布局和幻灯片。

我在访问和填充文本占位符时没有问题,但是,我在使用图片占位符时遇到了问题。

我想使用PicturePlaceholder object.insert_picture() 方法。您还可以在文档here 中找到此方法的示例。

为此,我按如下方式访问占位符:

prs = Presentation(pathToPptxTemplate)
slide = prs.slides[indexOfMySlide]

# There are multiple image placeholders on my slide
image_placeholders = [
            i for i in slide.placeholders if
            i.placeholder_format.type == 18
        ]

for index, shape in enumerate(image_placeholders):
            shape.insert_picture(pathToMyImage)

这会导致以下错误消息:

AttributeError: 'PlaceholderPicture' object has no attribute 'insert_picture'

在摸索了几分钟后,我注意到我正在查看PicturePlaceholder 的文档,但访问的是PlaceholderPicture 对象。我在文档中读到的不同之处在于:

  • PicturePlaceholder 是只能接受图片的占位符形状。

  • PlaceholderPicture 是填充有图片的占位符形状。

现在我还没有用任何图片填充占位符。我刚刚在 PowerPoint 中创建了一个空占位符。

这是我的问题:
如何在 PowerPoint 中创建 PicturePlacholder 以及如何使用 Python-pptx 访问它?

如果这不可能,您有替代解决方案吗?

提前致谢

【问题讨论】:

    标签: python python-pptx


    【解决方案1】:

    尝试使用 PowerPoint UI 删除有问题的“占位符”形状并插入一个新的、未触及的占位符。在我的带有 PowerPoint 2016 的 Mac 上,这是:

    • 查看 > 幻灯片母版
    • 选择所需的幻灯片布局
    • 幻灯片母版 > 插入占位符 > 图片

    您可以根据需要调整大小和位置,否则请保持不变并重试。可能最好使用新的演示文稿来完成所有这些操作,并删除除一个幻灯片布局和所有幻灯片之外的所有幻灯片,以保持简单。

    然后使用python-pptx 从该布局创建幻灯片:

    slide = prs.slides.add_slide(prs.slide_layouts[0])
    

    我认为您会发现它有效,并且您的模板占位符通过某种方式将图像插入其中,也许可以作为示例或其他方式。

    几个可能的混淆领域:

    1. 用户不会在幻灯片上创建占位符形状。创建幻灯片时,幻灯片会继承其幻灯片布局的占位符。

    2. PicturePlaceholder 形状具有元素 <p:sp>,所有占位符也是如此。当图片“插入占位符”时,p:sp 元素将替换为 <p:pic> 元素;占位符形状被替换为图片形状。

    我想您会发现模板幻灯片上的图片占位符已被“使用”并且现在是图片。您可以通过使用 print(shape.xml) 检查 xml 来确认这一点。

    解决方案是通过重新创建该幻灯片来修复它,或者它可能会在 PowerPoint 中打开它并删除其内容(而不是整个形状),这应该将其返回到其原始图片占位符状态。也可以删除有问题的形状,然后“重新应用布局”(可能在主页工具栏的幻灯片布局区域中“重置”)。

    【讨论】:

    • 非常感谢您的回答。我非常感谢您在 GitHub 和 stackoverflow 上如此活跃,以帮助我们解决问题:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 2023-03-24
    • 1970-01-01
    • 2022-11-09
    • 1970-01-01
    相关资源
    最近更新 更多