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

问题描述

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

不幸的是,在广泛搜索文档之后,我发现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>

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

解决方法

创建自定义元素类肯定可以,但是我认为这是一种极端的方法(想想用火箭筒杀死蚊子):)。

我倾向于认为您可以通过对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")

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

from pptx.oxml.ns import _nsmap

_nsmap["adec"] = "http://schemas.microsoft.com/office/drawing/2017/decorative"]

此外,如果您稍微研究一下XPath,我认为您实际上可以查询具有<adec:decorative>的{​​{1}}元素或满足您要查找的任何特定属性状态。 / p>

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

,

问题毕竟要简单得多!非常感谢@scanny,我能够解决此问题并在$('.question').on('click',function(){ $(this).toggle(); }); 元素中定位val=1属性。如果该形状的adec:decorative,则以下函数返回True。

val=1

这是到目前为止检查单个指定.pptx中可访问性的完整脚本(如果图像不是装饰性的并且没有替代文本,则打印出图像名称和幻灯片#):

def isDecorative(shape):
    cNvPr = shape._element._nvXxPr.cNvPr
    adec_decoratives = cNvPr.xpath(".//adec:decorative[@val='1']")
    if adec_decoratives:
        return True