Saltar al contenido

Python-pptx: copiar diapositiva

Solución:

Esto es lo que encontré en GitHub y me funciona. Cambié un par de cosas para mi proyecto. Deberá importar seis y copiar. Estoy usando pptx-6.10

def duplicate_slide(pres, index):
    template = pres.slides[index]
    try:
        blank_slide_layout = pres.slide_layouts[12]
    except:
        blank_slide_layout = pres.slide_layouts[len(pres.slide_layouts)]

    copied_slide = pres.slides.add_slide(blank_slide_layout)

    for shp in template.shapes:
        el = shp.element
        newel = copy.deepcopy(el)
        copied_slide.shapes._spTree.insert_element_before(newel, 'p:extLst')

    for _, value in six.iteritems(template.part.rels):
        # Make sure we don't copy a notesSlide relation as that won't exist
        if "notesSlide" not in value.reltype:
            copied_slide.part.rels.add_relationship(
                value.reltype,
                value._target,
                value.rId
            )

    return copied_slide

Luego puede crear la copia pasando su presentación y el índice de diapositivas de su plantilla:

copied_slide = duplicate_slide(pres, 4)

Todavía estoy trabajando en editar las formas de la diapositiva copiada, una vez que esté más avanzado en mi proyecto, puedo actualizar

Quería presentar mi solución alternativa para copiar diapositivas. Utilizo una plantilla ppt y la completé. Sé antes de completar las diapositivas qué diapositivas de la plantilla deben copiarse y con qué frecuencia. Lo que hago entonces es copiar las diapositivas y guardar el nuevo ppt con las diapositivas copiadas. Después de guardar, puedo abrir el ppt con las diapositivas copiadas y usar pptx para completar las diapositivas.

import win32com.client
ppt_instance = win32com.client.Dispatch('PowerPoint.Application')
#open the powerpoint presentation headless in background
read_only = True
has_title = False
window    = False
prs = ppt_instance.Presentations.open('path/ppt.pptx',read_only,has_title,window)

nr_slide = 1
insert_index = 1
prs.Slides(nr_slide).Copy()
prs.Slides.Paste(Index=insert_index)

prs.SaveAs('path/new_ppt.pptx')
prs.Close()

#kills ppt_instance
ppt_instance.Quit()
del ppt_instance

En este caso, la primera diapositiva se copiaría de la presentación y se insertaría después de la primera diapositiva de la misma presentación.

¡Espero que esto ayude a alguno de ustedes!

Estaba usando la respuesta de n00by0815 y funcionó muy bien hasta que tuve que copiar imágenes. Aquí está mi versión adaptada que maneja imágenes. Este código crea una copia local de la imagen y luego la agrega a la diapositiva. Estoy seguro de que hay una forma más limpia, pero esto funciona.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *