如何使用 python-docx 垂直对齐图片

How to vertically align picture in line using python-docx

我正在使用以下代码向我的文本添加图片(一些胶乳使用 matplotlib 转换为 PNG):

par = doc.add_paragraph()
par.add_run().text = 'foo bar baz'
par.add_run().add_picture('pic.png')
par.add_run().text = 'blah blah blah'

这工作正常,除了图片 pic.png 在文档的其余文本中没有垂直对齐:

我可以在 MS Word 中手动获得对齐方式,方法是添加一种字符样式,并将高级垂直对齐方式 属性 设置为 "lowered by 10pt":

问题是我不知道如何使用 python-docx 以编程方式执行此操作。从概念上讲,这些步骤是计算图像的大小,创建一个字符样式,该样式的大小减去字体大小的一半,然后将样式应用于包含图片的 运行。如何在 python-docx 中创建凸起或降低的字体样式?

供参考,这里是pic.png

您的图片周围有相当大的(透明)边框。我在此处的范围内添加了一个像素边框以使其可见:

我希望 Word 将图像的底部与基线对齐(如预期的那样)。一种方法是查看是否可以指定零底边框。

您也可以在该图像上尝试下标 运行。我不确定它会做什么,但值得一试。所以像这样:

run = par.add_run()
run.add_picture('x.png')
run.font.subscript = True

如果你找到你手动设置为"lowered by 10pt"的运行,你可以这样查看XML(航空代码):

run = vertically_adjusted_run()  # however you get ahold of it
print(run._element.xml)

我希望您会看到这样的内容:

<w:r>
  <w:rPr>
    <w:position w:val="20"/>
    ...

... 其中 w:position 元素设置相对于基线的调整。该值以半点指定。

无论如何,python-docx 还不支持此调整甚至那个低级元素,因此如果您非常想要它,您需要通过 lxml 调用进入那里以完成必要的工作够了。