我正在解析具有三种形状的简单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
答案 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
值完全相同,代表了该组的左上角-形状。
使用这两套值,您可以计算出一些有趣的位置。
子形状的绝对位置。这是子a:off
加上组a:off
减去组a:chOff
。
子形状的相对位置(至组形状原点)。这是子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
来完成此任务,而不必访问和更新每个子形状位置。