问题描述
我工作的公司要求在.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