在生成PPT时,常遇到以下问题:
本方案通过以下步骤解决:
功能:估算文本框能容纳的字符数。
def get_textbox_capacity(shape): """估算文本框的字符容量""" # 1. 获取文本框尺寸(单位:厘米) width = shape.width.cm # 文本框宽度 height = shape.height.cm # 文本框高度 # 2. 过滤非文本框(如图片、表格) if "Text" not in shape.name: return 0 rows = 0 cols = 0 for paragraph in shape.text_frame.paragraphs: for run in paragraph.runs: # 获取字体大小(单位:厘米) font = run.font if font and font.size: font_size = font.size.cm # 字体高度(厘米) # 计算可容纳的行数和列数 rows = int(height // font_size) # 向下取整 cols = int(width // font_size) return rows * cols # 总字符数(行数 × 列数)
关键逻辑:
shape.width.cm
和 shape.height.cm
将 EMU 单位转换为厘米。font.size.cm
获取字体高度(单位:厘米)。功能:截断文本并添加省略号。
def truncate_text(text, max_chars): """截断文本并添加省略号""" if len(text) <= max_chars: return text return text[:max_chars] + "..." # 截断后添加省略号
if __name__ == '__main__': prs = Presentation("template.pptx") # 加载PPT模板 for slide in prs.slides: # 遍历每一页 for shape in slide.shapes: # 遍历每个元素 if shape.has_text_frame: # 过滤文本框 capacity = get_textbox_capacity(shape) print(f"文本框名称:{shape.name}, 容量:{capacity} 字符") # 示例:填充内容时截断 original_text = "这是一个很长的测试文本,需要截断..." truncated_text = truncate_text(original_text, capacity) shape.text = truncated_text # 更新文本内容 prs.save("adjusted.pptx") # 保存处理后的PPT
输出示例:
文本框名称:Text Placeholder 1, 容量:120 字符 文本框名称:Text Box 2, 容量:80 字符
处理结果:
"这是一个很长的测试文本,需要截断..."
(25字符)"这是一个很长的测..."
# 假设中文字符宽度为字体高度的 1.5 倍 cols = int(width // (font_size * 1.5))
paragraph.level
),需在 get_textbox_capacity
中减去缩进宽度:indentation = paragraph.level * 0.5 # 每级缩进 0.5 厘米 usable_width = width - indentation cols = int(usable_width // font_size)
from pptx import Presentation def get_textbox_capacity(shape): """估算文本框的字符容量""" width = shape.width.cm height = shape.height.cm if "Text" not in shape.name: return 0 rows = 0 cols = 0 for paragraph in shape.text_frame.paragraphs: for run in paragraph.runs: font = run.font if font and font.size: font_size = font.size.cm rows = int(height // font_size) cols = int(width // font_size) return rows * cols def truncate_text(text, max_chars): """截断文本并添加省略号""" if len(text) <= max_chars: return text return text[:max_chars] + "..." if __name__ == '__main__': prs = Presentation("template.pptx") for slide in prs.slides: for shape in slide.shapes: if shape.has_text_frame: capacity = get_textbox_capacity(shape) print(f"文本框名称:{shape.name}, 容量:{capacity} 字符") original_text = "这是一个很长的测试文本,需要截断..." truncated_text = truncate_text(original_text, capacity) shape.text = truncated_text prs.save("adjusted.pptx")
本方案通过以下方式解决PPT文本溢出问题:
通过此脚本,可快速批量处理PPT,提升自动化办公效率。如需进一步优化,可根据具体模板调整字体宽度、缩进规则等参数。