python-docx 页眉-清除原页眉图像&插入自适应图像

注意: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
        )

如果本文对你有所帮助,求个三连不过分吧?

(下次也不一定,略略略!)

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值