使用python-docx从.docx文件中提取图像位置

时间:2016-12-17 15:28:49

标签: python python-docx

我正在尝试使用python-docx库从.docx文件中获取图像索引。我能够提取图像的名称,图像的高度和宽度。但不是word文件中的索引

import docx
doc = docx.Document(filename)
for s in doc.inline_shapes:
    print (s.height.cm,s.width.cm,s._inline.graphic.graphicData.pic.nvPicPr.cNvPr.name)

输出

21.228  15.920 IMG_20160910_220903848.jpg

实际上我想知道是否有更简单的方法来获取图像名称,例如 s.height.cm 以cm为单位获取高度。我的主要要求是了解图像在文档中的位置,因为我需要提取图像并对其进行一些处理,然后再将图像放回到同一位置

3 个答案:

答案 0 :(得分:10)

API不直接支持此操作。

但是,如果您愿意稍微深入了解内部,并使用潜在的lxml API,那就可能。

一般方法是访问与要检查和修改的图片对应的ImagePart实例,然后读取和写入._blob属性(将图像文件保存为字节)。 / p>

此示例XML可能会有所帮助: http://python-docx.readthedocs.io/en/latest/dev/analysis/features/shapes/picture.html#specimen-xml

从包含图片的内嵌形状中,您可以获得<a:blip>元素:

blip = inline_shape._inline.graphic.graphicData.pic.blipFill.blip

关系id(r:id通常,但r:在这种情况下嵌入)可在以下位置获得:

rId = blip.embed

然后您可以从文档部分

获取图像部分
document_part = document.part
image_part = document_part.related_parts[rId]

然后二进制图像可用于._blob上的读写。

如果您编写新的blob,它将在保存时替换之前的图像。

您可能希望让它使用单个图像并在扩展到单个文档中的多个图像之前感受它。

可能存在一个或两个缓存的图像特征,因此在保存并重新加载文件之前可能无法获得所有更精细的点,因此请注意这一点。

不是因为你可以看到的那个胆小的人,但是如果你想要它足够糟糕并且可以追溯一下代码那么应该可以工作:)

答案 1 :(得分:1)

您还可以通过一个简单的循环检查段落,并检查哪个xml包含图像(例如,如果xml包含“ graphicData”),也就是一个图像容器(您可以对运行进行相同操作):< / p>

from docx import Document

image_paragraphs = []
doc = Document(path_to_docx)
for par in doc.paragraphs:
    if 'graphicData' in par._p.xml:
        image_paragraphs.append(par)

与解压缩docx文件相比,图像位于“图像”文件夹中,并且其顺序与image_paragraphs列表中的顺序相同。在每个段落元素上,都有许多更改方式。如果要提取img处理它,然后将其插入到同一位置,则

paragraph.clear()
paragraph.add_run('your description, if needed')
run = paragraph.runs[0]
run.add_picture(path_to_pic, width, height)

答案 2 :(得分:1)

因此,我在这里从未真正写过任何答案,但我认为这可能是解决您的问题的方法。使用此小代码,您可以在所有段落中看到图像的位置。希望对您有所帮助。

meterManagementService.getResult()