使用python-pptx检查powerpoint中的图像是否具有装饰性

kin*_*ler 5 python xml powerpoint accessibility python-pptx

我工作的公司要求在 .pptx 文档中列出所有无法访问的图像/形状(没有替代文本,也没有装饰性)。为了自动化该过程,我正在编写一个脚本,用于提取指定 .pptx 中所有无法访问的图像/形状并编译一个列表。到目前为止,我已经设法让它打印出没有替代文本的图像的名称、幻灯片 # 和图像块。

不幸的是,在广泛搜索文档后,我发现 python-pptx 包不支持检查图像/形状是否具有装饰性的功能。

我过去没有将 XML 元素映射到对象,并且想知道如何创建一个函数来读取此 .pptx 文件中元素val内的属性adec:decorative(请参见第 4 行)。

<p:cNvPr id="3" name="Picture 2">
    <a:extLst>
        <a:ext uri="{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}"><a16:creationId xmlns:a16="http://schemas.microsoft.com/office/drawing/2014/main" id="{77922398-FA3E-426B-895D-97239096AD1F}" /></a:ext>
        <a:ext uri="{C183D7F6-B498-43B3-948B-1728B52AA6E4}"><adec:decorative xmlns:adec="http://schemas.microsoft.com/office/drawing/2017/decorative" val="0" /></a:ext>
    </a:extLst>
</p:cNvPr>
Run Code Online (Sandbox Code Playgroud)

由于我最近才开始使用这个包,我不确定如何在 python-pptx 中创建自定义元素类。如果有人有任何其他解决方法或建议,请告诉我,谢谢!

sca*_*nny 1

创建一个自定义元素类肯定会起作用,但我将其视为一种极端方法(想想用于杀死蚊子的火箭筒):)。

我倾向于认为你可以通过查询XPath你可以到达的最近的祖先来完成你想要的事情python-pptx

像这样的事情将朝着正确的方向发展:

cNvPr = shape._element._nvXxPr.cNvPr
adec_decoratives = cNvPr.xpath(".//adec:decorative")
if adec_decoratives:
    print("got one, probably need to look more closely at them")
Run Code Online (Sandbox Code Playgroud)

挑战之一可能是注册adec命名空间前缀,因为我认为默认情况下不是这样。因此,您可能需要在 XPath 表达式之前(可能在加载第一个文档之前)执行此代码:

from pptx.oxml.ns import _nsmap

_nsmap["adec"] = "http://schemas.microsoft.com/office/drawing/2017/decorative"]
Run Code Online (Sandbox Code Playgroud)

另外,如果您对 XPath 进行一些研究,我认为您实际上将能够查询<adec:decorative>具有val=0或任何特定属性状态满足您正在寻找的内容的元素。

但这是我推荐的方向。也许您可以在解决后发布您的结果,以防其他人以后遇到同样的问题。