温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - Preserve text format on read/write to shape text python pptx
python text python-pptx

其他 - 在读取/写入时保留文本格式以形成文本python pptx

发布于 2020-04-09 11:40:30

我想在形状的文本中执行文本替换。我正在使用类似于以下代码段的代码:

# define key/value
SRKeys, SRVals = ['x','y','z'], [1,2,3]

# define text
text = shape.text

# iterate through values and perform subs
for i in range(len(SRKeys)):
    # replace text
    text = text.replace(SRKeys[i], str(SRVals[i]))

# write text subs to comment box
shape.text = text

但是,如果首字母shape.text具有格式化字符(例如,以粗体表示),则在读取时会删除该格式化。有解决方案吗?

我唯一想到的就是遍历字符并检查格式,然后在写入之前添加这些格式shape.text

查看更多

提问者
Michael Berk
被浏览
83
scanny 2020-02-02 06:05

@ usr2564301在正确的轨道上。在运行级别指定字符格式(也称为“字体”)。这就是奔跑。所有共享相同字符格式的字符的“运行”(序列)。

分配给shape.text您时,将所有以前使用的运行替换为具有默认格式的一个新运行。如果要保留格式,则需要保留文本替换中不直接涉及的所有运行。

这不是一个小问题,因为不能保证在字边界上中断。尝试将运行结果打印出几段,我想您会明白我的意思的。

在粗略的伪代码中,我认为这是您需要采取的方法:

  • 在段落中搜索目标文本以确定其第一个字符的偏移量。
  • 遍历该段中的所有运行,并在运行前保持运行前总共有多少个字符,例如(run_idx,prefix_len,length):(0,0,8),(1,8,4),(2 ,12、9)等。
  • 确定哪个运行是涉及您的搜索字符串的开始,结束和中间运行。
  • 在搜索词的开头分割第一轮,在搜索词的末尾分割最后的轮,并删除除“中间”轮的第一轮以外的所​​有轮。
  • 将中间运行的文本更改为替换文本,并从先前(原始开始)运行中复制格式。也许这是您在拆分开始时所做的最后一点。

这将保留所有不涉及搜索字符串的运行,并保留“已替换”字词中“匹配”字词的格式。

这需要一些当前API不直接支持的操作。对于那些用户,您可以使用低级lxml调用直接操作XML,尽管您可以从python-pptx对象中获取所需的所有现有元素,而不必自己解析XML。