#python #xml #python-pptx
#python #xml #python-pptx
Вопрос:
При добавлении слайдов с помощью модифицированного python-pptx вместо номера слайда на каждом слайде появляются заполнители. Однако вместо фактического номера слайда в этом поле отображаются слова «Номер слайда».
В других ответах упоминается использование статического текстового поля, но нам нужно использовать заполнитель, поскольку мы передаем создание слайдов различным клиентским мастерам. Стандартное текстовое поле не будет корректно подстраиваться под различные макеты. Нам также нужно, чтобы поле плавало, чтобы мы могли размещать фотографии за ним на некоторых страницах. Наконец, он должен быть динамическим, так как мы часто перетасовываем страницы после этого, поэтому передача ему индекса в виде статического номера вызовет проблемы.
Есть ли строка или команда, которые можно вставить в заполнитель, который автоматически изменит положение слайда в колоде? Мастер использует комбинацию «<#>», но это не работает при передаче в виде строки.
Прошу прощения за мое невежество, я работаю с python и python-pptx всего пару недель (огромное спасибо его создателям!).
Ответ №1:
Номер слайда с «автоматическим обновлением» в 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>
Итак, короткий ответ на ваш вопрос — нет. Нет строки, которую вы можете вставить в текстовое поле, которое запускает вставку этого 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 при открытии презентации. В этом случае вам нужно будет правильно настроить его при вставке, но он будет автоматически обновляться при перетасовке слайдов.
Комментарии:
1. Это сработало великолепно. Похоже, мне нужно намного лучше понимать XML, чтобы расширить вашу работу до очень специфических вещей, которые нам нужны для этого. Я ценю всю вашу помощь!