python-3.x - 使用 python-pptx 时如何获得组内形状的正确左侧位置?

标签 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

最佳答案

了解这一点的一个好起点是检查组形状 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. 子形状的相对位置(相对于组形状原点)。这是 child 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 来实现。仅在组中,无需访问和更新每个子形状位置。

关于python-3.x - 使用 python-pptx 时如何获得组内形状的正确左侧位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56483900/

相关文章:

python - 在类内部实例化对象

python - 为多个函数正确实现(并发)Asyncio

python 漂白剂 : inconsistent cleaning behaviour

python - 从 Streamlit 下载 python-pptx

python-pptx 字体大小来自层次结构/模板/主控

Python-PPTX : Data Label Positions not working for Doughnut Chart

python 脚本——根据运行方式将日志写入不同的位置

python-3.x - Kivy如何将图片放入动态文本中

python - 'self' 作为 PyQt5 中的参数有什么区别

python - 从ppt幻灯片中提取所有标题(标题)