Как получить правильную левую позицию фигуры в группе при использовании python-pptx? - PullRequest
1 голос
/ 06 июня 2019

Я анализирую простую PowerPoint с тремя формами.Одна фигура видна слева от двух других.Но не при сравнении с использованием python-pptx.Правая сторона этой левой фигуры (shape.left + shape.width) имеет более высокое значение, чем левая сторона другой формы (shape.left).Результат python-pptx, кажется, указывает на то, что правая фигура начинается в левой границе.Это, кажется, вызвано формой группы, в которой находится правая форма.

Какой правильный код для правильного сравнения, что правая форма левой стороны фактически находится справа от левой руки?shape?

Я попытался удалить группу, а затем сравнения показывают ожидаемые значения.Я попытался создать новые групповые фигуры с фигурами внутри, и они снова показывают ожидаемые значения.Однако связанный файл PowerPoint по адресу www.mibnet.se/LeftBoxIssue.pptx является примером, где форма группы влияет на нормальный результат.При запуске кода я не знаю, как были созданы формы.Мне нужен общий способ для правильной проверки этого особого случая.

from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE_TYPE

strStartPowerPoint=r".\LeftBoxIssue.pptx"
prs=Presentation(strStartPowerPoint)
slide=prs.slides[0]
for shpShape in slide.shapes:
    if shpShape.shape_type == MSO_SHAPE_TYPE.GROUP:
        print(shpShape.shapes[0].text+
             " has   Left="+str(shpShape.shapes[0].left)+
             " and right="+
             str(shpShape.shapes[0].left+shpShape.shapes[0].width))
    else:
        print(shpShape.text+" has Left="+str(shpShape.left)+
             " and right="+str(shpShape.left+shpShape.width))

Я ожидаю, что у формы правой руки будет значение "левого" больше, чем у значения "левой" формы правого.Но вместо этого он печатает меньшее значение:

Left has Left=160326 and right=6254527
Right has Left=3291751 and right=3846370

1 Ответ

1 голос
/ 07 июня 2019

Хорошее начало для понимания этого - проверка XML-формы группы:

print(group_shape._element.xml)

Там вы найдете дочерний элемент, который выглядит следующим образом:

<p:grpSpPr>
  <a:xfrm>
    <a:off x="3347864" y="2204864"/>
    <a:ext cx="3506688" cy="2930624"/>
    <a:chOff x="3347864" y="2204864"/>
    <a:chExt cx="3506688" cy="2930624"/>
  </a:xfrm>
</p:grpSpPr>

Элемент <a:chOff> представляет «дочернее смещение» фигур в группе. В этом случае, что типично для фигур, сгруппированных в python-pptx, обратите внимание, что значения a:chOff в точности совпадают со значениями a:off, которые представляют левый верхний угол формы группы.

Используя эти два набора значений, вы можете вычислить некоторые интересные позиции.

  1. Абсолютное положение дочерних фигур. Это дочерний элемент a:off плюс группа a:off минус группа a:chOff.

  2. Относительное положение дочерних фигур (к началу координат в форме группы). Это ребенок a:off минус группа a:chOff.

Вы можете получить эти дополнительные значения дочернего смещения из группы с помощью:

chOff = group_shape._element.xpath("./p:grpSpPr/a:xfrm/a:chOff")[0]
chOff_x = int(chOff["x"])
chOff_y = int(chOff["y"])

Эти значения приведены в английских метрических единицах (EMU), которые описаны здесь вместе с тем, как вам удобно ими манипулировать:
https://python -pptx.readthedocs.io / о / последняя / пользователя / autoshapes.html # понимание-английская метрические единицы

python-pptx всегда использует дочернее смещение, равное позиции формы группы (a:off), потому что это удобно. Другие пакеты могут использовать другие смещения в форме группы, которые более удобны для их целей. Например, если бы вы переместили группу, вы могли бы добиться этого, изменив a:off только в группе, не посещая и не обновляя каждую из дочерних позиций фигуры.

...