python-docx 对word操作,保证格式不变更改内容,插入图片合并word

两次读取 none.docx 并添加一个图片,将内容写进 测试.docx 。

先在复制内容里插入图片,在添加进 测试.docx 里面。虽然插入了两个图片。但是第二次插进去的图片却和之前的图片一样。

from docx import Document
from docx.shared import Pt,Inches
doc = Document('none.docx')
paragraph = doc.paragraphs[0]
img_dir =r'image\3.jpg'
doc.add_picture(img_dir, width=Inches(4))
doc.save('测试.docx')
docx= Document('测试.docx')
doc = Document('none.docx')
img_dir =r'image\4.jpg'
doc.add_picture(img_dir, width=Inches(4))
for element in doc.element.body:
    docx.element.body.append(element)
docx.save('测试.docx')

原因

        docx解析显示时,根据图片元素的引用信息读取同一个图片文件显示。所以当使用append添加新的图片元素时,它实际上是引用了原来已经存在的同一个图片文件

先复制内容在插入图片,虽然这次插入了两个不同的图片。但是插进去的图片却和之前的图片放在一起。

from docx import Document
from docx.shared import Pt,Inches
doc = Document('none.docx')
paragraph = doc.paragraphs[0]
img_dir =r'image\3.jpg'
doc.add_picture(img_dir, width=Inches(4))
doc.save('测试.docx')
docx= Document('测试.docx')
doc = Document('none.docx')
for element in doc.element.body:
    docx.element.body.append(element)
img_dir =r'image\4.jpg'
docx.add_picture(img_dir, width=Inches(4))
docx.save('测试.docx')

原因

        使用_element属性直接复制XML元素时,没有真正复制文本内容,所以图片会插入到复制的内容之前。

使用Composer来添加可以解决这些问题

from docxcompose.composer import Composer
from docx import Document
from docx.shared import Pt,Inches

doc = Document('none.docx')
paragraph = doc.paragraphs[0]
img_dir =r'image\3.jpg'
doc.add_picture(img_dir, width=Inches(4))
doc.save('测试.docx')
docx= Document('测试.docx')
doc = Document('none.docx')
img_dir =r'image\1.jpg'
doc.add_picture(img_dir, width=Inches(4))
docx_composer=Composer(docx)
docx_composer.append(doc)
docx.save('测试.docx')

保证格式不变更改内容,插入图片合并word完整代码

# -*- coding:utf-8 -*-
from docxcompose.composer import Composer
from docx import Document
from docx.shared import Pt,Inches

doc = Document('none.docx')
paragraph = doc.paragraphs[0]
img_dir =r'image\3.jpg'
doc.add_picture(img_dir, width=Inches(4))
doc.save('测试.docx')
docx= Document('测试.docx')
doc = Document('none.docx')
paragraph = doc.paragraphs[0]
for i in range(len(doc.paragraphs)):
    if '()' in doc.paragraphs[i].text:
        # 获取当前段落的字体样式
        font_size = paragraph.runs[0].font.size
        # Get the first run object in the paragraph
        run = doc.paragraphs[i].runs[0]
        # Add a new run with the specified font size
        run.text = ''
img_dir =r'image\1.jpg'
doc.add_picture(img_dir, width=Inches(4))
docx_composer=Composer(docx)
docx_composer.append(doc)
docx.save('测试.docx')

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值