解决使用python提取word文档中所有的图片时图片丢失的问题

python解析word文档,提取文档中所有的图片并保存,并将原图位置用占位符替换。

问题描述

利用python-dox库解析word文档,并提取里面的所有图片时发现会出现一摸一样的图片只解析一次,导致图片丢失,数量不对的情况。

解决方法

通过例如 lxml 或直接解析 Word 的结构解决 例如,读取每个图片引用的具体关系

  1. 解析 Word 文档的内容:我们需要读取 document.xml 来找到所有的 <w:drawing> 元素。
  2. 解析关系文件:在 word/_rels/document.xml.rels 文件中,每张图片都有一个关系定义,你需要读取这个文件来找到图像的实际存储路径。
  3. 提取和保存图像:最后,从 Word 的 ZIP包里把真正的图像提取出来保存到本地。

代码

import os
from datetime import datetime
from docx import Document
from docx.oxml.ns import qn
import zipfile
import os
from zipfile import ZipFile
from lxml import etreedef extract_images_and_replace(docx_path, output_docx_path, images_dir):# 打开 docx 文件作为 Zipbase_filename=os.path.splitext(os.path.basename(docx_path))[0]with ZipFile(docx_path, 'r') as docx:# 读取 word/document.xml 文件document_xml = docx.read('word/document.xml')root = etree.XML(document_xml)# 读取 word/_rels/document.xml.rels 文件rels_xml = docx.read('word/_rels/document.xml.rels')rels_root = etree.XML(rels_xml)# 查找所有的 <w:drawing> 元素drawing_elements = root.findall('.//{http://schemas.openxmlformats.org/wordprocessingml/2006/main}drawing')# 创建输出目录os.makedirs(images_dir, exist_ok=True)# 查找并保存所有图片image_id=0placelist=[]for i, drawing in enumerate(drawing_elements):# 获取 <a:blip> 的 r:embed 属性blip_element = drawing.find('.//{http://schemas.openxmlformats.org/drawingml/2006/main}blip')if blip_element is not None:embed_attr = blip_element.get('{http://schemas.openxmlformats.org/officeDocument/2006/relationships}embed')if embed_attr:# 查找图像在 rels 中的路径relationship = rels_root.find(f".//{{http://schemas.openxmlformats.org/package/2006/relationships}}Relationship[@Id='{embed_attr}']")if relationship is not None:timestamp = datetime.now().timestamp()target = relationship.get('Target')image_path = os.path.join('word', target)placeholder = f"{base_filename}_{timestamp}<unused{image_id}>"placelist.append(placeholder)# 提取并保存图像with docx.open(image_path) as image_file:image_data = image_file.read()image_ext = os.path.splitext(image_path)[1]# 保存图片到指定目录image_filename = os.path.join(images_dir, f"{placeholder}.png")with open(image_filename, 'wb') as out_file:out_file.write(image_data)print(f'Image saved: {image_filename}')image_id+=1print(len(placelist))# 替换文档中对应的图片为占位符i=0# 遍历所有段落及图片doc = Document(docx_path)for paragraph in doc.paragraphs:for run in paragraph.runs:# try:if 'graphicData' in run._element.xml:  # 搜索图片标记# 删除图片并插入占位符文字inline = run._element.xpath('.//a:graphic')[0]inline.getparent().remove(inline)run.text = placelist[i]i+=1# except:#     break# 保存修改后的 Word 文档doc.save(output_docx_path)print(f"提取了 {image_id} 张图片并用占位符替换。")print(f"图片保存在:{images_dir}")print(f"修改后的 Word 文件保存在:{output_docx_path}")# 示例调用
docx_path = "/data/xxxxx/ZHX财务管理系统.docx"  # 输入的 Word 文档
output_docx_path = "/data/xxxxx/ZHX财务管理系统--.docx"  # 替换图片后保存的 Word 文档
images_dir = "/data/xxxxx/样例图集/"  # 提取图片保存的目录
extract_images_and_replace(docx_path, output_docx_path, images_dir)

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

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

相关文章

Swipe横滑与SwipeItem自定义横滑相互影响

背景 vue项目&#xff0c;H5页面&#xff0c;使用vant的组件库轮播组件<Swipe>&#xff0c;UI交互要求&#xff0c;在每个SwipeItem中有内容&#xff0c;可自横滑&#xff0c;查看列表内容 核心代码 <template><Swipeclass"my_swipe":autoplay&quo…

3. 【.NET Aspire 从入门到实战】--理论入门与环境搭建--环境搭建

构建现代云原生应用程序时&#xff0c;开发环境的搭建至关重要。NET Aspire 作为一款专为云原生应用设计的开发框架&#xff0c;提供了一整套工具、模板和集成包&#xff0c;旨在简化分布式系统的构建和管理。开始项目初始化之前&#xff0c;确保开发环境的正确配置是成功的第一…

蓝耘智算平台使用DeepSeek教程

目录 一.平台架构与技术特点 二、DeepSeek R1模型介绍与优势 DeepSeek R1 模型简介 DeepSeek R1 模型优势 三.蓝耘智算平台使用DeepSeek教程 展望未来 耘元生代智算云是蓝耘科技推出的一款智算云平台有着以下特点&#xff1a; 一.平台架构与技术特点 基于 Kubernetes 原…

.net的一些知识点6

1.写个Lazy<T>的单例模式 public class SingleInstance{private static readonly Lazy<SingleInstance> instance new Lazy<SingleInstance>(() > new SingleInstance());private SingleInstance(){}public static SingleInstance Instace > instance…

1Panel应用推荐:WordPress开源博客软件和内容管理系统

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…

前端开发架构师Prompt指令的最佳实践

前端开发架构师Prompt 提示词可作为系统提示词使用&#xff0c;可基于用户的需求输出对应的编码方案。 本次提示词偏向前端开发的使用&#xff0c;如有需要可适当修改关键词和示例。 推荐使用 Cursor 中作为自定义指令使用Cline 插件中作为自定义指令使用在力所能及的范围内使…

Linux在x86环境下制作ARM镜像包

在x86环境下制作ARM镜像包&#xff08;如qemu.docker&#xff09;&#xff0c;可以通过QEMU和Docker的结合来实现。以下是详细的步骤&#xff1a; 安装QEMU-user-static QEMU-user-static是一个静态编译的QEMU二进制文件&#xff0c;用于在非目标架构上运行目标架构的二进制文…

基于STM32设计的仓库环境监测与预警系统

目录 项目开发背景设计实现的功能项目硬件模块组成设计思路系统功能总结使用的模块的技术详情介绍总结 1. 项目开发背景 随着工业化和现代化的进程&#xff0c;尤其是在制造业、食品业、医药业等行业&#xff0c;仓库环境的监控和管理成为了至关重要的一环。尤其是在存储易腐…

Redis主从同步流程?

目录 1. 建立连接 2. 全量同步(Full Sync) 3. 部分同步(Partial Sync) 4. 持续同步 5. 心跳检测 6. 复制偏移量(Replication Offset) 7. 复制积压缓冲区(Replication Backlog) 总结 Redis 主从同步 是通过复制(replication)实现的,主节点(master)将数据同…

PbootCMS 修改跳转提示,修改笑脸时间

在使用时&#xff0c;每次都提示这个&#xff1a; 修改方法&#xff1a; 修改跳转时间&#xff1a;找到 handle.php 文件编辑 &#xff0c;调整 setTimeout 函数的时间参数。 修改提示文字&#xff1a;编辑 handle.php 文件&#xff0c;修改提示文字的内容。 隐藏提示页面&am…

三星手机为何不大力扩展中国市场?

三星在中国市场的手机销量长期低迷&#xff0c;主要原因可以归结为以下几点&#xff0c;这也解释了为什么三星可能没有大力扩展中国市场的计划&#xff1a; 1. 市场竞争激烈 中国市场已经被华为、OPPO、vivo、小米和苹果等品牌牢牢占据&#xff0c;这些品牌在产品设计、本地化…

Elasticsearch:向量搜索的快速介绍

作者&#xff1a;来自 Elastic Valentin Crettaz 本文是三篇系列文章中的第一篇&#xff0c;将深入探讨向量搜索&#xff08;也称为语义搜索&#xff09;的复杂性&#xff0c;以及它在 Elasticsearch 中的实现方式。 本文是三篇系列文章中的第一篇&#xff0c;将深入探讨向量搜…

kaggle视频行为分析1st and Future - Player Contact Detection

这次比赛的目标是检测美式橄榄球NFL比赛中球员经历的外部接触。您将使用视频和球员追踪数据来识别发生接触的时刻&#xff0c;以帮助提高球员的安全。两种接触&#xff0c;一种是人与人的&#xff0c;另一种是人与地面&#xff0c;不包括脚底和地面的&#xff0c;跟我之前做的这…

低成本训练的突破与争议:DeepSeek R1模型的新进展

摘要 近日&#xff0c;李飞飞团队宣称以50美元成本训练出性能超越o1/R1的DeepSeek R1模型&#xff0c;此说法引发广泛质疑。与此同时&#xff0c;上海交通大学本科生提出一种新的低成本推理方法&#xff0c;可能成为新热门选择。有观点认为&#xff0c;若认可50美元能训练出更优…

Sentinel的安装和做限流的使用

一、安装 Release v1.8.3 alibaba/Sentinel GitHubA powerful flow control component enabling reliability, resilience and monitoring for microservices. (面向云原生微服务的高可用流控防护组件) - Release v1.8.3 alibaba/Sentinelhttps://github.com/alibaba/Senti…

“AI隐患识别系统,安全多了道“智能护盾”

家人们&#xff0c;在生活和工作里&#xff0c;咱们都知道安全那可是头等大事。不管是走在马路上&#xff0c;还是在工厂车间忙碌&#xff0c;又或是住在高楼大厦里&#xff0c;身边都可能藏着一些安全隐患。以前&#xff0c;发现这些隐患大多靠咱们的眼睛和经验&#xff0c;可…

《手札·避坑篇》信息化和数字化的本质区别

信息化与数字化&#xff1a;轴承贸易公司的转型之路 在当今商业环境中&#xff0c;信息化和数字化是企业转型的两个热门词汇。但对于很多外行人来说&#xff0c;这两个概念可能容易混淆。本文将从轴承贸易公司的角度&#xff0c;结合真实案例和数据&#xff0c;分析信息化与数字…

基于DeepSeek API和VSCode的自动化网页生成流程

1.创建API key 访问官网DeepSeek &#xff0c;点击API开放平台。 在开放平台界面左侧点击API keys&#xff0c;进入API keys管理界面&#xff0c;点击创建API key按钮创建API key&#xff0c;名称自定义。 2.下载并安装配置编辑器VSCode 官网Visual Studio Code - Code Editing…

SolidWorks教程P2.2【草图 | 第二节】——草图几何关系与编辑

草图几何关系包括&#xff1a;重合、中点、相切、平行、相等、共线、对称 草图编辑功能包括&#xff1a;裁剪实体、转换实体引用、等距实体 目录 1.草图几何关系 2.裁剪实体 3.转换实体引用 4.等距实体 补充知识&#xff1a;智能尺寸 1.草图几何关系 在之前的草图介绍里…

AI大模型训练实战:分布式与微调指南

AI大模型训练实战:分布式与微调指南 适用人群:有一定深度学习基础,正在或即将参与大模型(如 GPT、DeepSeek 等)训练与部署的工程师、研究者;想要理解分布式策略与微调方法的读者。 一、大模型为何需要分布式与微调? 随着 GPT、DeepSeek 等大模型参数规模攀升至数十亿甚…