Python 和 PowerPoint 将“<br><br>”替换为“_x000D_”

Python and PowerPoint replace '<br><br>' becomes '_x000D_'

我正在使用 Python pptx 创建 PowerPoint,我的查询结果字符串包含 html '<br><br>',我正在尝试将其替换为 '\n'喜欢:

TDsFirst = "\n" + self.TxtStringFromSQLserver.replace('<br><br>', '\n')
TDPs = TDPsFirst.replace('<br>', '\n')
TipDPsText_run.text = TDPs

这导致以“_x000D_”结尾的行

我做错了什么?如何将“<br>”转换为 returns?

这个行为有点新,但是是预期的行为:
https://python-pptx.readthedocs.io/en/latest/api/text.html#pptx.text.text._Run.text

A 运行 只能包含文本。 line-break 或段落边界发生在更高级别。特别是,line-break 只能出现在段落内的 运行 之间。一个段落 "break" 只能出现在一个 text-frame 段落之间。

因此,根据您要执行的操作,解决方案可能只是在 text-frame 级别进行分配,而不是 运行 级别,因为您的 variable-name TipDPsText_run 建议。 Line-feed 个字符 (\n) 被 TextFrame.text 接受并变成段落边界。

这可能不会完全解决问题,但它可能(我给它 90% 的可能性)并且至少会将问题更改为可以解决的问题。

更新: 进一步检查代码后,实际上换行符本身 "\x0A"Run.text 接受并原封不动地放入 XML 它可能看起来很像 line-break。这种遗留礼貌不会扩展到 carriage-return "\x0D",它的呈现方式与您看到的 "_x000D_" 一样。这个额外的 CR 字节在那里,因为你在 Windows 上 运行ning。因此,您可以通过在文本分配中使用 "\x0A" 而不是 "\n" 来解决这个问题。但我推荐 text-frame 级别分配,因为这种方法更符合 PowerPoint 行为,其中键入 carriage-return 会创建一个新段落。

PowerPoint 仅将 0x0a 处理为换行符。当您使用“Python pptx”在单个占位符中创建额外的行时,如果源文本包含 0x0d 代码,则输出页面会在末尾显示一个奇怪的单词 _x000D_的线。所以我做了一个简单的过滤器来解决这个问题。

此简单代码将 \r\n 替换为单个 \n

def office_comp(usr_txt):
    u_items = usr_txt.splitlines()
    return '\n'.join(u_items)

然后使用 Python pptx 如:

new_slide.placeholders[p].text = office_comp(your_text_asis)