利用python-docx批量处理Word文件—图片 (3)

再看rels.related_partsr的定义:

@property def related_parts(self): """ dict mapping rIds to target parts for all the internal relationships in the collection. """ return self._target_parts_by_rId

self.rels.related_parts是一个字典,这个字典可以通过rId映射对应的内容,恰好在图片对应的Proxy Type内容(imagedata标签)中发现了这个属性,

<v:shape id="_x0000_i1025" type="#_x0000_t75" style="width:6in;height:214.5pt"> <v:imagedata r:id="rId8" o:title="syh"/> </v:shape>

可以看到,这个图片对应rId是rId8,运行

doc.part.related_parts[\'rId9\']

发现前没有报错,将其存储成图片后,惊喜出现了——这就是该图片的内容。
整理上面的思路,获得图片的过程分3步:

获得各段的Proxy Type对象,它是一个xml;

遍历该xml,如果pict键存在,该段是图片,继续遍历获得rId;

利用related_parts获得图片内容。

下面详述该过程:

1.1 获得各段对应的Proxy Type xml数据 proxy=[] for p in doc.paragraphs: proxy.append(p._element.xml) 1.2 遍历xml,找到图片所在的段落并获得rid import xml.etree.cElementTree as ET for p in proxy: #一段一个根树 root=ET.fromstring(p) #获得<w:r>树,所有的<w:pict>树均是<w:r>树的子树 pictr_str="%sr" % re.match(\'{\S+}\',root.tag).group(0) pictrs=root.findall(pictr_str) pict_str="%spict" % re.match(\'{\S+}\',root.tag).group(0) picts=[] rIds=[] for pictr in pictrs: #获得所有<w:pict>标签 pict=pictr.findall(pict_str) #如果<w:pict>存在 if len(pict)>0: picts.append(pict[0]) for pict in picts: shape_str="%sshape" % re.match(\'{\S+}\',pict[0].tag).group(0) #获得<v:shape>标签 shape=pict.findall(shape_str)[0] attrib=[] #<w:imagedata>标签 imagedata=shape.findall("%simagedata" % re.match(\'{\S+}\',pict[0].tag).group(0)) rIds.append(imagedata[0].attrib[\'{}id\'])

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwdxjf.html