当前位置: 首页 > article >正文

【python-docx】图片操作全解析:从基础插入到高级提取与批量处理

1. python-docx图片操作入门指南如果你经常需要处理Word文档中的图片python-docx绝对是个神器。我在处理周报、产品文档时经常需要批量插入几十张图表手动操作简直要命。python-docx让我实现了全自动化现在分享这些实战经验给你。安装很简单用pip就能搞定pip install python-docx基础操作只需要几行代码from docx import Document doc Document() doc.add_picture(logo.png) # 插入图片 doc.save(report.docx)这里有个小细节要注意python-docx默认支持常见图片格式PNG/JPG等但遇到WebP等新格式可能会报错。我建议先用Pillow库转换格式from PIL import Image img Image.open(photo.webp) img.save(photo.png) # 转换为PNG格式2. 图片插入的进阶技巧2.1 精准控制插入位置原始文章提到用add_paragraph()插入图片但实际项目中我们往往需要更精确的控制。比如要在特定段落后面插入图片可以这样操作from docx.shared import Pt doc Document(template.docx) target_paragraph doc.paragraphs[3] # 找到目标段落 new_run target_paragraph.add_run() new_run.add_picture(chart.png, widthPt(200)) # 用磅值指定宽度2.2 批量插入的优化方案处理上百张图片时直接循环插入会导致内存暴涨。我的经验是分批次处理image_files [img1.png, img2.jpg, ...] # 图片列表 for i, img_path in enumerate(image_files, 1): doc.add_paragraph(f图表 {i}) doc.add_picture(img_path, widthCm(10)) if i % 20 0: # 每20张保存一次 doc.save(fpart_{i//20}.docx) doc Document() # 新建文档继续3. 图片删除与替换实战3.1 安全删除图片的三种方法原始文章提到用clear()清空段落但实际场景更复杂。比如要保留文字只删除图片for paragraph in doc.paragraphs: for run in paragraph.runs: if run._element.xpath(.//pic:pic): # 检测图片 run.clear() # 只清空含图片的run更安全的做法是先备份from copy import deepcopy backup_doc deepcopy(doc) # 完整备份 # ...执行删除操作...3.2 图片替换的坑与解决方案替换图片时直接删除再插入会导致格式丢失。我推荐这个方法for shape in doc.inline_shapes: if shape.type 3: # 确认是图片 new_run shape._inline.parent.add_run() new_run.add_picture(new.png, widthshape.width) shape._inline.getparent().remove(shape._inline)4. 图片尺寸与样式的精细控制4.1 保持比例的缩放技巧原始文章提到设置width和height但强制缩放会导致变形。应该这样保持比例from docx.shared import Cm def add_proportional_picture(doc, path, max_widthCm(10)): pic doc.add_picture(path) if pic.width max_width: ratio max_width / pic.width pic.width max_width pic.height int(pic.height * ratio)4.2 高级排版实战制作产品手册时经常需要图文混排from docx.enum.text import WD_PARAGRAPH_ALIGNMENT paragraph doc.add_paragraph() paragraph.alignment WD_PARAGRAPH_ALIGNMENT.RIGHT # 右对齐 run paragraph.add_run() run.add_picture(product.png, widthCm(5)) run.add_text( 旗舰产品图示) # 图片右侧添加文字5. 图片提取的完整解决方案原始文章提到用xpath提取但实际更推荐用以下稳定方案5.1 可靠提取方法from docx.opc.constants import RELATIONSHIP_TYPE as RT def extract_images(docx_path, output_folder): doc Document(docx_path) for rel in doc.part.rels.values(): if rel.reltype RT.IMAGE: with open(f{output_folder}/{rel.target_ref.split(/)[-1]}, wb) as f: f.write(rel.target_part.blob)5.2 批量重命名技巧提取的图片通常是无序字符串可以这样优化import os from uuid import uuid4 image_num 1 for rel in doc.part.rels.values(): if rel.reltype RT.IMAGE: ext os.path.splitext(rel.target_ref)[1] filename ffigure_{image_num}{ext} with open(filename, wb) as f: f.write(rel.target_part.blob) image_num 16. 企业级批量处理方案6.1 自动化报告生成系统结合pandas生成数据报告import pandas as pd from docx.shared import Inches df pd.read_csv(data.csv) doc Document() for _, row in df.iterrows(): doc.add_heading(row[title], level2) chart generate_chart(row) # 假设这是生成图表的函数 chart.savefig(temp.png) doc.add_picture(temp.png, widthInches(4.5)) os.remove(temp.png) # 清理临时文件 doc.save(auto_report.docx)6.2 性能优化技巧处理大型文档时使用python-docx-template替代频繁操作禁用自动样式计算document Document() document.styles.element.getparent().remove(document.styles.element)最后统一保存样式7. 异常处理与调试技巧7.1 常见错误处理图片损坏时的容错方案from docx.image.exceptions import UnrecognizedImageError try: doc.add_picture(broken.jpg) except UnrecognizedImageError: print(图片格式不支持自动替换为占位符) doc.add_picture(placeholder.png)7.2 调试日志记录添加操作日志便于排查import logging logging.basicConfig(filenamedocx_processor.log, levellogging.INFO) def safe_add_picture(doc, path): try: doc.add_picture(path) logging.info(f成功插入图片: {path}) except Exception as e: logging.error(f插入失败 {path}: {str(e)})处理Word图片看似简单但实际项目中会遇到各种边界情况。建议先在小文档测试再处理重要文件。我常用的检查方法是先用解压工具打开docx查看word/media目录确认图片是否正常嵌入。

相关文章:

【python-docx】图片操作全解析:从基础插入到高级提取与批量处理

1. python-docx图片操作入门指南 如果你经常需要处理Word文档中的图片,python-docx绝对是个神器。我在处理周报、产品文档时,经常需要批量插入几十张图表,手动操作简直要命。python-docx让我实现了全自动化,现在分享这些实战经验给…...

从一次线上宕机复盘说起:我是如何用Kdump+crash工具锁定内核‘元凶’的

从一次线上宕机复盘说起:我是如何用Kdumpcrash工具锁定内核‘元凶’的 凌晨3点17分,监控大屏突然跳出刺眼的红色告警——核心业务节点突然失联。SSH连接超时、服务端口无响应、日志流戛然而止,所有迹象都指向一个残酷的事实:内核发…...

高通Camera驱动实战:从dtsi节点到内核代码的配置与调试

1. 高通Camera驱动开发入门指南 第一次接触高通Camera驱动开发的朋友可能会觉得有点懵,毕竟这涉及到硬件原理图、设备树配置、内核代码调试等多个环节。我自己刚开始做这块的时候,也是踩了不少坑。今天我就用最直白的语言,带大家走一遍完整的…...

PetaLinux 2020.1安装后必做的三件事:环境变量、TFTP服务器与权限设置

PetaLinux 2020.1工程化部署三要素:环境变量、TFTP服务与权限管理 在嵌入式Linux开发领域,PetaLinux作为Xilinx官方提供的工具链,其安装只是万里长征的第一步。真正考验工程师功力的,是如何将裸装环境转化为稳定可靠的生产力工具。…...

RK3128-Android7.1-WebView内核升级实战:从源码替换到系统编译

1. 为什么需要升级WebView内核? 在RK3128芯片搭载的Android 7.1系统上,WebView组件作为系统内置的浏览器引擎,直接影响着设备上所有基于WebView的应用体验。我遇到过不少开发者反馈,原厂固件自带的WebView版本太低,导致…...

C#怎么实现文件上传下载 C#如何用WebAPI实现大文件断点续传功能【网络】

ASP.NET Core 上传大文件需同时配置 IIS 最大请求体和控制器级 RequestSizeLimit;断点续传依赖服务端维护已上传字节数并校验唯一 ID;下载须流式处理避免内存溢出;合并分块需按序拼接并保证原子性。WebAPI 上传大文件时 IFormFile 直接报错或…...

04.1.CUDA安装避坑指南:从版本选择到C盘空间保卫战

1. 为什么你的C盘总是被CUDA悄悄占满? 每次装完CUDA发现C盘莫名其妙少了几个G,这大概是深度学习开发者最头疼的问题之一。我刚开始玩AI那会儿,装完CUDA 11.7后C盘直接飙红,系统弹窗疯狂报警,最后不得不重装系统。后来…...

OpenMV定时器PWM实战:驱动四轴机械臂舵机

1. OpenMV与PWM的基础知识 第一次接触OpenMV的PWM功能时,我完全被它的简洁性震惊了。作为一个经常用STM32做项目的开发者,OpenMV的PWM配置简直就像打开了新世界的大门。你可能不知道,OpenMV本质上就是一颗STM32芯片,但它把很多底层…...

工业视觉老鸟的避坑指南:指针仪表识别,为什么你的Hough检测总是不准?

工业视觉实战:指针仪表识别的五大核心挑战与高鲁棒性解决方案 在工业质检和设备监控领域,指针式仪表的自动识别一直是个看似简单实则暗藏玄机的问题。许多工程师在初步实现Hough变换检测后,往往会遇到晴天霹雳——测试时效果尚可的算法&#…...

Dual Thrust策略在A股和商品期货上的表现差异有多大?一个参数对比实验

Dual Thrust策略在A股与商品期货中的参数优化实战 第一次接触Dual Thrust策略时,我被它简洁优雅的设计所吸引——仅用开盘价和价格波动区间就能构建完整的交易信号系统。但真正将其应用到实盘时,却发现同样的参数设置在不同市场表现天差地别。本文将分享…...

如何在网页中完整显示数组内所有对象的全部属性

本文介绍如何使用 json.stringify() 将对象数组转换为格式化字符串并渲染到 html 元素中,解决循环赋值覆盖、语法错误导致内容不显示等问题,并提供可直接运行的示例代码与关键注意事项。 本文介绍如何使用 json.stringify() 将对象数组转换为格式化…...

《uni-app》Checkbox组件实战:从基础配置到跨平台表单交互

1. Checkbox组件基础入门 第一次接触uni-app的Checkbox组件时,我完全被它简洁的API设计惊艳到了。这个看似简单的复选框,在实际业务中却能发挥巨大作用。记得去年开发一个健身APP时,就用它实现了运动偏好选择功能,用户反馈特别好。…...

告别KVM切换器!用微软官方免费神器Mouse without Borders,一套键鼠搞定四台Windows电脑

微软Mouse without Borders:四台Windows电脑共享键鼠的终极方案 当你的办公桌上摆着两台甚至四台Windows电脑时,每次切换设备都要重新抓取不同的鼠标和键盘,这种体验简直让人抓狂。物理KVM切换器虽然能解决问题,但价格昂贵且线材杂…...

别再到处找脚本了!Windows 11家庭版一键解锁组策略(gpedit.msc)的保姆级教程

Windows 11家庭版解锁组策略的终极指南:告别复杂脚本,三步搞定系统隐藏功能 每次在Windows 11家庭版上输入gpedit.msc却看到"找不到文件"的提示时,那种挫败感我太熟悉了。作为一名长期使用家庭版系统的技术爱好者,我完全…...

【AGI自主学习底层逻辑】:20年AI架构师首度公开7大探索策略与3个致命误区

第一章:AGI自主学习的本质与范式跃迁 2026奇点智能技术大会(https://ml-summit.org) AGI的自主学习并非对监督学习范式的简单扩展,而是一种认知闭环的重构:系统在无预设任务目标、无人工标注反馈、甚至无固定评价函数的前提下,持…...

SX126x CAD参数cadDetPeak/Min怎么调?一份来自官方测试数据的避坑指南

SX126x CAD参数调优实战:从实验室到复杂环境的参数精调策略 当你的LoRa设备从安静的实验室环境迁移到充满无线干扰的城市丛林时,是否发现原本稳定的CAD(信道活动检测)功能开始频繁误报或漏检?这往往不是硬件问题&#…...

LeetCode刷题必备:用单调栈5分钟搞定‘直方图最大矩形’和‘子数组最值差’两道经典题

LeetCode刷题必备:单调栈速解两道经典难题的实战套路 面试官在白板上写下"直方图最大矩形"和"子数组最值差"两道题时,前排候选人已经开始冒汗——这类问题在LeetCode中属于中等偏上难度,常规解法要么时间复杂度太高&…...

华为S5735S交换机iStack堆叠实战:从零配置到业务上线

1. 为什么选择iStack堆叠技术 第一次接触华为S5735S交换机堆叠时,我也被各种堆叠技术名词绕晕了。iStack、CSS、堆叠卡、业务口堆叠...后来在实际项目中摸爬滚打才发现,电口堆叠才是中小型网络的最优解。就拿最近一个客户案例来说,他们原有单…...

从CPU到外设:实战解析AHB5总线在GD32/RISC-V SoC中的互连设计与性能调优

AHB5总线在RISC-V SoC中的高效互连设计与性能调优实战 在当今嵌入式系统设计中,总线架构的选择与优化直接影响着整个芯片的性能表现。作为AMBA总线家族中的重要成员,AHB5协议凭借其高效率、低延迟的特性,已成为众多RISC-V SoC设计的首选互连方…...

C# .NET 与 SAP RFC 接口交互:从参数映射到实战封装

1. SAP RFC接口与.NET集成的核心挑战 在企业级应用开发中,SAP系统往往承载着核心业务流程,而现代应用开发又大量采用.NET技术栈。要让这两个不同生态的系统高效对话,RFC(Remote Function Call)是最常用的桥梁技术。但实…...

告别MyBatis的‘?‘占位符:用p6spy 3.9.1在Spring Boot里打印可直接执行的SQL(附自定义日志格式)

告别MyBatis的?占位符:用p6spy 3.9.1在Spring Boot里打印可直接执行的SQL(附自定义日志格式) 调试SQL语句是Java开发中的日常操作,但MyBatis和JPA等ORM框架输出的预编译SQL总带着恼人的?占位符。每次排查问题时,开发…...

Simulink代码生成实战:如何让参数结构体在C代码里也‘整整齐齐’

Simulink参数结构体工程化实践:从模型到嵌入式代码的无缝衔接 在嵌入式系统开发中,Simulink模型到C代码的转换质量直接影响着最终产品的可靠性和维护成本。当面对包含数百个参数的复杂控制系统时,如何保证生成的代码既保持高可读性又能完美对…...

保姆级教程:在RuoYi-AI里用Ollama跑通本地Llama3模型(附完整配置截图)

零基础实战:RuoYi-AI与Ollama深度整合指南 第一次在本地环境跑通Llama3模型时,那种"不依赖任何云服务"的成就感至今难忘。作为一款开箱即用的AI开发框架,RuoYi-AI与Ollama的组合让本地大模型部署变得前所未有的简单——但魔鬼往往藏…...

避坑指南:在Win10上用VS2019编译ITK 5.2和RTK 2.3,我踩过的那些坑都帮你填平了

避坑指南:在Win10上用VS2019编译ITK 5.2和RTK 2.3,我踩过的那些坑都帮你填平了 医学图像处理开发者常需搭建ITKRTK环境,但官方文档往往只展示理想路径。本文将解剖我在Windows 10VS2019环境中部署ITK 5.2和RTK 2.3时遇到的7类典型故障&#x…...

别再手动算了!用JavaScript/Node.js实现RGB到HEX颜色转换的三种实用方法

别再手动算了!用JavaScript/Node.js实现RGB到HEX颜色转换的三种实用方法 在Web开发中,颜色值的处理无处不在。从动态主题切换、Canvas绘图到CSS-in-JS方案,RGB与HEX颜色格式的转换是开发者经常需要处理的基础操作。手动计算虽然可行&#xff…...

“SpringSource Training Schedule: September 2013”是指2013年9月SpringSource

“SpringSource Training Schedule: September 2013”是指2013年9月SpringSource(后被VMware收购,现相关培训已整合进Pivotal及后续的VMware Tanzu培训体系)发布的官方培训课程安排。该计划曾涵盖Spring Framework、Spring Integration、Spri…...

Spring Security 3.2.0.RC1(Release Candidate 1)是 Spring Security 框架在 2013 年底发布的候选版本

Spring Security 3.2.0.RC1(Release Candidate 1)是 Spring Security 框架在 2013 年底发布的候选版本,标志着 3.2.x 系列的初步稳定。该版本引入了多项重要改进与新特性,包括: Java Config 支持增强:进一步…...

“Community-Driven Spring Integration Extensions”(社区驱动的 Spring Integration 扩展)是指由 Spring 社区

“Community-Driven Spring Integration Extensions”(社区驱动的 Spring Integration 扩展)是指由 Spring 社区(而非 Spring 官方核心团队)开发、维护和贡献的一系列补充性模块,用于增强 Spring Integration 的功能边…...

“Spring Data release train reaches RC station” 是 Spring 官方常用的一种拟人化表达

“Spring Data release train reaches RC station” 是 Spring 官方常用的一种拟人化表达,意指 Spring Data 的某个版本发布周期(Release Train)已进入 Release Candidate(RC)阶段,即“候选发布版”。这表示…...

“Video: Managing and Monitoring Spring Integration Applications”很可能是指关于如何对基于 Spring Integration 的企业集

“Video: Managing and Monitoring Spring Integration Applications”很可能是指关于如何对基于 Spring Integration 的企业集成应用进行运行时管理与监控的教学视频(例如来自 Spring 官方、SpringOne 大会、Baeldung、YouTube 技术频道或 Pluralsight 等平台的内容…...