python-pptx:从幻灯片提取文本时出现奇数分裂

时间:2019-05-20 16:49:42

标签: python powerpoint python-pptx

我正在使用https://python-pptx.readthedocs.io/en/latest/user/quickstart.html上的“从演示文稿中的幻灯片中提取所有文本”示例从某些PowerPoint幻灯片中提取文本。

from pptx import Presentation

prs = Presentation(path_to_presentation)

# text_runs will be populated with a list of strings,
# one for each text run in presentation
text_runs = []

for slide in prs.slides:
    for shape in slide.shapes:
        if not shape.has_text_frame:
            continue
        for paragraph in shape.text_frame.paragraphs:
            for run in paragraph.runs:
                text_runs.append(run.text)

似乎工作正常,除了在某些text_runs中出现奇数拆分。我期望将它们组合在一起的事物正在分解,并且没有明显的模式可以检测到。例如,有时幻灯片标题分为两部分,有时不是

我发现我可以通过重新键入幻灯片上的文本来消除奇数拆分,但这并不能缩放。

我无法或至少不想将拆分文本的两个部分合并在一起,因为有时文本的第二部分已与不同的文本合并。例如,在幻灯片组的标题幻灯片上,标题将被一分为二,标题的第二部分与标题幻灯片的字幕文本合并。

关于如何消除奇数/不必要拆分的任何建议?还是从PowerPoint读取文本时或多或少会出现这种现象?

1 个答案:

答案 0 :(得分:1)

我想这肯定是可以预期的。 PowerPoint会在需要时随时拆分运行,也许是为了突出显示拼写错误的单词,或者只是您暂停输入或输入错误或其他内容。

关于运行可以唯一确定的是它包含的所有字符共享相同的字符格式。例如,无法保证运行就是所谓的“贪婪”,包括尽可能多的 do 共享相同字符格式的字符。

如果您想在运行中重建这种“贪婪”的连贯性,那将取决于您,也许可以使用如下算法:

last_run = None
for run in paragraph.runs:
    if last_run is None:
        last_run = run
        continue
    if has_same_formatting(run, last_run):
        last_run = combine_runs(last_run, run)
        continue
    last_run = run

这使您可以实现has_same_formatting()combine_runs()。这里有一定的优势,因为运行可以包含您不关心的差异,例如肮脏的属性或任何其他内容,并且您可以选择对您而言重要的差异。

has_same_formatting()的实现开始会是:

def has_same_formatting(run, run_2):
    font, font_2 = run.font, run_2.font
    if font.bold != font_2.bold:
        return False
    if font.italic != font_2.italic:
        return False
    # ---same with color, size, type-face, whatever you want---
    return True

combine_runs(base, suffix)看起来像这样:

def combine_runs(base, suffix):
    base.text = base.text + suffix.text
    r_to_remove = suffix._r
    r_to_remove.getparent().remove(r_to_remove)