繁体   English   中英

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

[英]Extract image position from .docx file using python-docx

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

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以厘米为单位获取高度。 我的主要要求是了解图像在文档中的位置,因为我需要提取图像并对其进行一些工作,然后再次将图像放回同一位置

API 不直接支持此操作。

但是,如果您愿意深入了解内部结构并使用底层的lxml API,这是可能的。

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

这个样本 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:embed)可在以下位置获得:

rId = blip.embed

然后你可以从文档部分获取图像部分

document_part = document.part
image_part = document_part.related_parts[rId]

然后二进制图像可用于在._blob._blob

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

您可能想让它处理单个图像并在将单个文档中的多个图像放大之前对其进行感受。

可能会缓存一两个图像特征,因此在保存并重新加载文件之前,您可能无法获得所有更精细的点,因此请对此保持警惕。

正如您所看到的,不适合胆小的人,但如果您想要它足够糟糕并且可以稍微跟踪代码,则应该可以工作:)

您还可以使用简单的循环检查段落,并检查哪个 xml 包含图像(例如,如果 xml 包含“graphicData”),即哪个是图像容器(您可以对运行执行相同的操作):

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 文件后,图像位于“images”文件夹中,它们的顺序与它们在 image_paragraphs 列表中的顺序相同。 在每个段落元素上,您有很多选择如何更改它。 如果您想提取 img 处理它并将其插入到同一个地方,那么

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

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

import docx

doc = docx.Document(filename)

paraGr = []             
index = []

par = doc.paragraphs
for i in range(len(par)):
     paraGr.append(par[i].text)
     if 'graphicData' in par[i]._p.xml:
         index.append(i)

如果您使用的是 Python 3

pip install python-docx

import docx
doc = docx.Document(document_path)
P = []
I = []
par = doc.paragraphs
for i in range(len(par)):
     P.append(par[i].text)
     if 'graphicData' in par[i]._p.xml:
         I.append(i)
print(I)

#返回索引列表(Image_Reference)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM