Fullmenu null

 

29 April 2018

Supongamos que por causas del destino hasta ahora has tenido que trabajar con el formato .pptx (PowerPoint) ya sea para la creación de una presentación propia, para la empresa donde trabajas, etc pero ahora quieres compartirla en internet y todos sabemos que el formato powerpoint NO es el indicado, sino que te gustaría usar HTML para que se pudiera ver en cualquier navedor. Para ello vamos a convertir tu presentación a HTML usando el framework de presentaciones RevealJS.

En este script vamos a poder leer cada una de las diapositivas del documento y con la ayuda de una plantilla defininida crear un fichero .adoc que nos permitirá crear la nueva presentación utilizando el backend RevealJs de Asciidoctor.

Preparación

Estos son los plugins que vamos a necesitar:

Grapes
@Grapes([
        @Grab(group='org.apache.poi',  module='poi',            version='3.17'    ),
        @Grab(group='org.apache.poi',  module='poi-ooxml',      version='3.17'    ),
        @Grab(group='org.asciidoctor', module='asciidoctorj',   version='1.5.6'   ),
        @Grab(group='org.jruby',       module='jruby-complete', version='9.1.15.0')
])

Parsear el PowerPoint

XMLSlideShow nos va permitir acceder a la presentación pasando como argumento un objeto tipo FileInputStream que contiene nuestra presentación en formato .pptx.

El siguiente paso es recorrer cada una de las diapositivas extrayendo el texto y la imagen (si la tiene) de cada una de las diapositivas. Si nuestro script encuentra un objeto de tipo XSLFPictureShape será una imagen y creará un png con ella.

Una vez ha terminado de parsear la diapositiva incrementará el fichero slide.adoc con la información obtenida de la misma creando un nuevo apartado asciidoctor

File file = new File("slide.adoc")
XMLSlideShow ppt = new XMLSlideShow(new FileInputStream('titulo.pptx'))

ppt.getSlides().each{slide->
    String text = ""
    String image=""
    slide.getShapes().each{shape->
        if (shape instanceof XSLFPictureShape ){
            if (shape.getPictureData()){
                new File(shape.getPictureData().getFileName()) << shape.getPictureData().getData()
                image = "image:${shape.getPictureData().getFileName()}[]"
            }
        }else{
            if (shape.text)
                text = shape.text
        }
    }

    file <<  """
== ${text}
${slide_c.image}
"""
}

RevealJS

Una vez creado el fichero .adoc necesitamos convertirlo en formato html con la ayuda del backend reveal.js y de asciidoctor-reveal.js

Como ambos deben encontrarse descargados usaremos el método dumpRevealJS que se encargará de descargar estos proyectos en los subdiretorios adecuados:

void dumpRevealJS(){
    ["git", "clone", "https://github.com/hakimel/reveal.js.git"].execute()
    ["git", "clone", "https://github.com/asciidoctor/asciidoctor-reveal.js.git"].execute()
}

Conversión con Asciidoctor

Por último sólo queda la conversión con la ayuda de Asciidoctor y Reveal.js para lo cual usaremos un OptionsBuilder al que vamos a indicar donde se encuentran las "templates" que nos hemos bajado previamente. Así mismo vamos a indicar que usaremos como backend el revealjs.

Si todo ha ido bien, el script nos habrá creado un slide.html con nuestra presentación.

void createSlides(){
    asciidoctor = Factory.create()
    options = OptionsBuilder.options().
            templateDirs(new File('./asciidoctor-reveal.js/','templates')).
            backend('revealjs').
            inPlace(true).
            safe(SafeMode.UNSAFE).
            get()

    asciidoctor.convertFile(new File("slide.adoc"), options)
}

Script
//tag::grapes[]
@Grapes([
        @Grab(group='org.apache.poi',  module='poi',            version='3.17'    ),
        @Grab(group='org.apache.poi',  module='poi-ooxml',      version='3.17'    ),
        @Grab(group='org.asciidoctor', module='asciidoctorj',   version='1.5.6'   ),
        @Grab(group='org.jruby',       module='jruby-complete', version='9.1.15.0')
])
//end::grapes[]

import org.apache.poi.xslf.usermodel.*
import org.apache.poi.xslf.usermodel.XMLSlideShow

import org.asciidoctor.SafeMode
import org.asciidoctor.OptionsBuilder
import org.asciidoctor.Asciidoctor.Factory


//tag::create[]
void createSlides(){
    asciidoctor = Factory.create()
    options = OptionsBuilder.options().
            templateDirs(new File('./asciidoctor-reveal.js/','templates')).
            backend('revealjs').
            inPlace(true).
            safe(SafeMode.UNSAFE).
            get()

    asciidoctor.convertFile(new File("slide.adoc"), options)
}
//end::create[]

//tag::load[]
void dumpRevealJS(){
    ["git", "clone", "https://github.com/hakimel/reveal.js.git"].execute()
    ["git", "clone", "https://github.com/asciidoctor/asciidoctor-reveal.js.git"].execute()
}
//end::load[]

// limpiamos si hubiera restos anteriores
new File('.').eachFileMatch(~/slide.adoc/) { file ->
    file.delete()
}

//tag::each[]
File file = new File("slide.adoc")
XMLSlideShow ppt = new XMLSlideShow(new FileInputStream('titulo.pptx'))

ppt.getSlides().each{slide->
    String text = ""
    String image=""
    slide.getShapes().each{shape->
        if (shape instanceof XSLFPictureShape ){
            if (shape.getPictureData()){
                new File(shape.getPictureData().getFileName()) << shape.getPictureData().getData()
                image = "image:${shape.getPictureData().getFileName()}[]"
            }
        }else{
            if (shape.text)
                text = shape.text
        }
    }

    file <<  """
== ${text}
${slide_c.image}
"""
}
//end::each[]

dumpRevealJS()
createSlides()
println "Creado!!!"