python-pptx:我如何重新定位图片占位符?

时间:2018-03-14 14:14:31

标签: python image insert powerpoint python-pptx

我对python-pptx软件包比较新,但我发现它非常有用。

我添加了一张带有"标题,图片和标题的幻灯片"布局。

SLD_LAYOUT_TITLE_AND_PICTURE_AND_CAPTION = 8

prs = Presentation(output_pptx_fp)
slide_layout = prs.slide_layouts[SLD_LAYOUT_TITLE_AND_PICTURE_AND_CAPTION]

slide = prs.slides.add_slide(slide_layout)
shapes = slide.shapes

placeholder_pict = slide.placeholders[1]  # idx key, not position

placeholder_pict.insert_picture(img_path) 

我试图弄清楚如何重新定位图片占位符。

通过类比我如何在幻灯片上定位标题占位符,我尝试过使用:

placeholder_pict.left = Inches(1.96)
placeholder_pict.top = Inches(0.0)

然而,这会产生一个AttributeError。

我也尝试使用" left" " top" " insert_picture()"的参数方法:

left = Inches(1.96)
top = Inches(0.0)
placeholder_pict.insert_picture(img_path, left, top)

这产生了一个" TypeError:insert_picture()需要2个位置参数,但是4个被给出"

如何在此幻灯片上重新定位图片占位符?我是否遗漏了文档中的内容?

更新:

当我尝试时(这是史蒂芬没有建议但我很好奇的事情):

picture_left = Inches(1.96)
picture_top = Inches(0.0)
picture = placeholder_pict.insert_picture(img_path, picture_left, picture_top)

我得到:" TypeError:insert_picture()需要2个位置参数但是4个被给出"

当我尝试时(我认为这是斯坎尼的第一个建议):

picture_left = Inches(1.96)
picture_top = Inches(0.0)
shapes.add_picture(img_path, picture_left, picture_top)

图片位于我想要的位置,但它不在图片容器中(我可以使用),因此它的大小不适合图片容器(我可以处理)通过添加代码)

当我尝试时(我认为这是斯堪尼亚的第二个建议):

picture_left = Inches(0.0)
picture_top = Inches(0.0)
placeholder_pict.left = picture_left
placeholder_pict.top = picture_top
picture = placeholder_pict.insert_picture(img_path)

我没有变化。图片显示在幻灯片上,但它与我没有尝试设置placeholder_pict.left和placeholder_pict.top时的位置相同。

当我尝试时(我认为这是斯堪尼亚的第三个建议):

picture = placeholder_pict.insert_picture(img_path)
picture.left = Inches(0)
picture.top = Inches(0)

我根本没有照片。我已经尝试过缩小,看看图片是否已经放置了幻灯片"但仍然没有图片的迹象。据我所知,我甚至不再拥有图片容器。

当我尝试时(根据scanny的要求):

placeholder_pict = slide.placeholders[1]  # idx key, not position
print("placeholder_pict.placeholder_format.type =", placeholder_pict.placeholder_format.type)
print("placeholder_pict.left", placeholder_pict.left, "placeholder_pict.top =", placeholder_pict.top)

我明白了:
placeholder_pict.placeholder_format.type =图片(18)
placeholder_pict.left 1792288 placeholder_pict.top = 612775

这让我很困惑,为什么我显然无法成功设置placeholder_pict.left和placeholder_pict.top值。

2 个答案:

答案 0 :(得分:1)

占位符的(初始)位置取决于它来自幻灯片布局的位置。因此,如果您想要更改所有占位符的位置,则需要在布局上更改它。

这是通过使用您自己的起始模板PPTX,并使用PowerPoint手动编辑其布局来实现的。

如果您要做的只是在特定情况下更改单个形状的位置,您需要了解占位符是空的"形状或形状容器。您需要更改.insert_picture()调用产生的形状的位置:

picture = placeholder_pict.insert_picture(...)
picture.left = Inches(1.96)
picture.top = Inches(0.0)

此处及其附近的文档中对此进行了描述:http://python-pptx.readthedocs.io/en/latest/user/placeholders-using.html#insert-content-into-a-placeholder

答案 1 :(得分:1)

根据一些额外的观察,这个案例似乎暴露了一些"怪癖"在PowerPoint如何工作。

简短的回答是,如果要更改左侧和顶部,则需要明确设置宽度和高度,否则它们默认为0,这会导致形状“消失”#34;。

这段代码应该说明一下情况:

prs = Presentation()
slide_layout = prs.slide_layouts[PICTURE_LAYOUT_IDX]
slide = prs.slides.add_slide(slide_layout)
shapes = slide.shapes

placeholder = slide.placeholders[1]
print(placeholder.left.inches, placeholder.top.inches)

# ---note that all these actions are *before* the image is inserted---

placeholder.left = Inches(3)
print(placeholder.left.inches)

print(placeholder.width)
placeholder.width = Inches(3)
print(placeholder.left.inches)

print(placeholder.height)
placeholder.height = Inches(3)
print(placeholder.height)

基本上这表明形状在布局占位符中的位置和大小的继承是全有或全无。只要您明确设置其中一个,就需要设置所有这些。