Могу ли я получить размер шрифта по умолчанию для заполнителя с помощью python-pptx? - PullRequest
0 голосов
/ 24 сентября 2019

Я создаю презентацию Powerpoint с пакетом python-pptx .

Я знаю, что могу установить размер шрифта для абзаца или серии.Моя проблема в том, что я хочу установить размер шрифта относительно на размер по умолчанию.Другими словами: мне нужно знать размер шрифта по умолчанию для заполнителя.К сожалению, font.size возвращает None , если размер шрифта не был явно объявлен.

Вот что я ожидал сделать:

from pptx import Presentation

# setup presentation
prs = Presentation()
title_slide_layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(title_slide_layout)

# make a title
title = slide.placeholders[0]
title.text = "Hello, World!"

# here I'd like to resize the font size to 70% of default
p = title.text_frame.paragraphs[0]
default_size = p.font.size # <= Desired behaviour. Returns None in reality
font.size = default_size * 0.7

1 Ответ

0 голосов
/ 25 сентября 2019

Ответ несколько сложен, и у меня нет рецепта для вас, но, возможно, это укажет вам правильное направление.

В общем случае атрибут font-size для фигуры участвует в иерархия стилей аналогично тому, как работает каскадные таблицы стилей (CSS).Значения могут быть установлены на разных уровнях, и ближайший явный параметр выигрывает.Вот почему настройка уровня формы является надежной, поскольку это «ближайший» возможный параметр.

В случае заполнителей, таких как заполнитель заголовка в вашем примере, каскад имеет вид:

  1. Сама форма заполнителя (slide.placeholders[0] или, проще, slide.title)
  2. макет слайда заполнитель, полученный из
  3. мастер слайдов местозаполнитель местозаполнитель макета происходит от
  4. Вероятно, некоторые глобальные значения по умолчанию, если они не указаны в заглушке заголовка основного слайда

Таким образом, для получения эффективного шрифта-Значение размера вам нужно пройти через эту «цепочку наследования», пока вы не найдете явно определенное значение, которое будет эффективным значением.Что-то вроде следующего псевдокода:

def effective_title_placeholder_font_size():
    if title_placeholder.font-size is not None:
        return title_placeholder.font-size
    if slide-layout-title-placeholder.font-size is not None:
        return slide-layout-title-placeholder.font-size
    etc.

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

Таким образом, вы видите некоторые сложности.Это определенно выполнимо, но вам понадобится довольно сильно, в зависимости от вашего Python и общего уровня навыков разработки программного обеспечения.

В лучшем случае, в этих различных операциях в API поддерживается только частичная поддержка API python-pptx (например, получить аналог макета слайда для этого заполнителя слайдов и т. Д.), Поэтому вам, вероятно, придется покопаться в XML изрядного количества.

...