如何将动态页码插入添加的幻灯片中?

时间:2019-04-23 14:59:16

标签: python xml python-pptx

通过修改后的python-pptx添加幻灯片时,每张幻灯片上的幻灯片编号都会出现占位符。但是,该字段中会出现单词“ Slide Number”,而不是实际的幻灯片编号。

其他答案提到使用静态文本框,但是当我们将创建幻灯片转移到各种客户端母版时,我们需要使用占位符。标准文本框无法正确调整以适应各种布局。我们还需要盒子漂浮起来,以便我们可以将照片放在某些页面的后面。最后,它必须是动态的,因为我们以后经常会洗牌,因此将索引作为静态数字传递给它会引起问题。

是否存在可以插入到占位符中的字符串或命令,该字符串或命令会自动将幻灯片在甲板上的位置拉出?母版使用组合键“ <#>”,但这不是作为字符串传递时可以工作。

对我的无知深表歉意,我只在python和python-pptx上工作了两个星期(非常感谢其创建者!)。

1 个答案:

答案 0 :(得分:0)

PowerPoint中的“自动更新”幻灯片编号是字段。 XML看起来像这样:

<a:fld id="{1F4E2DE4-8ADA-4D4E-9951-90A1D26586E7}" type="slidenum">
  <a:rPr lang="en-US" smtClean="0"/>
  <a:t>2</a:t>
</a:fld>

因此,对您的问题的 short 答案是。您无法在文本框中插入任何字符串来触发此XML的插入,并且还没有API支持添加字段。

方法是获取文本框的<a:p>元素,并使用lxml调用(在其他python-pptx帖子中通常称为“变通函数”的过程)将此XML插入到其中。

您可以像这样获得a:p元素:

p = textbox.text_frame.paragraphs[0]._p

类似的方法可能会起作用,并且至少提供了该方法的概述:

from pptx.oxml import parse_xml
from pptx.oxml.ns import nsdecls

# ---get a textbox paragraph element---
p = your_textbox.text_frame.paragraphs[0]._p

# ---add fld element---
fld_xml = (
    '<a:fld %s id="{1F4E2DE4-8ADA-4D4E-9951-90A1D26586E7}" type="slidenum">\n'
    '  <a:rPr lang="en-US" smtClean="0"/>\n'
    '  <a:t>2</a:t>\n'
    '</a:fld>\n' % nsdecls("a")
)
fld = parse_xml(fld_xml)
p.append(fld)

a:t元素中包含的数字是缓存的幻灯片编号,PowerPoint在打开演示文稿时可能不会自动更新。如果是这种情况,则在插入时需要正确处理,但是在随机播放幻灯片时会自动更新。