使用python-pptx时如何获得形状在组中的正确左位置?

时间:2019-06-06 19:25:32

标签: python-3.x python-pptx

我正在解析具有三种形状的简单PowerPoint。一个形状显然在另两个形状的左侧。但是在使用python-pptx进行比较时不行。该左侧形状的右侧(shape.left + shape.width)的值高于其他左侧形状之一(shape.left)。 python-pptx结果似乎表明右侧形状在左侧形状边界内开始。这似乎是由于右侧形状位于其中的组形状引起的。

什么是正确比较右侧形状实际上在左侧形状右边的正确代码?

我尝试删除该组,然后比较显示期望值。我尝试用内部形状创建新的组形状,并且它们再次显示期望值。但是,www.mibnet.se / LeftBoxIssue.pptx上的链接PowerPoint文件是一个示例,其中组的形状会影响正常结果。运行代码时,我不知道形状是如何创建的。我需要一种通用方法来正确测试这种特殊情况。

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 个答案:

答案 0 :(得分:1)

了解这一点的一个好地方是检查组形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/en/latest/user/autoshapes.html#understanding-english-metric-units

python-pptx始终使用等于组形状位置(a:off)的子偏移量,因为这很方便。其他包装可以使用更方便使用的其他组形偏移。例如,如果要移动一个组,则可以通过仅更改组中的a:off来完成此任务,而不必访问和更新每个子形状位置。