PowerPoint & Python: редактирование PPT завершается неудачно при достижении изображения

Я собираю Python-скрипт, который "очистит" шрифт PowerPoint, font-colors, font-size и т. Д. Файла PowerPoint. Я нашел фрагмент кода, который делает то, что мне нужно, но кажется, что он не работает. как только он встречает изображение на слайде.

    import win32com.client, sys
Application = win32com.client.Dispatch("PowerPoint.Application")
Application.Visible = True
Presentation = Application.Presentations.Open(sys.argv[1])
for Slide in Presentation.Slides:
    for Shape in Slide.Shapes:
        Shape.TextFrame.TextRange.Font.Name = "Arial"
        Shape.TextFrame.TextRange.Font.Size = "12"
        Shape.TextFrame.TextRange.Font.Color.RGB = "000000"
Presentation.Save()
Application.Quit()

РЕДАКТИРОВАТЬ: Скопировать и вставить неправильный код... удален нерабочий оператор if.

Все это работает просто отлично, убирая глупо выглядящие шрифты и цвета, пока не достигнет своего первого изображения. Тогда это ломается, и мне преподносят это:

Traceback (most recent call last):
  File "c:/pptpy/convert.py", line 7, in <module>
    Shape.TextFrame.TextRange.Font.Name = "Arial"
  File "C:\Python33\lib\site-packages\win32com\client\dynamic.py", line 511, in __getattr__
    ret = self._oleobj_.Invoke(retEntry.dispid,0,invoke_type,1)
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, 'The specified value is out of range.', None, 0, -2147024809), None)

Если я удаляю все изображения (не фигуры) из файла и запускаю скрипт, он отлично работает, и у меня остается приличное powerpoint. Однако изображения очень важны.

Подробности:

Python 3.3

PowerPoint 2007

Надеемся, что сценарий конвертирует партии по 200-300 PPT(x) за один раз, когда закончится.

Если вам нужно больше деталей, дайте мне знать! Спасибо!

2 ответа

Решение

Хотя ваш код на самом деле не работает, вы можете заменить его if на try catch. Это не может быть элегантным жестким методом.

import win32com.client, sys
Application = win32com.client.Dispatch("PowerPoint.Application")
Application.Visible = True
Presentation = Application.Presentations.Open(sys.argv[1])
for Slide in Presentation.Slides:
    for Shape in Slide.Shapes:
        try:
            Shape.TextFrame.TextRange.Font.Name = "Arial"
            Shape.TextFrame.TextRange.Font.Size = "12"
            Shape.TextFrame.TextRange.Font.Color.RGB = "000000"
        except:
            pass
Presentation.Save()
Application.Quit()  

Вероятно, с вами происходит то, что if всегда имеет значение true, поскольку объект квалифицируется как true. Попробуйте задать длину объекта больше 0 или что-то подобное.

Вы можете окружить активный код чем-то вроде:

If Shape.HasTextFrame Then
   If Shape.TextFrame.HasText Then
      ' do your stuff
   End If
End If
Другие вопросы по тегам