【问题标题】:Python-PPTX Text Formatting ProcessPython-PPTX 文本格式化过程
【发布时间】:2021-04-27 21:42:20
【问题描述】:

pptx** 社区!

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

换句话说,我是否必须在我添加到 PPTX 的每个文本中添加:prun 以及所有字体属性?

非常感谢您的帮助!

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)

【问题讨论】:

    标签: python python-pptx


    【解决方案1】:

    为了补充 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)

    【讨论】:

    • 太棒了!谢谢@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 对象都有一个字体和一定的连续字符跨度(“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-level 字体,除非您想强调某些特定的单词或短语,例如将其设为粗体或斜体。否则_Paragraph 级别可以正常工作并且更灵活。

    【讨论】:

    • 这太棒了!非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 2013-08-16
    相关资源
    最近更新 更多