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

张开发
2026/4/20 4:03:11 15 分钟阅读

分享文章

【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目录确认图片是否正常嵌入。

更多文章