使用python-docx提取图片和题注的方法

直接提取图片的方法有很多,但是要同时获取题注信息就比较复杂。本文提取题注基本思路:遍历全部段落,选取图片特征信息,计数并获取下方段号,提取其文本作为题注信息。段落是自然形成的,并无id属性,所以需要遍历获取。

使用python-docx提取文档中的元素,需要熟悉文档内部的文件结构。

一、docx文档内部结构

我们常用的Office Word格式分为doc和docx两种格式,doc是Word 97-2003版本使用的格式,Word2007及其之后的版本,默认格式是docx。

doc使用的是office 97-03的存储规范:OLE。它是一种对象链接和嵌入的技术,该技术可以包含文本,图形,电子表格甚至其他二进制数据。

docx使用OpenXML(OOXML)协议,它是微软在Office 2007中提出的一种新的文档格式,Office 2007及其以后的Word、Excel、PowerPoint默认均采用OpenXML格式。

我们后面讨论的都只针对docx格式的文件,doc文件的解析有另外一套规范。doc文件可以转换为docx。所以就不再讨论doc文件如何解析。

将文件格式docx改为rar,用解压软件打开:

将文件格式docx改为rar,用解压软件打开

大致文件结构如下:

docx文件可以解压,解压之后的文件结构大致如下:

document.xml文件包含了大部分与文档内容有关的信息,因此可以重点研究它。

二、分析document.xml中图片信息

将demo.dcox,改名为demo.rar解压找到word目录下的document.xml并用浏览器打开。文档中已知有三张插图,搜索image关键字,发现有三个搜索结果。

对比查看document.xml和paragraph子对象_element的xml属性值发现,标签包裹的内容基本一致,w:p标记应是段落标记。


document.xml中的图片信息


paragraph子对象_element的xml属性

三、有效的代码



import docx

import os, re

word_path="demo.docx"

result_path=os.getcwd()

doc = docx.Document(word_path)

images=[]

pCount=0

    for pin doc.paragraphs:

pCount +=1

        if "imagedata" in p._element.xml:

#注意!不同的计算机,又有不一样的情况了:原来是检索“imagedata”,现在在这个电脑检索就不对了。

            #试了一下,并非word和金山的原因。

            rID= re.findall("v:imagedata r:id=\"(.*?)\"", p._element.xml)[0]

p.part.rels[rID].target_ref

pNam=doc.paragraphs[pCount].text

part=doc.part.related_parts[rID]

#paragraph中的part.rels[rID]应当也可以使用

            images.append([pNam,part])#此处应注意方法别少了(),有的错误并没有被爆出,是因为[]干扰了()的语法识别。

            #把下一段的内容作为题注传入images

        for imagein images:

with open(word_path+image[0]+image[1].filename,'wb')as fp :

fp.write(image[1].blob)


四、出现的问题

最初在一台计算机上观察xml属性上有"v:imagedata r:id="

通过代码rID= re.findall("v:imagedata r:id=\"(.*?)\"", p._element.xml)[0]即可提取图片的地址。

但是在另一台计算机上进行提取操作时,却发现其xml属性并不包含此关键信息。似乎document.xml内的结构出现一些区别。此时要查找<pic:pic>仅能找到其中两张图片,另一张swf格式图片不能被找到。

 五、存在的问题,待解决后再更新。

两个计算机使用word版本区别:前者使用Office专业增强版2016,版本:2311;后者使用Office Mondo 2016,版本:2310。对同一个文件保存后再修改原文件结构没变化,表明这与word的版本无关。


两种不同的内嵌图片描述

前者无“pic:pic”,而“imagedata”与内嵌图片所在段落位置对应。

后者"imagedata"与内嵌图片无关,且大量存在“pic:pic”。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352