python-docx -- 读取word图片

news2024/11/7 14:30:44

文章目录

  • 概念介绍
  • 形状对象
  • 读取图片
  • 自定义图形

概念介绍

从概念上来讲,word文档分为两层,一个文本层,一个绘画层;

  • 文本层,从上到下,从左到右,流式排版,本页填满则开启新页面;
  • 图层,绘画的对象也称作shapes,可以放在任意的位置。有时也被称为浮动的shapes;
    • 图片,可以出现在文本层、图层,在文本层时称为inline shapes(内联的图形),被当做一个大的文本字符,行高相应增加以适应当前图片,图片会放在一行,并且有合适的宽度;
    • 通常,图片单独放在一个段落中,当然它的前面、后面也可以有文本。
    • 写入文本时,python-docx仅支持内联图片(inline pictures),通过add_picture()方法添加文档末尾的一个段落中,也可以在该段落内图片的两边添加文本。
       

形状对象

  • InlineShapes 对象
    • 类 docx.shape.InlineShapes(body_elm: CT_Body, parent: StoryPart)
    • InlineShape对象的序列,可迭代,可索引访问;
    • Document实例调用inline_shapes 获取所有的图片;
       
  • InlineShape 对象
    • 类 docx.shape.InlineShape(inline: CT_Inline)
    • 是inline图形对象的容器,代理底层xml <wp:inline>元素;通过 _inline属性获取底层xml元素(<CT_Inline ‘wp:inline’ at 0x16f8a7c4e50>)
    • width/height (读写)属性,是一个Length对象,显示的宽度、高度;
    • type, 只读属性,类型; docx.enum.shape.WD_INLINE_SHAPE
>>> inline_shape.height   # Length对象
914400
>>> inline_shape.height.inches  # 英寸
1.0

 

读取图片

读取word中粘贴的图片,插入的图片等;

# __author__ = "laufing"
# 抽取 docx 中的图片
from typing import List
from docx import Document
from docx.enum.shape import WD_INLINE_SHAPE_TYPE
from docx.image.image import Image
from docx.oxml import CT_Inline, CT_GraphicalObject, CT_GraphicalObjectData, CT_Picture, CT_BlipFillProperties, CT_Blip


def extract_pics(file_path: str) -> None:
    doc = Document(file_path)
    for idx, shape in enumerate(doc.inline_shapes):
        # 获取图片的rid
        rid = shape._inline.graphic.graphicData.pic.blipFill.blip.embed
        # 图片的名称
        name = shape._inline.docPr.name
        # 根据rid获取图片对象
        image_obj = doc.part.rels.get(rid).target_part.image
        print("image:", image_obj)
        print("file_name:", image_obj.filename)
        print("扩展名:", image_obj.ext)
        print("图片二进制数据:", image_obj.blob)
        print("图片二进制数据hash:", image_obj.sha1)
        print("内容类型:", image_obj.content_type)

        print("像素宽高{}x{}:".format(image_obj.px_width, image_obj.px_height))
        print("分辨率{} x {}".format(image_obj.horz_dpi, image_obj.vert_dpi))
        # 解析图片信息
        width = shape.width,  # Lendth对象  可以继续调用.inches/.pt/.cm
        height = shape.height

        print("\n")


if __name__ == '__main__':
    word_path = r"C:\Users\lenovo\Desktop\cc\lauf_chapter_old.docx"
    extract_pics(word_path)

输出:
在这里插入图片描述
 

自定义图形

  1. 底层xml
    word/excel 本身是一个压缩文件,将word改名为.zip, 即可解压,在document.xml中可以查看到如下内容:
<mc:AlternateContent>
	<mc:Choice Requires="wps">
		<w:drawing>
			<wp:anchor distT="0" distB="0" distL="114300" distR="114300" simplePos="0" relativeHeight="251659264" behindDoc="0" locked="0" layoutInCell="1" allowOverlap="1" wp14:anchorId="7EAC963D" wp14:editId="53638C19">
				<wp:simplePos x="0" y="0"/>
				<wp:positionH relativeFrom="column">
					<wp:posOffset>612267</wp:posOffset>
				</wp:positionH>
				<wp:positionV relativeFrom="paragraph">
					<wp:posOffset>117933</wp:posOffset>
				</wp:positionV>
				<wp:extent cx="2128723" cy="658368"/>
				<wp:effectExtent l="0" t="0" r="24130" b="27940"/>
				<wp:wrapNone/>
				<wp:docPr id="1491957454" name="矩形 1"/>
				<wp:cNvGraphicFramePr/>
				<a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
					<a:graphicData uri="http://schemas.microsoft.com/office/word/2010/wordprocessingShape">
						<wps:wsp>
							<wps:cNvSpPr/>
							<wps:spPr>
								<a:xfrm>
									<a:off x="0" y="0"/>
									<a:ext cx="2128723" cy="658368"/>
								</a:xfrm>
								<a:prstGeom prst="rect">
									<a:avLst/>
								</a:prstGeom>
							</wps:spPr>
							
							<wps:style>
								<a:lnRef idx="2">
									<a:schemeClr val="accent1">
										<a:shade val="15000"/>
									</a:schemeClr>
								</a:lnRef>
								<a:fillRef idx="1">
									<a:schemeClr val="accent1"/>
								</a:fillRef>
								<a:effectRef idx="0">
									<a:schemeClr val="accent1"/>
								</a:effectRef>
								<a:fontRef idx="minor">
									<a:schemeClr val="lt1"/>
								</a:fontRef>
							</wps:style>
							<wps:txbx>
								<w:txbxContent>
									<w:p w14:paraId="29343860" w14:textId="0DB31DD1" w:rsidR="00BD204B" w:rsidRDefault="00BD204B" w:rsidP="00BD204B">
										<w:pPr>
											<w:jc w:val="center"/>
											<w:rPr>
												<w:rFonts w:hint="eastAsia"/>
											</w:rPr>
										</w:pPr>
										<w:r>
											<w:rPr>
												<w:rFonts w:hint="eastAsia"/>
											</w:rPr>
											<w:t>这是自己添加的图形</w:t>
										</w:r>
									</w:p>
								</w:txbxContent>
							</wps:txbx>
							
							<wps:bodyPr rot="0" spcFirstLastPara="0" vertOverflow="overflow" horzOverflow="overflow" vert="horz" wrap="square" lIns="91440" tIns="45720" rIns="91440" bIns="45720" numCol="1" spcCol="0" rtlCol="0" fromWordArt="0" anchor="ctr" anchorCtr="0" forceAA="0" compatLnSpc="1">
								<a:prstTxWarp prst="textNoShape">
									<a:avLst/>
								</a:prstTxWarp>
								<a:noAutofit/>
							</wps:bodyPr>
						</wps:wsp>
					</a:graphicData>
				</a:graphic>
			</wp:anchor>
		</w:drawing>
	</mc:Choice>


	<mc:Fallback>
		<w:pict>
			<v:rect w14:anchorId="7EAC963D" id="矩形 1" o:spid="_x0000_s1026" style="position:absolute;left:0;text-align:left;margin-left:48.2pt;margin-top:9.3pt;width:167.6pt;height:51.85pt;z-index:251659264;visibility:visible;mso-wrap-style:square;mso-wrap-distance-left:9pt;mso-wrap-distance-top:0;mso-wrap-distance-right:9pt;mso-wrap-distance-bottom:0;mso-position-horizontal:absolute;mso-position-horizontal-relative:text;mso-position-vertical:absolute;mso-position-vertical-relative:text;v-text-anchor:middle" o:gfxdata="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 " fillcolor="#4472c4 [3204]" strokecolor="#09101d [484]" strokeweight="1pt">
				<v:textbox>
					<w:txbxContent>
						<w:p w14:paraId="29343860" w14:textId="0DB31DD1" w:rsidR="00BD204B" w:rsidRDefault="00BD204B" w:rsidP="00BD204B">
							<w:pPr>
								<w:jc w:val="center"/>
								<w:rPr>
									<w:rFonts w:hint="eastAsia"/>
								</w:rPr>
							</w:pPr>
							<w:r>
								<w:rPr>
									<w:rFonts w:hint="eastAsia"/>
								</w:rPr>
								<w:t>这是自己添加的图形</w:t>
							</w:r>
						</w:p>
					</w:txbxContent>
				</v:textbox>
			</v:rect>
		</w:pict>
	</mc:Fallback>

</mc:AlternateContent>
  1. 代码解析

def extract_shapes(file_path: str) -> None:
    """ 抽取图形 """
    doc = Document(file_path)
    # 在段落中抽取图形
    for idx, para in enumerate(doc.element.body):
        for run in para:
            # 找到run
            if isinstance(run, CT_R):
                for inner_run in run:
                    tag_name = inner_run.tag.split("}")[1]
                    if tag_name == "AlternateContent":  # lxml.etree._Element对象
                        fallback = inner_run[1]
                        pict = fallback[0]
                        shape = pict[0]  # 内部图形
                        print("图形数据:", shape.items())
                        textbox = list(shape) # shape内部是否有文本,需判断
                        if textbox:
                            textbox = textbox[0]
                            # 图形内的段落文本
                            para_list = list(textbox[0])
                            print("图形内部文本:", [para.text for para in para_list])

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2235074.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python邮差:如何用代码精确投递商品快递费用的密信

目录 一、准备工作 二、编写API请求脚本 三、解析与处理快递费用数据 四、案例应用&#xff1a;模拟电商平台的快递费用计算 五、自动化邮件通知 六、总结 在电子商务的广阔天地里&#xff0c;精确计算并快速传递商品快递费用是一项至关重要的任务。作为Python邮差&#…

swoole扩展安装--入门篇

对于php来说&#xff0c;swoole是个强大的补充扩展。这是我第3次写swoole扩展安装&#xff0c;这次基于opencloudos8系统&#xff0c;php使用8.2。 安装swoole扩展首先想到的是用宝塔来安装&#xff0c;毕竟安装方便&#xff0c;还能统一管理。虽然获得swoole版本不是最新的&am…

Linux信号_信号的保存

我们知道向进程发送信号&#xff0c;进程并不是立即处理&#xff0c;而是等合适的时机进行处理。那么就需要保存信号。在信号的产生中说过信号保存在进程PCB里面的信号位图里&#xff0c;那信号位图到底是什么&#xff1f; 一.信号保存 我们先补充一些概念 1.阻塞 忽略概念 实…

如何使用示波器测量信号强度

示波器是一种用于观察和分析电信号的电子测试仪器。它可以显示信号的波形、幅度、频率和其他特性&#xff0c;是工程师和技术人员进行电路设计、调试和故障排除的重要工具。本文将详细介绍如何使用示波器测量信号强度。 一、认识示波器的基本组成部分 显示屏&#xff1a;用于显…

Axure设计之三级联动选择器教程(中继器)

使用Axure设计三级联动选择器&#xff08;如省市区选择器&#xff09;时&#xff0c;可以利用中继器的数据存储和动态交互功能来实现。下面介绍中继器三级联动选择器设计的教程&#xff1a; 一、效果展示&#xff1a; 1、在三级联动选择器中&#xff0c;首先选择省份&#xff…

K8S篇(基本介绍)

目录 一、什么是Kubernetes&#xff1f; 二、Kubernetes管理员认证&#xff08;CKA&#xff09; 1. 简介 2. 考试难易程度 3. 考试时长 4. 多少分及格 5. 考试费用 三、Kubernetes整体架构 Master Nodes 四、Kubernetes架构及和核心组件 五、Kubernetes各个组件及功…

卖模版还能赚到钱吗?

说到赚钱&#xff0c;我想大部分人都会感兴趣。但如果告诉大家现阶段卖模板也能赚钱&#xff0c;可能还是有人不信。我要说说我的观察了。 本文可在公众号「德育处主任」免费阅读 我是一只临期程序猿&#xff0c;我最早接触到“模板能卖钱”这个概念是在模板王里。模板王平台上…

超萌!HTMLCSS:打造趣味动画卡通 dog

这段HTML与CSS代码实现了一个超萌的动画卡通dog。 HTML <div class"dog"><div class"dog-body"><div class"dog-tail"><div class"dog-tail"><div class"dog-tail"><div class"do…

Elasticsearch Interval 查询:为什么它们是真正的位置查询,以及如何从 Span 转换

作者&#xff1a;来自 Elastic Mayya Sharipova 解释 span 查询如何成为真正的位置查询以及如何从 span 查询过渡到它们。 长期以来&#xff0c;Span 查询一直是有序和邻近搜索的工具。这些查询对于特定领域&#xff08;例如法律或专利搜索&#xff09;尤其有用。但相对较新的 …

【YOLOv11[基础]】实例分割Seg | 导出ONNX模型 | ONN模型推理以及检测结果可视化 | python

本文将导出YOLO-Seg.pt模型对应的ONNX模型,并且使用ONNX模型推理以及结果的可视化。话不多说,先看看效果图吧!!! 目录 一 导出ONNX模型 二 推理及检测结果可视化 1 代码 2 效果图

手搓AI大模型应用获25万用户,果断辞职创业,结果收入不如摆摊

我开发的 AI 应用有 25 万用户&#xff0c;我感觉要起飞了&#xff0c;于是辞掉工作&#xff0c;准备大干一番。 结果没想到开局即巅峰&#xff0c;突然就完蛋了。 这几天&#xff0c;一个悲催的程序员创业故事在社交网络上流传&#xff0c;引发了人们的深思。 故事的主人公&…

品质生活新选择:看三星AI神黑钻衣物护理机,如何为用户打造精致日常

屠格涅夫曾说&#xff0c;一个人应当好好地安排生活&#xff0c;要使每一刻的时光都有意义。这不仅是对个人生活的深刻洞察&#xff0c;也是对生活品质的不懈追求。实际上&#xff0c;在追求品质生活的道路上&#xff0c;无关乎年龄和阶层&#xff0c;其核心精髓往往潜藏于那些…

ios打包文件上传App Store windows工具

在苹果开发者中心上架IOS APP的时候&#xff0c;在苹果开发者中心不能直接上传打包文件&#xff0c;需要下载mac的xcode这些工具进行上传&#xff0c;但这些工具无法安装在windows或linux电脑上。 这里&#xff0c;我们可以不用xcode这些工具来上传&#xff0c;可以用国内的香…

Nginx(编译)+Lua脚本+Redis 实现自动封禁访问频率过高IP

1.安装lua 1.1安装LuaJIT yum install readline-devel mkdir -p lua-file cd lua-file/ wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz tar -zxvf LuaJIT-2.0.5.tar.gz cd LuaJIT-2.0.5 make && make install PREFIX/usr/local/luajit 1.2配置LuaJIT环境变量…

OA项目 python + vue3

准备工作 创建django项目 在setting.py进行数据库的配置&#xff1a; DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: , #数据库名字USER: , #连接的数据库的用户名PASSWORD: ,HOST: 127.0.0.1,PORT: 3306,} }安装app&#xff1a; rest_framwork: 关闭csrf…

内网渗透-信息收集篇

通过webshell或其他方式拿下一台机器&#xff0c;并且存在内网环境&#xff0c;这个时候就在准备进行内网渗透&#xff0c;而在内网渗透之前需要对本地机器进行信息收集&#xff0c;才能够更好的进行内网渗透。 目录 Windows本地基础信息收集 权限查看 判断域存在 查看防火…

斯坦福团队研发:手机运行的超GPT-4大模型一夜爆红,下载量突破2000次

在大模型落地应用的过程中&#xff0c;端侧 AI 是非常重要的一个方向。 近日&#xff0c;斯坦福大学研究人员推出的 Octopus v2 火了&#xff0c;受到了开发者社区的极大关注&#xff0c;模型一夜下载量超 2k。 20 亿参数的 Octopus v2 可以在智能手机、汽车、个人电脑等端侧…

【OpenAI】使用O1-Preview模型的3种方式,带你快速提升编程效率!

文章目录 一、模型概述1. GPT-3.5&#xff1a;坚实的基础2. GPT-4.0&#xff1a;突破性的升级3. GPT-4o&#xff1a;多模态处理的先锋4. GPT-4o MINI&#xff1a;轻量高效的AI解决方案5. O1-Preview&#xff1a;推理能力的极致提升 二、性能与应用场景对比性能与应用场景深入解…

一文轻松了解AUTOSAR系统开发步骤顺序

目录 往期推荐 AUTOSAR方法论的典型开发步骤顺序 1. 需求分析&#xff08;Requirement Analysis&#xff09; 2. 系统架构设计&#xff08;System Architecture Design&#xff09; 3. 软件组件设计与实现&#xff08;Software Component Design and Implementation&#…

计算机毕业设计Python+图神经网络手机推荐系统 手机价格预测 手机可视化 手机数据分析 手机爬虫 Django Flask Spark 知识图谱

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…