Переставьте слайды PowerPoint автоматически, используя python-pptx - PullRequest
1 голос
/ 16 мая 2019

Обычно мы используем powerpoint для облегчения наших экспериментов. Мы используем «разделы» в PowerPoint, чтобы объединить группы слайдов для каждой экспериментальной задачи. Перемещение секций в противовес порядку задач эксперимента было большой работой!

Я подумал, что мы могли бы заранее определить порядок противовеса (используя строку чисел, представляющих порядок секций) в CSV, который можно прочитать из python. Затем с помощью python-pptx переместите разделы и сохраните файл для каждого заказа. У меня проблема с пониманием того, как читать разделы из python-pptx. Если у кого-то есть лучшее решение, чем python, пожалуйста, дайте мне знать.

Спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 17 мая 2019

Как объяснено в документации ( конкретно в этом разделе ):

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

Или, другими словами, в настоящее время невозможно можно перемещать слайды, как вы предлагали. Лучшая работа, которую я использовал, - это создание новой презентации и изменение порядка слайдов в ней (поскольку вы можете добавлять слайды).

Например, скажем, у меня есть слайды в Presentation1.pptx:

[0]
[1]
[2]
[3]
[4]

Но я хочу:

[2]
[3]
[4]
[0]
[1]

Ваш код (в не проверенном псевдокоде) будет:

old_presentation = Presentation("Presentation1.pptx")
new_presentation = Presentation()

for slide in old_presentation.slides[2:]:
    new_slide = new_presentation.slides.add_slide() # transfer the contents into new presentation for slides [2] [3] [4]
    populate_new_slide_from_old_slide(slide, new_slide)

for slide in old_presentation.slides[:2]:
    new_slide = new_presentation.slides.add_slide() # transfer the contents into new presentation for slides [0] [1]
    populate_new_slide_from_old_slide(slide, new_slide)

new_presentation.save()

Где populate_new_slide_from_old_slide() будет выглядеть (почти уверен, что это будет работать как есть, но опять же я не проверял это):

def populate_new_slide_from_old_slide(slide, new_slide):
    shapes_to_transfer = slide.shapes
    for shape in shapes_to_transfer:
        new_shape = new_slide.shapes.add_shape(shape)

Я считаю, что заполнители тоже являются фигурами, поэтому их нужно переносить этим методом!

Обратите внимание, я некоторое время не кодировал .pptx, поэтому фактическая реализация может быть немного другой. Как концепция, в настоящее время это единственный способ сделать то, что вы просите. По моему мнению, если вы активно генерируете данные (а не просто реорганизуете их после факта), вероятно, было бы проще просто создать объект new_presentation и подключить к нему ваши данные. Мне кажется странным продолжать генерировать вывод в старом формате и затем преобразовывать его в новый формат. Например, когда вышли DVD, люди начали ставить свои фильмы на это (разумный вариант) вместо того, чтобы делать VHS, а затем переносить VHS на DVD каким-то произвольным способом (очень специфический вариант, от которого я пытаюсь вас отговорить).

0 голосов
/ 12 июля 2019

Было бы целесообразно - если все, что мы делаем, это переупорядочить - прочитать XML и переписать его с переставленными элементами слайда?

Далее - для случая "удаления" - возможно ли простоудалить элемент слайда в XML?(Я понимаю, что это может оставить в файле висячие объекты, такие как изображения.)

Процесс извлечения XML и перезаписи его в копию файла, вероятно, не слишком обременителен.

...