python-pptx: How canI reposition the picture placeholder?

 ̄綄美尐妖づ 提交于 2019-12-24 11:29:49

问题


I'm relatively new to the python-pptx package but I'm finding it very useful.

I've added a slide with the "title and picture and caption" layout.

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) 

I'm trying to figure out how to reposition the picture placeholder.

By analogy to how I position the title placeholder on the slide, I've tried using:

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

However, this generated an AttributeError.

I've also tried using "left" and "top" arguments to the "insert_picture()" method:

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

This generated a "TypeError: insert_picture() takes 2 positional arguments but 4 were given"

How do I reposition the picture placeholder on this slide? Did I miss something in the documentation?

UPDATE:

When I try (which is something scanny didn't suggest but I was curious):

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

I get: "TypeError: insert_picture() takes 2 positional arguments but 4 were given"

When I try (which I believe was scanny's first suggestion):

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

the picture is positioned where I want it but it's not in the picture container (which I can live with) and so it's not sized to fit in the picture container (which I can deal with by adding code)

When I try (which I believe was scanny's second suggestion):

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)

I get no change. The picture appears on the slide but it's in the same position as when I don't try setting placeholder_pict.left and placeholder_pict.top at all.

When I try (which I believe was scanny's third suggestion):

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

I get no picture at all. I've tried zooming out, to see if the picture might have been placed "off the slide" but still no sign of a picture. As far as I can tell, I no longer even have the picture container.

When I try (per scanny's request):

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)

I get:
placeholder_pict.placeholder_format.type = PICTURE (18)
placeholder_pict.left 1792288 placeholder_pict.top = 612775

This makes me very puzzled about why I apparently can't successfuly set the placeholder_pict.left and placeholder_pict.top values.


回答1:


In light of some additional observations, it appears this case exposes some "quirks" in how PowerPoint works.

The short answer is that you need to set width and height explicitly if you want to change left and top, otherwise they default to 0, which causes the shape to "disappear".

This code should illuminate the situation a bit:

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)

Basically what this indicates is that a shape's inheritance of position-and-size from its layout placeholder is all-or-nothing. As soon as you set one of those explicitly, you need to set all of them.




回答2:


The (initial) location of a placeholder is determined by its location on the slide layout it comes from. So if you want to change the location of a placeholder for all the slides created with that layout, you need to change it on the layout.

This is accomplished by using a starting template PPTX of your own, and editing its layouts to suit by hand, using PowerPoint.

If all you want to do is change the position of a single shape in a particular case, you need to understand that a placeholder is an "empty" shape, or shape container. You need to change the location of the shape that results from the .insert_picture() call:

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

This is described in the documentation at and around here: http://python-pptx.readthedocs.io/en/latest/user/placeholders-using.html#insert-content-into-a-placeholder



来源:https://stackoverflow.com/questions/49279998/python-pptx-how-cani-reposition-the-picture-placeholder

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!