【问题标题】:python-pptx - set proofing languagepython-pptx - 设置校对语言
【发布时间】:2017-11-01 16:47:04
【问题描述】:

我想使用 python-pptx 模块来更改给定 powerpoint 演示文稿中每个包含文本的形状的校对语言。 不幸的是,我没有管理。 :(

我正在使用 Python 3.6.3 和 python-pptx 0.6.7。

我的代码如下所示:

from pptx import Presentation
from pptx.enum.lang import MSO_LANGUAGE_ID

# In this example code, all proofing language is set to ENGLISH_UK
# all languages can be found in the docs for python-pptx
new_language = MSO_LANGUAGE_ID.ENGLISH_UK

input_file = 'test_pptx.pptx'
output_file = input_file[:-5] + '_modified.pptx'

# Open the presentation
prs = Presentation(input_file)

# iterate through all slides
for slide_no, slide in enumerate(prs.slides):
    # iterate through all shapes/objects on one slide
    for shape in slide.shapes:
        # check if the shape/object has text (pictures e.g. don't have text)
        if shape.has_text_frame:
            # print some output to the console for now
            print('SLIDE NO# ', slide_no + 1)
            print('Object-Name: ', shape.name)
            print('Text -->', shape.text)
            # check for each paragraph of text for the actual shape/object
            for paragraph in shape.text_frame.paragraphs:
                for run in paragraph.runs:
                    # display the current language
                    print('Actual set language: ', run.font.language_id)
                    # set the 'new_language'
                    run.font.language_id = new_language
        else:
            print('SLIDE NO# ', slide_no + 1, ': This object "', shape.name, '" has no text.')
        print(' +++++ next element +++++ ')
    print('--------- next slide ---------')

# save pptx with new filename
prs.save(output_file)

此代码现在可以使用了! (再次感谢史蒂夫!)

请帮忙!提前致谢!

【问题讨论】:

  • 非常感谢!您的代码开箱即用。今天用 python-pptx-0.6.18、python 3.8.5 和语言 MSO_LANGUAGE_ID.FRENCH 测试

标签: python-pptx


【解决方案1】:

我实际上并不完全确定校对功能决定使用哪个字典的所有规则,但语言是在运行级别设置的,我认为这是一个很好的起点。

这在一定程度上是有道理的,因为您可以在一段文本中间有一个外来短语,而只有形状级别的语言设置是不支持的。

因此,一旦通过 .has_text_frame 测试,您将需要一些额外的代码:

for paragraph in shape.text_frame.paragraphs:
    for run in paragraph.runs:
        font = run.font
        print(font.language_id)

这应该会给你类似的东西:

TURKISH (1055)
ENGLISH_UK (2057)
...

请注意,语言 id 值通过 .xml_value 属性上可用的标准语言代码提供了一些附加信息,因此您可以将输出详细说明为:

    for run in paragraph.runs:
        font = run.font
        language_id = font.language_id
        print('\'%s\'' % run.text, language_id, language_id.xml_value)

得到类似的东西:

'the rain in ' ENGLISH_US (1033) en-US
'España' SPANISH (1034) es-ES_tradnl
...

【讨论】:

  • 嘿史蒂夫!这正是我拼图中缺失的部分。现在它起作用了。我会刷我的代码,我会在这里发布!非常感谢!
  • 这也适用于 pptx 中的表格;只需要深入挖掘; for cell in shape.table.iter_cells()for paragraph in cell.text_frame.paragraph 等等……循环嵌套疯狂。
猜你喜欢
  • 2013-10-25
  • 1970-01-01
  • 2011-04-13
  • 2019-08-27
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
  • 2013-01-10
相关资源
最近更新 更多