python-docx -- 读取word图片

文章目录

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

概念介绍

从概念上来讲,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_Blipdef extract_pics(file_path: str) -> None:doc = Document(file_path)for idx, shape in enumerate(doc.inline_shapes):# 获取图片的ridrid = shape._inline.graphic.graphicData.pic.blipFill.blip.embed# 图片的名称name = shape._inline.docPr.name# 根据rid获取图片对象image_obj = doc.part.rels.get(rid).target_part.imageprint("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/.cmheight = shape.heightprint("\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="UEsDBBQABgAIAAAAIQC2gziS/gAAAOEBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRQU7DMBBF 90jcwfIWJU67QAgl6YK0S0CoHGBkTxKLZGx5TGhvj5O2G0SRWNoz/78nu9wcxkFMGNg6quQqL6RA 0s5Y6ir5vt9lD1JwBDIwOMJKHpHlpr69KfdHjyxSmriSfYz+USnWPY7AufNIadK6MEJMx9ApD/oD OlTrorhX2lFEilmcO2RdNtjC5xDF9pCuTyYBB5bi6bQ4syoJ3g9WQ0ymaiLzg5KdCXlKLjvcW893 SUOqXwnz5DrgnHtJTxOsQfEKIT7DmDSUCaxw7Rqn8787ZsmRM9e2VmPeBN4uqYvTtW7jvijg9N/y JsXecLq0q+WD6m8AAAD//wMAUEsDBBQABgAIAAAAIQA4/SH/1gAAAJQBAAALAAAAX3JlbHMvLnJl bHOkkMFqwzAMhu+DvYPRfXGawxijTi+j0GvpHsDYimMaW0Yy2fr2M4PBMnrbUb/Q94l/f/hMi1qR JVI2sOt6UJgd+ZiDgffL8ekFlFSbvV0oo4EbChzGx4f9GRdb25HMsYhqlCwG5lrLq9biZkxWOiqY 22YiTra2kYMu1l1tQD30/bPm3wwYN0x18gb45AdQl1tp5j/sFB2T0FQ7R0nTNEV3j6o9feQzro1i OWA14Fm+Q8a1a8+Bvu/d/dMb2JY5uiPbhG/ktn4cqGU/er3pcvwCAAD//wMAUEsDBBQABgAIAAAA IQC4Xd63ZAIAAB4FAAAOAAAAZHJzL2Uyb0RvYy54bWysVE1v2zAMvQ/YfxB0X22nX1lQpwhadBhQ tMXaoWdFlmoDsqhRSuzs14+SHadoix2GXWRKJB+p50ddXPatYVuFvgFb8uIo50xZCVVjX0r+8+nm y5wzH4SthAGrSr5Tnl8uP3+66NxCzaAGUylkBGL9onMlr0Nwiyzzslat8EfglCWnBmxFoC2+ZBWK jtBbk83y/CzrACuHIJX3dHo9OPky4WutZLjX2qvATMmpt5BWTOs6rtnyQixeULi6kWMb4h+6aEVj qegEdS2CYBts3kG1jUTwoMORhDYDrRup0h3oNkX+5jaPtXAq3YXI8W6iyf8/WHm3fXQPSDR0zi88 mfEWvcY2fqk/1ieydhNZqg9M0uGsmM3PZ8ecSfKdnc6Pz+aRzeyQ7dCHbwpaFo2SI/2MxJHY3vow hO5DKO9QP1lhZ1RswdgfSrOmihVTdpKGujLItoJ+qpBS2VAMrlpUajguTvM8/V3qZ8pI3SXAiKwb YybsESDK7j320OsYH1NVUtaUnP+tsSF5ykiVwYYpuW0s4EcAhm41Vh7i9yQN1ESWQr/uKSSaa6h2 D8gQBol7J28aov1W+PAgkDRN6qc5Dfe0aANdyWG0OKsBf390HuNJauTlrKMZKbn/tRGoODPfLYnw a3FyEocqbU5Oz2e0wdee9WuP3bRXQH+soBfByWTG+GD2pkZon2mcV7EquYSVVLvkMuB+cxWG2aUH QarVKoXRIDkRbu2jkxE8Ehxl9dQ/C3Sj9gKp9g728yQWbyQ4xMZMC6tNAN0kfR54HamnIUwaGh+M OOWv9ynq8Kwt/wAAAP//AwBQSwMEFAAGAAgAAAAhABcwhdzeAAAACQEAAA8AAABkcnMvZG93bnJl di54bWxMj0FPwzAMhe9I/IfISNxYunZUXWk6TQgOu7Ex7Zw1XluROFWTbYVfjzmxm/3e0/PnajU5 Ky44ht6TgvksAYHUeNNTq2D/+f5UgAhRk9HWEyr4xgCr+v6u0qXxV9riZRdbwSUUSq2gi3EopQxN h06HmR+Q2Dv50enI69hKM+orlzsr0yTJpdM98YVOD/jaYfO1OzsFP5uTTD7CW7Ffb5bPWb+1h4O2 Sj0+TOsXEBGn+B+GP3xGh5qZjv5MJgirYJkvOMl6kYNgf5HNeTiykKYZyLqStx/UvwAAAP//AwBQ SwECLQAUAAYACAAAACEAtoM4kv4AAADhAQAAEwAAAAAAAAAAAAAAAAAAAAAAW0NvbnRlbnRfVHlw ZXNdLnhtbFBLAQItABQABgAIAAAAIQA4/SH/1gAAAJQBAAALAAAAAAAAAAAAAAAAAC8BAABfcmVs cy8ucmVsc1BLAQItABQABgAIAAAAIQC4Xd63ZAIAAB4FAAAOAAAAAAAAAAAAAAAAAC4CAABkcnMv ZTJvRG9jLnhtbFBLAQItABQABgAIAAAAIQAXMIXc3gAAAAkBAAAPAAAAAAAAAAAAAAAAAL4EAABk cnMvZG93bnJldi54bWxQSwUGAAAAAAQABADzAAAAyQUAAAAA " 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:# 找到runif 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.rhkb.cn/news/465708.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python数据可视化seaborn

产品经理在做数据分析时可能需要通过可视化来分析。seaborn官网 1. relplot 散点图 https://seaborn.pydata.org/examples/scatterplot_sizes.html import pandas as pd import seaborn as sns df pd.DataFrame({x: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],y: [8, 6, 7, 8, 4, 6,…

释放专利力量:Patently 如何利用向量搜索和 NLP 简化协作

作者&#xff1a;来自 Elastic Matt Scourfield, Andrew Crothers, Brian Lambert 组织依靠知识产权 (IP) 来推动创新、保持竞争优势并创造收入来源。对于希望将新产品推向市场的公司来说&#xff0c;弄清楚谁拥有哪些专利是一项必不可少的能力。搜索数百万项专利可能既困难又耗…

协议栈攻击分类(CISP-PTE笔记)

CISP-PTE笔记 协议栈攻击分类 1.协议栈自身的脆弱性 ​ 1&#xff09;缺乏数据源验证机制 ​ 2&#xff09;缺乏完整性验证机制 ​ 3&#xff09;缺乏机密性验证机制 2.网络接口层攻击 3.网络层攻击 4.应用层攻击 网络攻击的基本模式 被动威胁&#xff08;不影响通信双…

SpringBoot3集成Junit5

目录 1. 确保项目中包含相关依赖2. 配置JUnit 53. 编写测试类4、Junit5 新增特性4.1 注解4.2 断言4.3 嵌套测试4.4 总结 在Spring Boot 3中集成JUnit 5的步骤相对简单。以下是你可以按照的步骤&#xff1a; 1. 确保项目中包含相关依赖 首先&#xff0c;确保你的pom.xml文件中…

智慧城市智慧城市项目方案-大数据平台建设技术方案(原件Word)

第1章 总体说明 1.1 建设背景 1.2 建设目标 1.3 项目建设主要内容 1.4 设计原则 第2章 对项目的理解 2.1 现状分析 2.2 业务需求分析 2.3 功能需求分析 第3章 大数据平台建设方案 3.1 大数据平台总体设计 3.2 大数据平台功能设计 3.3 平台应用 第4章 政策标准保障…

算法练习:904. 水果成篮

题目链接&#xff1a;904. 水果成篮。 题目意思就是可以选取两个种类的水果不能超过两个种类&#xff0c;该种类个数没有限制&#xff0c; 但是一旦超过两个种类的水果就要停止计数。 示例中数组编号就是就是种类&#xff0c;就是不能出现三个不同编号的数。 1.暴力解法&…

wincc中全局脚本C(c语言脚本)的研究和解密

文章目录 前言一、分析 前言 很多时候我们在wincc中写全局脚本时会为自己的脚本添加密码&#xff0c;但很久很久以后再想修改密码忘记了怎么办呢。 一、分析 经过分析编码有了下面成功 ![请添加图片描述](https://i-blog.csdnimg.cn/direct/33baf91a49da410e82f16b4fbd746c48…

Java+控制台 商城销售系统

Java控制台 商城销售系统 一、系统介绍二、功能展示1.系统登陆2.二维数组实现商城销售系统3.类集实现商城销售系统 四、其它1.其他系统实现 一、系统介绍 实现一个xx商城销售系统的登录功能: 1)&#xff09;打开系统&#xff0c;给出欢迎信息。 2&#xff09;将用户名和密码定…

微服务中常用分布式锁原理及执行流程

1.什么是分布式锁 分布式锁是一种在分布式系统环境下实现的锁机制&#xff0c;它主要用于解决&#xff0c;多个分布式节点之间对共享资源的互斥访问问题&#xff0c;确保在分布式系统中&#xff0c;即使存在有多个不同节点上的进程或线程&#xff0c;同一时刻也只有一个节点可…

A15基于Spring Boot的宠物爱心组织管理系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

测试自动化如何和业务流程结合?

测试自动化框架固然重要&#xff0c;但是最终自动化的目的都是为了业务服务的。 那测试自动化如何对业务流程产生积极影响&#xff1f; 业务流程的重要性 测试自动化项目并非孤立存在&#xff0c;其生命周期与被测试的应用程序紧密相关。项目的价值在于被整个开发团队所使用&a…

AI - 使用LangChain请求LLM结构化生成内容

AI - 使用LangChain请求LLM结构化生成内容 基于深度学习的大型语言模型&#xff08;LLM&#xff09;不仅可以生成文本&#xff0c;还可以帮助我们完成许多复杂任务&#xff0c;如自动化客服、内容创作和数据分析。然而&#xff0c;如何从这些模型中结构化地获取输出&#xff0c…

使用GPT-SoVITS训练语音模型

1.项目演示 阅读单句话 1725352713141 读古诗 1725353700203 2.项目环境 开发环境&#xff1a;linux 机器配置如下&#xff1a;实际使用率百分之二十几&#xff0c; 3.开发步骤 1.首先是准备数据集&#xff0c;要求是wav格式&#xff0c;一到两个小时即可&#xff0c; 2.…

UML的另一个主角——用例图

顺序图和类图已经出过单集&#xff0c;本贴要分享的是用例图。 类图https://blog.csdn.net/jsl123x/article/details/143526286?spm1001.2014.3001.5501顺序图https://jslhyh32.blog.csdn.net/article/details/134350587 目录 一.系统 二.参与者 1.主要参与者 2.次要参与…

set和map的使用

目录 1.关联式容器 2.键值对 3.set 3.1set的模版参数列表 3.2对set的修改 3.2.1insert 3.2.2 erase 3.2.3clear 3.2.4swap 3.2.5 find 3.3set的迭代器 3.4set的容量 4.map 4.1对map的修改 4.1.1insert 4.1.2erase 4.1.3swap 4.1.4clear 4.2map的迭代器 4.3opera…

【5.10】指针算法-快慢指针将有序链表转二叉搜索树

一、题目 给定一个单链表&#xff0c;其中的 元素按升序排序 &#xff0c;将其转换为 高度平衡的二叉搜索树 。 本题中&#xff0c;一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。 示例: 给定的有序链表&#xff1a; [ -10 , -3 , 0 , …

dns服务器配置

主服务器 1.挂载点 mount /dev/sr0 /mnt 2.防火墙关闭 systemctl stop firewalld setenforce 0 3.下载bind软件 dnf install bind -y 4.进行正向解析配置 vim /etc/named.conf options { listen-on port 53 { 192.168.92.128; }; directo…

stable diffusion图生图

本节内容&#xff0c;给大家带来的是stable diffusion的图生图课程&#xff0c;我们在midjourney的课程中有学习过midjourney的图生图功能&#xff0c;即使用垫图的方式来引导AI绘制图片。图生图是AI绘图程序一个非常重要的功能&#xff0c;stable diffusion同样提供了类似的功…

论文阅读笔记:DRCT: Saving Image Super-Resolution away from Information Bottleneck

论文阅读笔记&#xff1a;DRCT: Saving Image Super-Resolution away from Information Bottleneck 1 背景1.1 问题1.2 本文提出的方法 2 创新点3 方法4 模块4.1 问题描述4.2 深度特征提取模块4.3 同任务渐进式训练策略 5 效果5.1 和SOTA方法对比 论文&#xff1a;https://arxi…

一周内从0到1开发一款 AR眼镜 相机应用?

目录 1. &#x1f4c2; 前言 2. &#x1f4a0; 任务拆分 2.1 产品需求拆分 2.2 开发工作拆分 3. &#x1f531; 开发实现 3.1 代码目录截图 3.2 app 模块 3.3 middleware 模块 3.4 portal 模块 4. ⚛️ 拍照与录像 4.1 前滑后滑统一处理 4.2 初始化 View 以及 Came…