【python-docx】插入图片、删除图片、设置图片大小、提取图片

1.插入图片

Document对象有一个add_paragraph()方法插入图片,只需要传入路径或者字节流即可,实际上它也是调用段落的Run对象的add_picture()

from docx import Document

doc = Document()
doc.add_paragraph("在下面插入一张图片")
doc.add_picture("./01.png")  # 等同于doc.add_paragraph().add_run().add_picture()
doc.save('./test.docx')

插入的图片被保存为一个type为3的InlineShape对象,InlineShape还有其他常用类型如下

CHART = 12
LINKED_PICTURE = 4
PICTURE = 3
SMART_ART = 15
NOT_IMPLEMENTED = -6

我们可以通过Document对象的inline_shapes()获取所有InlineShape

doc = Document()
doc.add_paragraph("在下面插入一张图片")
doc.add_picture("./01.png") 
print(doc.inline_shapes)
print(doc.inline_shapes[0].type)  # 图片的type=3
2.删除图片

图片是保存在段落中的,所以我们需要清空有图片的那个段落即可

doc = Document()
doc.add_paragraph("在下面插入一张图片")
doc.add_picture("./01.png") 
# 此处是第2个段落有图片
doc.paragraphs[1].clear()
print(doc.inline_shapes)
3.调整图片大小

在插入图片的时候可以顺便指定宽度(width)和高度(height),若都不指定则是原图大小,若只指定了一个则等比缩放,当然宽度和高度属性也可以直接获取和修改。另外,插入的图片默认dpi=72

from docx import Document
from docx.shared import Cm, Inches

doc = Document()
doc.add_paragraph("在下面插入一张图片")
picture = doc.add_picture("./01.png", width=Cm(5))  # 插入图片时指定大小为5cm
# 查看尺寸
print(picture.width.cm)  # 5.0
print(picture.height.cm)  # 5.403397222222222
# 修改尺寸
picture.width = Inches(3.6)  # 图片宽度改为3.6英尺,但注意是否被拉伸,如果不行被拉伸请自己计算长宽比
picture.width = int(picture.width * 0.50)  # 宽度缩放为原来的50%
picture.height = int(picture.height * 0.50)  # 高度缩放为原来的50%
doc.save('./test.docx')

4.图片对齐

因为图片是在段落里的,所以我们只需要对所在段落对齐即可

from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT

doc = Document()
doc.add_paragraph("在下面插入一张图片")
picture = doc.add_picture("./01.png")
doc.paragraphs[1].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  # 居中对齐
# WD_PARAGRAPH_ALIGNMENT.LEFT: 左对齐
# WD_PARAGRAPH_ALIGNMENT.CENTER: 居中对齐
# WD_PARAGRAPH_ALIGNMENT.RIGHT: 右对齐
# WD_PARAGRAPH_ALIGNMENT.JUSTIFY: 两端对齐
# WD_PARAGRAPH_ALIGNMENT.DISTRIBUTE: 分散对齐
doc.save('./test.docx')

5.提取图片

python-docx没有提供提取图片的功能,但part对象提供了related_parts(),我们可以通过这个方法用图片id获取图片,图片id我们可以通过xpath从xlm文档中提取(使用解压软件解压Word文档即可得到xlm文件)。下面的代码仅供参考

from os.path import basename

from docx import Document, ImagePart

doc = Document("./test.docx")
for p in doc.paragraphs:
    images = p._element.xpath('.//pic:pic')  # 获取所有图片
    for image in images:
        for img_id in image.xpath('.//a:blip/@r:embed'):  # 获取图片id
            part = doc.part.related_parts[img_id]  # 根据图片id获取对应的图片
            if isinstance(part, ImagePart):
                # 保存图片
                with open(basename(part.partname), "wb") as f:
                    f.write(part.blob)
  • 10
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰冷的希望

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值