Python-PPTX文本格式化过程

Python-PPTX Text Formatting Process

pptx** 社区!

如果下面的方法是格式化文本的正确方法,请您指导我吗?

换句话说,我是否必须添加:prun 以及我添加到 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)

不,通常不会。有一些快捷方式,大多数情况下默认值应该可以正常工作。

一个典型的形状添加操作是这样的:

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 属性,但这一个是 运行 的 默认 字体那段里面。这些字体特征将应用 除了 ,其中 运行 使用其级别的设置覆盖它们。

因此,正确的做法在某种程度上取决于具体情况。例如,如果您使用以下内容,您将确保为段落中当前的所有文本设置字体,但不为添加的新文本(获取新的 运行s)设置字体:

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 级别工作正常并且更灵活。

为了赞美 Scanny 的回应,我创建了一组函数来将格式应用于 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
)

要允许您使用 BLUERED 等颜色的友好名称,您需要设置一个映射文件,或者您可以直接传递 fill_color=RGBColor(255, 255, 255).