我正在尝试使用 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
从包含图片的内联形状中,您可以获得
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,它将在保存时替换以前的图像。
您可能希望让它处理单个图像,并在放大到单个文档中的多个图像之前感受一下它。
可能会缓存一两个图像特征,因此在保存并重新加载文件之前,您可能无法获得所有细节,因此请注意这一点。
如您所见,不适合胆小的人,但如果您想要它足够糟糕并且可以:)地跟踪代码,应该可以工作
您还可以使用简单的循环检查段落,并检查哪个 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)