[英]Add Bullet list using python-pptx
我正在使用 python-pptx 库进行 pptx 操作。 我想在pptx文档中添加一个项目符号列表。
我正在使用以下代码段添加列表项:
p = text_frame.add_paragraph()
run = p.add_run()
p.level = 0
run.text = "First"
但它不显示项目符号; 请指导。
目前无法使用 python-pptx 访问 bullet 属性,但我想分享一个对我有用的解决方法。
这需要使用 pptx 模板,我们在其中利用幻灯片布局中的级别可以单独自定义的事实。
例如,在幻灯片布局中,您可以将级别 0 设置为普通文本,将级别 1 设置为项目符号,将级别 2 设置为数字或您想要的任何其他列表样式。 然后,您可以修改字体大小、缩进(使用顶部的标尺)和每个级别的任何其他属性以获得您想要的外观。
对于我的用例,我只是将级别 1 和 2 设置为与级别 0 具有相同的缩进和大小,从而可以通过简单地将级别设置为相应的值来创建项目符号列表和编号列表。
这是我的幻灯片布局在模板文件中的外观:幻灯片布局示例
这就是我在代码中设置相应列表样式的方式:
p.level = 0 # Regular text
p.level = 1 # Bullet
p.level = 2 # Numbers
理论上,您应该能够完全按照您想要的方式设置它,即使使用缩进的子列表等等。 我知道的唯一限制是在幻灯片布局中似乎最多可以自定义 8 个级别。
试试这个:
p = text_frame.add_paragraph()
p.level = 0
p.text = "First"
或者如果 text_frame 已经有一个段落:
p = text_frame.paragraphs[0]
p.level = 0
p.text = "First"
我的解决方案:
from pptx.oxml.xmlchemy import OxmlElement
def SubElement(parent, tagname, **kwargs):
element = OxmlElement(tagname)
element.attrib.update(kwargs)
parent.append(element)
return element
def makeParaBulletPointed(para):
"""Bullets are set to Arial,
actual text can be a different font"""
pPr = para._p.get_or_add_pPr()
## Set marL and indent attributes
pPr.set('marL','171450')
pPr.set('indent','171450')
## Add buFont
_ = SubElement(parent=pPr,
tagname="a:buFont",
typeface="Arial",
panose="020B0604020202020204",
pitchFamily="34",
charset="0"
)
## Add buChar
_ = SubElement(parent=pPr,
tagname='a:buChar',
char="•")
这个问题在 2021 年 5 月 27 日仍然是最新的。 跟进@OD1995 的回答,我想添加更多细节以及我对问题的转向。
我使用以下代码创建了一个新包:
from pptx.oxml.xmlchemy import OxmlElement
def getBulletInfo(paragraph, run=None):
"""Returns the attributes of the given <a:pPr> OxmlElement
as well as its runs font-size.
*param: paragraph* pptx _paragraph object
*param: run* [optional] specific _run object
"""
pPr = paragraph._p.get_or_add_pPr()
if run is None:
run = paragraph.runs[0]
p_info = {
"marL": pPr.attrib['marL'],
"indent": pPr.attrib['indent'],
"level": paragraph.level,
"fontName": run.font.name,
"fontSize": run.font.size,
}
return p_info
def SubElement(parent, tagname, **kwargs):
"""Helper for Paragraph bullet Point
"""
element = OxmlElement(tagname)
element.attrib.update(kwargs)
parent.append(element)
return element
def pBullet(
paragraph, # paragraph object
font, # fontName of that needs to be applied to bullet
marL='864000',
indent='-322920',
size='350000' # fontSize (in )
):
"""Bullets are set to Arial,
actual text can be a different font
"""
pPr = paragraph._p.get_or_add_pPr()
# Set marL and indent attributes
# Indent is the space between the bullet and the text.
pPr.set('marL', marL)
pPr.set('indent', indent)
# Add buFont
_ = SubElement(parent=pPr,
tagname="a:buSzPct",
val="350000"
)
_ = SubElement(parent=pPr,
tagname="a:buFont",
typeface=font,
# panose="020B0604020202020204",
# pitchFamily="34",
# charset="0"
)
# Add buChar
_ = SubElement(parent=pPr,
tagname='a:buChar',
char="•"
)
我这样做的原因是因为我对项目符号字符与原始字符的大小不同并且文本粘在项目符号上感到沮丧。
getBulletInfo()
允许我从现有段落中检索信息。 我使用此信息填充元素的属性(使其与模板相同)。
无论如何,主要的附加组件是创建一个子元素<a:buSzPct>
( 此处和此处的文档)。 这是一个可以从 25% 到 350% (100000 = 100%) 的大小百分比。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.