我正在解析一个具有三种形状的简单 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
完全相同值,代表组形状的左上角。
使用这两组值,您可以计算一些有趣的位置。
子形状的绝对位置。这是子形状
a:off
加群a:off
负组a:chOff
.子形状的相对位置(相对于组形状原点)。这是 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/