[英]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.