注意:python-docx页眉插入图像仅支持插入“嵌入式”图像,即内联形状。
一、清除原页眉图像
我查到如下方法:
for i in range(len(footer.paragraphs)):
paragraph = document.paragraphs[i]
print('删除前图形图像的数量:', len(document.inline_shapes))
paragraph.clear() # 删除段落
print('删除后图形图像的数量:', len(document.inline_shapes)) 但运行后发现无法解决我的问题。图像还是在文档页眉中。
根据python-docx 文档:了解图片和其他形状 — python-docx 0.8.11 文档
从概念上讲,Word 文档有两个图层,一个文本图层和一个绘图图层。在文本图层中,文本对象从左到右以及从上到下排列,在填充前一个页面时开始新页面。在绘图层中,绘图对象(称为形状)放置在任意位置。这些有时称为浮动形状。
图片是可以出现在文本或绘图层中的形状。当它出现在文本图层中时,它被称为内联形状,或者更具体地说,称为内联图片。
内联形状被视为大文本字符(字符字形)。增加行高以适应形状,并且形状将换行为适合宽度的行,就像文本一样。在其前面插入文本将导致其向右移动。通常,图片单独放置在段落中,但这不是必需的。它可以在放置它的段落中具有前后文本。
在撰写本文时,仅支持内联图片。
问题解决了,上面代码clear是通过段落来clear的,如果图像是处在绘图层,则将无法使用该方法清除。
那如果原页眉的图像在绘图层应该怎么办?
查阅文档后发现,可以使用这种方法:
# 清空原页眉(默认只有一节的时候)
header.is_linked_to_previous = True即与上一节保持一致,由于文档默认只有一节,选取sections[0]时就可以达到清除页眉页脚定义的目的。Section objects — python-docx 0.8.11 documentation
True分配给此属性将删除此部分的页眉/页脚定义,使其"继承"上一节的相应定义。
False分配会导致为此部分添加新的空定义,但前提是尚不存在任何定义。
二、插入图像
通过文档可知,python-docx现仅支持内联图片,即使用run.add_picture()方法仅能将其插入文本层。
1.一般的插入方法如下:
# 获取页眉的第一个/最后一个段落
header_para = header.paragraphs[-1]
# 设置段落居中
header_para.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER
# 添加页眉内容
run = header_para.add_run()
run.add_picture(
os.getcwd() + "/logos-source/test_header.png",
height=docx.shared.Cm(2.2)
)插入图像是通过段落的run对象进行插入的,run.add_picture(img,width,height)当宽高仅设置一个时将会按图像比例自动缩放
图像的位置是以段落居中/左对齐/右对齐设置的
2.style
Q:上述一般方法我都试了,可是我想要的是图片能紧贴页面顶部/底部,紧贴左右的怎么办?
A: 可以通过设置节属性实现
# style1:与页边距齐平
header_para.paragraph_format.left_indent = 0
header_para.paragraph_format.right_indent = 0
#style2:横穿整个页面故段落边距紧贴页边
header_para.paragraph_format.left_indent = - document.sections[0].left_margin
header_para.paragraph_format.right_indent = - document.sections[0].right_margin代码解释:style2
段落左缩进是负数时会挂起缩进,设置为负页边距即可紧贴页面。
缩进=0时,与页面左侧距离=页边距
3.图像参数
如果不知道如何设置自适应图像的高度以适配页眉,可将top_margin(即顶端页边距)作为其高度。
run.add_picture(
os.getcwd() + "/logos-source/test_header.png",
height = document.sections[0].top_margin
)如果本文对你有所帮助,求个三连不过分吧?
(下次也不一定,略略略!)