python pptx PowerPoint 幻灯片构建 -- 难以理解 pattern/build 方法
python pptx PowerPoint slide build -- trouble understanding the pattern/build approach
我想从头开始自动构建 PowerPoint 幻灯片,因为在 Python 中执行的许多智能操作都需要输出格式。
但是我在理解 python-pptx 文档时遇到了问题;它似乎遵循与我所期望的完全不同的模式,也许是基于我对输出到 tikz 图形所做的大量工作。而且大多数文档更关注处理现有的 powerpoint 文档、提取文本和 table 数据、添加幻灯片、批量编辑标题等
这是我尝试构建 PowerPoint 幻灯片组件的方式的 pseudo-code 版本,下面包含相应的图形版本。从某种意义上说,它独立于稍后将如何使用它们构建组件(形状和组),然后在最后将它们添加到幻灯片。
def rectshape(dikt):
shp = initiate_shape(MSO_SHAPE.RECTANGLE)
# width, height, fill, border, text, font_color, etc:
for k, v in dikt.items():
setattr(shp, k, v)
return(sh)
title_shape_attr = {
'text': None
, 'fill': 'dark blue'
, 'font_color': 'white'
, 'width': Mm(25)
# etc
}
fish_shape_attr = {
# same idea as above
}
text_shape_attr = {
# same ideas as above
}
def build_group(t1, t2, t3):
title_shape_attr['text'] = t1
fish_shape_attr['text'] = t2
text_shape_attr['text'] = t3
s1 = rectshape(title_shape_attr)
s2 = rectshape(fish_shape_attr)
s3 = rectshape(text_shape_attr)
grp = Group()
grp.add_shape(s1, left=Mm(0), top=Mm(0))
grp.add_shape(s2, left=Mm(0), top=Mm(25))
grp.add_shape(s3, left=Mm(0), top=Mm(50))
return(grp)
g1 = build_group('Title A', 'One Fish', 'Text T')
g2 = build_group('Title B', 'Two Fish', 'Text E')
g3 = build_group('Title C', 'Red Fish', 'Text X')
g4 = build_group('Title D', 'Blue Fish', 'Text T')
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])
slide.shapes.add_shape(g1, left = Mm(50), top = Mm(20))
slide.shapes.add_shape(g2, left = Mm(80), top = Mm(20))
slide.shapes.add_shape(g3, left = Mm(110), top = Mm(20))
slide.shapes.add_shape(g4, left = Mm(140), top = Mm(20))
但是,我想我发现这是倒退到 python-pptx 构建幻灯片的方式——我需要从幻灯片开始,然后添加一个组并定义 location/size 同时,然后再次将形状添加到组中,包括位置和大小,只有在所有设置完成后,我返回所有形状和组并更改属性和文本?
例如,在 rectshape 函数中尝试 shp = Shape(MSO_SHAPE.RECTANGLE)
给出
TypeError: init() missing 1 required positional argument: 'parent'
-- 建议形状需要属于其他东西才能创建它。
到目前为止,我的 None 尝试已经足够接近 "what I've tried so far",并且只会真正混淆问题。
任何人都可以帮助勾勒出如何从形状组中构建幻灯片的一般模式/逻辑吗?
理解它的一种方法可能是考虑自己使用 PowerPoint,使用 UI。您首先打开一个演示文稿,然后添加一张幻灯片,然后向幻灯片添加形状。 API 遵循此模型。
只有拥有幻灯片才能添加形状,只有拥有演示文稿才能添加幻灯片,等等。拥有形状后,您可以更改其属性。
所以你需要这样组织你的逻辑。您唯一需要从 pptx 导入的是 Presentation;好的,还有枚举和长度说明符实用程序等等,但没有其他对象,如 Slide 或 Shape 或 Picture。您从来没有机会构建其中之一,因此您不需要 class。您可以通过调用 slide = prs.add_slide()
从演示文稿中获取幻灯片。您可以通过调用 shape = slide.add_shape()
等获得一个新形状。除了 Presentation 之外,没有关于 "loose" 对象的想法。所有其他 PowerPoint 域实体从创建时起就寄存在演示对象层次结构中(Presentation --< Slide --< Shape 粗略)。创建机制总是父对象上的一个方法。
如果您需要预先计算出哪张幻灯片上的内容、有多少项目等,也许要知道在幻灯片上放置对象的位置以及它们的大小,您'你将需要一个中间表示,然后你要么遍历它来进行实际的写作,要么让你的逻辑对象在调用 .render()
或其他东西时写自己,传递给他们幻灯片的引用来写自己。我已经完成了一些以这种方式工作的复杂的财政日历布局,并且需要自己对每个块应该是什么颜色、它们有多大、它们之间的间距是多少等做很多自己的思考,所有这些都是本质上驱动的来自从数据库中提取的数据。
关于 GroupShape
对象,它们在 python-pptx 中是全新的(也许一个月前),如何使用它们作为一个单独的问题让我印象深刻。但是从这里的文档中计算出来应该不难:https://python-pptx.readthedocs.io/en/latest/api/shapes.html#pptx.shapes.shapetree.SlideShapes.add_group_shape
基本上你叫group_shape = shapes.add_group_shape()
。然后,您可以使用在 slide.shapes
上使用的相同方法(例如 .add_picture()
)将形状添加到组形状,或者您可以将一系列现有形状作为 .add_group_shape()
的参数传递给 "group" 那些形状变成返回的组形状。无论哪种方式,您都可以一个一个地添加所有形状;您可以选择创建然后分组还是在组内创建形状。
我想从头开始自动构建 PowerPoint 幻灯片,因为在 Python 中执行的许多智能操作都需要输出格式。
但是我在理解 python-pptx 文档时遇到了问题;它似乎遵循与我所期望的完全不同的模式,也许是基于我对输出到 tikz 图形所做的大量工作。而且大多数文档更关注处理现有的 powerpoint 文档、提取文本和 table 数据、添加幻灯片、批量编辑标题等
这是我尝试构建 PowerPoint 幻灯片组件的方式的 pseudo-code 版本,下面包含相应的图形版本。从某种意义上说,它独立于稍后将如何使用它们构建组件(形状和组),然后在最后将它们添加到幻灯片。
def rectshape(dikt):
shp = initiate_shape(MSO_SHAPE.RECTANGLE)
# width, height, fill, border, text, font_color, etc:
for k, v in dikt.items():
setattr(shp, k, v)
return(sh)
title_shape_attr = {
'text': None
, 'fill': 'dark blue'
, 'font_color': 'white'
, 'width': Mm(25)
# etc
}
fish_shape_attr = {
# same idea as above
}
text_shape_attr = {
# same ideas as above
}
def build_group(t1, t2, t3):
title_shape_attr['text'] = t1
fish_shape_attr['text'] = t2
text_shape_attr['text'] = t3
s1 = rectshape(title_shape_attr)
s2 = rectshape(fish_shape_attr)
s3 = rectshape(text_shape_attr)
grp = Group()
grp.add_shape(s1, left=Mm(0), top=Mm(0))
grp.add_shape(s2, left=Mm(0), top=Mm(25))
grp.add_shape(s3, left=Mm(0), top=Mm(50))
return(grp)
g1 = build_group('Title A', 'One Fish', 'Text T')
g2 = build_group('Title B', 'Two Fish', 'Text E')
g3 = build_group('Title C', 'Red Fish', 'Text X')
g4 = build_group('Title D', 'Blue Fish', 'Text T')
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])
slide.shapes.add_shape(g1, left = Mm(50), top = Mm(20))
slide.shapes.add_shape(g2, left = Mm(80), top = Mm(20))
slide.shapes.add_shape(g3, left = Mm(110), top = Mm(20))
slide.shapes.add_shape(g4, left = Mm(140), top = Mm(20))
但是,我想我发现这是倒退到 python-pptx 构建幻灯片的方式——我需要从幻灯片开始,然后添加一个组并定义 location/size 同时,然后再次将形状添加到组中,包括位置和大小,只有在所有设置完成后,我返回所有形状和组并更改属性和文本?
例如,在 rectshape 函数中尝试 shp = Shape(MSO_SHAPE.RECTANGLE)
给出
TypeError: init() missing 1 required positional argument: 'parent'-- 建议形状需要属于其他东西才能创建它。 到目前为止,我的
None 尝试已经足够接近 "what I've tried so far",并且只会真正混淆问题。
任何人都可以帮助勾勒出如何从形状组中构建幻灯片的一般模式/逻辑吗?
理解它的一种方法可能是考虑自己使用 PowerPoint,使用 UI。您首先打开一个演示文稿,然后添加一张幻灯片,然后向幻灯片添加形状。 API 遵循此模型。
只有拥有幻灯片才能添加形状,只有拥有演示文稿才能添加幻灯片,等等。拥有形状后,您可以更改其属性。
所以你需要这样组织你的逻辑。您唯一需要从 pptx 导入的是 Presentation;好的,还有枚举和长度说明符实用程序等等,但没有其他对象,如 Slide 或 Shape 或 Picture。您从来没有机会构建其中之一,因此您不需要 class。您可以通过调用 slide = prs.add_slide()
从演示文稿中获取幻灯片。您可以通过调用 shape = slide.add_shape()
等获得一个新形状。除了 Presentation 之外,没有关于 "loose" 对象的想法。所有其他 PowerPoint 域实体从创建时起就寄存在演示对象层次结构中(Presentation --< Slide --< Shape 粗略)。创建机制总是父对象上的一个方法。
如果您需要预先计算出哪张幻灯片上的内容、有多少项目等,也许要知道在幻灯片上放置对象的位置以及它们的大小,您'你将需要一个中间表示,然后你要么遍历它来进行实际的写作,要么让你的逻辑对象在调用 .render()
或其他东西时写自己,传递给他们幻灯片的引用来写自己。我已经完成了一些以这种方式工作的复杂的财政日历布局,并且需要自己对每个块应该是什么颜色、它们有多大、它们之间的间距是多少等做很多自己的思考,所有这些都是本质上驱动的来自从数据库中提取的数据。
关于 GroupShape
对象,它们在 python-pptx 中是全新的(也许一个月前),如何使用它们作为一个单独的问题让我印象深刻。但是从这里的文档中计算出来应该不难:https://python-pptx.readthedocs.io/en/latest/api/shapes.html#pptx.shapes.shapetree.SlideShapes.add_group_shape
基本上你叫group_shape = shapes.add_group_shape()
。然后,您可以使用在 slide.shapes
上使用的相同方法(例如 .add_picture()
)将形状添加到组形状,或者您可以将一系列现有形状作为 .add_group_shape()
的参数传递给 "group" 那些形状变成返回的组形状。无论哪种方式,您都可以一个一个地添加所有形状;您可以选择创建然后分组还是在组内创建形状。