Как можно вставить динамические номера страниц в добавленные слайды? - PullRequest
1 голос
/ 23 апреля 2019

При добавлении слайдов через модифицированный python-pptx для каждого номера слайда отображаются заполнители. Однако вместо фактического номера слайда в этом поле появляются слова «Номер слайда».

В других ответах упоминается использование статического текстового поля, но нам нужно использовать заполнитель, поскольку мы передаем создание слайдов различным мастерам клиентов. Стандартное текстовое поле не будет корректно адаптироваться к различным макетам. Нам также нужен плавающий ящик, чтобы на некоторых страницах можно было разместить за ним фотографии. Наконец, он должен быть динамическим, так как мы часто перетасовываем страницы, поэтому передача индекса в виде статического числа может вызвать проблемы.

Есть ли строка или команда, которая может быть вставлена ​​в заполнитель, который автоматически вытянет позицию слайда в деке? Мастер использует комбинацию "<#>", но это не работает при передаче в виде строки.

Извиняюсь за свое невежество, я работаю с python и python-pptx всего пару недель (огромное спасибо его создателям!).

1 Ответ

0 голосов
/ 23 апреля 2019

Номер слайда с автоматическим обновлением в 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 ответ на ваш вопрос no .Нет строки, которую можно вставить в текстовое поле, которая вызывает вставку этого XML, и пока еще нет поддержки API для добавления полей.

Подход заключается в том, чтобы получить элемент <a:p> для текстового поля ивставьте этот XML в него, используя вызовы lxml (процесс, обычно называемый «обходной функцией» в других python-pptx сообщениях).

Вы можете получить элемент 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 при открытии презентации.Если это так, то при вставке вам нужно сделать это правильно, но он будет автоматически обновляться при перетасовке слайдов.

...