使用python-pptx获取PPT文本框字号时一直显示默认值,求解决
解决python-pptx获取PPT文本字号显示“Default size”的问题
问题核心在于:run.font.size仅会返回手动显式设置的字号,如果文本使用的是PPT默认样式(未手动修改字号),这个属性会返回None——因为继承的样式不会存储在run层级。要获取真实的字号,需要逐层向上查找继承的样式:
- 先检查当前run的字号
- 若不存在,检查所在段落的字号
- 若仍不存在,检查文本框的默认字号
- 最后可以从幻灯片母版的主题样式中获取全局默认字号
以下是修改后的代码,实现完整的字号获取逻辑:
from pptx import Presentation from pptx.enum.text import MSO_TEXT_TYPE pptx_file = 'education.pptx' presentation = Presentation(pptx_file) # 获取母版的正文默认字号(PPT常见默认值为12pt) master_body_font_size = presentation.slide_master.text_styles[MSO_TEXT_TYPE.BODY].font.size master_body_size_pt = master_body_font_size.pt if master_body_font_size else 12 for slide_number, slide in enumerate(presentation.slides): for shape in slide.shapes: if shape.has_text_frame: text_frame = shape.text_frame # 先取文本框的默认字号,没有则用母版默认 text_frame_size_pt = text_frame.font.size.pt if text_frame.font.size else master_body_size_pt for paragraph in text_frame.paragraphs: # 再取段落的默认字号,没有则用文本框层级的字号 para_size_pt = paragraph.font.size.pt if paragraph.font.size else text_frame_size_pt for run in paragraph.runs: # 优先取run的显式字号,没有则向上继承 font_size_pt = run.font.size.pt if run.font.size else para_size_pt print(f"Slide {slide_number + 1}, Text: {run.text}, Font size: {font_size_pt}pt")
补充说明
PPT的样式继承链是:Run → Paragraph → TextFrame → SlideMaster → Theme,只要某一层级有显式设置的字号,就会覆盖上层的默认值;如果所有层级都没设置,最终会使用主题的正文默认字号。
内容的提问来源于stack exchange,提问作者fazliddin fayziev
相关产品推荐
相关产品推荐

