【发布时间】:2020-10-29 14:19:08
【问题描述】:
正在玩 Python PPTX,它似乎没有正确读取幻灯片母版名称。
你可以在这里看到我重命名幻灯片母版
它甚至会在尝试添加幻灯片时出现
但是,当我通过 pptx 加载演示文稿时,名称是 ''。
In [14]: import pptx
In [15]: pres = pptx.Presentation("adsf.pptx")
In [16]: pres.slide_master.name
Out[17]: ''
也许我在 powerpoint 方面做错了什么。我很想知道。我正在使用 Office 2016。作为旁注,我正在挖掘 xml,看起来 slidemaster xml 没有包含与ooxml 中的名称属性相关的任何属性。但是主题 xml 确实如此。让我感到困惑。
感谢您的时间和努力
编辑:
毕竟我找到了我的解决方案并感谢@Scanny
import pptx
import re
from lxml import etree
# This causes pres.slide_master.layout.placeholder.name to be passed to pres.slide.placeholder
@property
def placeholder_name(self):
"""Name of the placeholder inherited from slide master"""
return self._inherited_value("name")
def Presentation(powerpoint=None):
"""
Return a |Presentation| object loaded from *pptx*, where *pptx* can be
either a path to a ``.pptx`` file (a string) or a file-like object. If
*pptx* is missing or ``None``, the built-in default presentation
"template" is loaded.
"""
if powerpoint is None:
powerpoint = pptx.api._default_pptx_path()
# get the package and not just the presentation package
package = pptx.package.Package.open(powerpoint)
# now extract the document
presentation_part = package.main_document_part
if not pptx.api._is_pptx_package(presentation_part):
tmpl = "file '%s' is not a PowerPoint file, content type is '%s'"
raise ValueError(tmpl % (powerpoint, presentation_part.content_type))
# the theme names are the slide master names
themes = (part for part in package.parts if re.search("^/ppt/theme/theme\d+\.xml$",part.partname))
theme_names = [etree.fromstring(theme.blob).get("name") for theme in themes]
# now get the presentation
presentation = presentation_part.presentation
# change the slide master names
for idx,sld_mstr in enumerate(presentation.slide_masters):
sld_mstr.name = theme_names[idx]
return presentation
pptx.Presentation = Presentation
pptx.shapes.placeholder._InheritsDimensions.placeholder_name = placeholder_name
In [2]: pres = pptx.Presentation("adsf.pptx")
In [3]: for sm in pres.slide_masters: print(sm.name)
my master
number 3
my second
In [4]: layout = pres.slide_masters[0].slide_layouts[0]
In [5]: layout.name
Out[5]: 'my master title slide layout'
In [6]: new_slide = pres.slides.add_slide(layout)
In [7]: new_slide.placeholders[0].name
Out[7]: 'Title 1'
In [8]: new_slide.placeholders[0].placeholder_name
Out[8]: 'Main Title'
In [9]: pres.save("test.pptx")
【问题讨论】:
标签: python python-pptx