两次读取 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')