Процесс форматирования текста на Python-PPTX

#python #python-pptx

Вопрос:

pptx** Сообщество!

Не могли бы вы, пожалуйста, подсказать мне, является ли приведенный ниже метод правильным подходом к форматированию текста?

Другими словами, должен ли я добавлять: p , run , и все свойства шрифта в каждый текст, который я добавляю в PPTX?

Большое вам спасибо за вашу помощь!

 from pptx import Presentation
from pptx.dml.color import RGBColor
from pptx.enum.dml import MSO_THEME_COLOR
from pptx.enum.shapes import MSO_SHAPE
from pptx.enum.text import MSO_ANCHOR, MSO_AUTO_SIZE
from pptx.util import Inches, Pt

prs = Presentation('./data/template.pptx')

cover = prs.slides.add_slide(prs.slide_layouts[0])

pptTitle_Shape = cover.shapes.add_textbox(Inches(0.31), Inches(0.54), 0.61, 9.38)
pptTitle_TextFrame = pptTitle_Shape.text_frame
p = pptTitle_TextFrame.paragraphs[0]
run = p.add_run()
run.text = 'Cover Page Title Name'
font = run.font
font.name = 'Arial'
font.size = Pt(40)
font.bold = False
font.color.rgb = RGBColor(255, 255, 255)

pptCustomerName_Shape = cover.shapes.add_textbox(Inches(0.31), Inches(2.03), 4.5, 0.4)
pptCustomerName_TextFrame = pptCustomerName_Shape.text_frame
p = pptCustomerName_TextFrame.paragraphs[0]
run = p.add_run()
run.text = 'Customer Name'
font = run.font
font.name = 'Arial'
font.size = Pt(28)
font.bold = False
font.color.rgb = RGBColor(255, 255, 255)

pptSEName_Shape = cover.shapes.add_textbox(Inches(0.31), Inches(2.51), 4.5, 0.4)
pptSEName_TextFrame = pptSEName_Shape.text_frame
p = pptSEName_TextFrame.paragraphs[0]
run = p.add_run()
run.text = 'FirstName LName'
font = run.font
font.name = 'Arial'
font.size = Pt(20)
font.bold = False
font.color.rgb = RGBColor(255, 255, 255)
 

Ответ №1:

Чтобы дополнить ответ Сканни, я создал набор функций для применения форматирования к нескольким различным объектам python-pptx . Функции довольно длинные, поскольку они реализуют все типы форматирования, такие как выравнивание шрифтов, цвета границ, прозрачность, поля и т.д. Но вы можете найти их в следующей сути: https://gist.github.com/Fredericco72/c21505ebfb354461bc4b7b857764d5d2

Они напрямую соответствуют логике, предоставляемой Scanny, но это позволяет вам делать следующее:

 slide = prs.slides.add_slide(prs.slide_layouts[0])

shape = slide.shapes.add_shape(
    MSO_SHAPE.RECTANGLE,
    left=Cm(1),
    top=Cm(1),
    width=Cm(10),
    height=Cm(3)
)

format_shape(
    shape,
    fill_color="BLUE",
    border_color="RED"
)

format_text_frame(
    shape.text_frame,
    font_size=15,
    font_color="WHITE",
    font_align=PP_ALIGN.RIGHT
)
 

Чтобы вы могли использовать понятные названия для таких цветов, как BLUE «и RED «, вам нужно настроить файл сопоставления, или вы можете просто пройти fill_color=RGBColor(255, 255, 255) .

Комментарии:

1. Отлично! Спасибо, @Fred.

Ответ №2:

Нет, как правило, нет. Есть несколько ярлыков, и значения по умолчанию должны работать нормально большую часть времени.

Типичная операция добавления формы выглядит следующим образом:

 shape = shapes.add_shape(...)
shape.text = "foobar"
 

Нет необходимости явно обращаться к текстовому фрейму для добавления текста, форма, которая принимает текст, обладает .text свойством записи.

В общем, шрифт по умолчанию (форматирование символов) будет работать нормально. Это включает в себя выполнение работы в стартовом файле «шаблон» .pptx, чтобы установить по умолчанию то, что вы хотите для большей части текста. Эти значения по умолчанию будут установлены на уровне темы и презентации по умолчанию, а также в заполнителях на макетах слайдов. Обычно вы делаете это вручную, используя PowerPoint, так как это делается один раз за шаблон, а не один раз за сгенерированную презентацию.

Возможно, наиболее распространенной «настройкой» было бы изменение размера шрифта для определенной формы. Это было бы:

 shape.text_frame.paragraphs[0].font.size = Pt(12)
 

Если вы обнаружите, что делаете это чаще, чем иногда, вы можете запустить некоторые полезные функции:

 def shape_set_font_size(shape, points):
    for paragraph in shape.text_frame.paragraphs:
        paragraph.font.size = Pt(points)

shape_set_font_size(shape, 12)
shape_set_font_size(shape_2, 18)
 

Каждый _Run объект имеет шрифт и определенный непрерывный интервал («прогон») символов, включая, возможно, нулевые символы («»). Все символы в запуске имеют один и тот же шрифт, и любые настройки, которые вы задаете на этом уровне, переопределяют любые настройки на более высоких уровнях, которые в противном случае могли бы быть «унаследованы».

У каждого _Paragraph объекта также есть .font свойство, но это шрифт по умолчанию для запусков внутри этого абзаца. Эти характеристики шрифта будут применяться, за исключением случаев, когда запуск переопределяет их настройкой на своем уровне.

Так что правильный поступок в какой-то степени зависит от ситуации. Например, если вы использовали следующее, вы обязательно установите шрифт для всего текста, находящегося в данный момент в абзаце, но не для добавляемого нового текста (который получает новые прогоны).:

 def shape_set_font_size(shape, points):
    for paragraph in shape.text_frame.paragraphs:
        for run in paragraph.runs:
            run.font.size = Pt(points)
 

Я рекомендую вам избегать _Run шрифта уровня, за исключением случаев, когда вы хотите подчеркнуть какое-то конкретное слово или фразу, скажем, выделив ее жирным шрифтом или курсивом. В противном _Paragraph случае-уровень работает нормально и является более гибким.

Комментарии:

1. Это потрясающе! Огромное спасибо.