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

图片是Word的一种特殊内容,这篇文章主要内容是如何利用python-docx批量提取Word中的图片,以及如何在Word国插入图片。

1.提取Word中的图片并保护成指定格式

docx好像并没有直接获取图片的方法,网上的资料也很少,有用的资料我就找到这一篇:
如何从pythondocx段中获取图像(Inlineshape)
说实话,这篇文章我看的不是太懂,而且这个方法只能获得内联的图片,什么是内联的图片呢,我也不知道,我只知道我们在word中直接插入的图片不属于这种,也就是这种方法并不能获得word中直接插入的图片,我用add_picture()插入一张图片,用该方法可以获得。受这篇文章的启发,我看了一下python-docx的源码,虽然没有看懂,但也得到一个用有的信息:python-docx会将wrod文件转换成Proxy Type(不敢翻译)格式进行处理。Proxy Type格式是什么样的呢,其实质是xml,不同的类型会被转成不同的Proxy Type,以Document为例,可以用document._element.xml查看被转换后的内容:

在这里插入图片描述


这就是word内容转换成Proxy Type后的形式(大部分信息被我折叠了),我对xml研究不多,可以看出所有标签都是<w:x>的形式,整个文档包含在<w:document></w:document>标签中,每段以<w:p>开始,</w:p>结束 ,图片在docx中也是段落,因此我们过以通过遍历整个xml找到包含图片的段落,要通过遍历找到图片,图片所在的段落必须有其特殊之处,不然我们也无判断。下面是一幅图处的Proxy Type的内容:

<w:p xmlns:w="" xmlns:wpc="" xmlns:mc="" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="" xmlns:m="" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="" xmlns:wp="" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w14="" xmlns:w15="" xmlns:wpg="" xmlns:wpi="" xmlns:wne="" xmlns:wps="" w:rsidR="00B20677" w:rsidRDefault="00D47C7B" w:rsidP="00ED22C2"> <w:pPr> <w:rPr> <w:rFonts w:ascii="宋体" w:eastAsia="宋体" w:hAnsi="宋体"/> <w:lang w:eastAsia="zh-CN"/> </w:rPr> </w:pPr> <w:r> <w:rPr> <w:rFonts w:ascii="宋体" w:eastAsia="宋体" w:hAnsi="宋体"/> <w:lang w:eastAsia="zh-CN"/> </w:rPr> <w:pict> <v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter"/> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0"/> <v:f eqn="sum @0 1 0"/> <v:f eqn="sum 0 0 @1"/> <v:f eqn="prod @2 1 2"/> <v:f eqn="prod @3 21600 pixelWidth"/> <v:f eqn="prod @3 21600 pixelHeight"/> <v:f eqn="sum @0 0 1"/> <v:f eqn="prod @6 1 2"/> <v:f eqn="prod @7 21600 pixelWidth"/> <v:f eqn="sum @8 21600 0"/> <v:f eqn="prod @7 21600 pixelHeight"/> <v:f eqn="sum @10 21600 0"/> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/> <o:lock v:ext="edit" aspectratio="t"/> </v:shapetype> <v:shape id="_x0000_i1025" type="#_x0000_t75" style="width:6in;height:214.5pt"> <v:imagedata r:id="rId8" o:title="syh"/> </v:shape> </w:pict> </w:r> </w:p>

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

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