coldfusion - una - notas del orador en power point 2010
Cómo extraer notas de diapositiva de un archivo de PowerPoint con ColdFusion (4)
CFPRESENTATION (al menos a partir de la versión 9) tiene un atributo showNotes, pero aún tendría que analizar el resultado. Dependiendo de la marca de la salida, jQuery haría un corto trabajo de agarrar lo que quieras.
Tengo un archivo .PPT (PowerPoint, transferible a ODP o PPTX) con notas de orador en cada diapositiva. Quiero extraer toda la presentación en algo dinámico para poder crear una hoja de trucos para el hablante para ejecutar en un teléfono o una mesa mientras hablo (miniatura de la diapositiva con las notas del orador). Lo hago con la frecuencia suficiente para ODIO hacerlo a mano.
Esto es casi lo suficientemente fácil con <cfpresentation format="html" showNotes="yes">
que divide el PPT en páginas HTML y crea una imagen para cada diapositiva. cfpresentation, sin embargo, no transfiere las notas del orador, se pierden en la traducción.
También probé <cfdocument>
que no tiene opciones para preservar las notas de diapositiva una vez que se convierte a PDF.
¿Hay alguna manera de sacar las notas del archivo de PowerPoint desde ColdFusion?
No hay forma de hacer esto directamente en CF. Puedes hacer esto bajando al Java subyacente. Estoy corregido. Usando el atributo showNotes en la etiqueta <cfpresentation> , debería agregar las notas al HTML.
Como alternativa, o si eso no funciona por alguna razón, debería poder utilizar el POI de Apache para hacerlo, aunque es posible que necesite usar una versión más reciente de poi que la que se incluye con su versión de ColdFusion, que puede requerir un poco de trabajo adicional .
public static LinkedList<String> getNotes(String filePath) {
LinkedList<String> results = new LinkedList<String>();
// read the powerpoint
FileInputStream fis = new FileInputStream(filePath);
SlideShow slideShow = new SlideShow(is);
fis.close();
// get the slides
Slide[] slides = ppt.getSlides();
// loop over the slides
for (Slide slide : slides) {
// get the notes for this slide.
Notes notes = slide.getNotesSheet();
// get the "text runs" that are part of this slide.
TextRun[] textRuns = notes.getTextRuns();
// build a string with the text from all the runs in the slide.
StringBuilder sb = new StringBuilder();
for (TextRun textRun : textRuns) {
sb.append(textRun.getRawText());
}
// add the resulting string to the results.
results.add(sb.toString());
}
return results;
}
Llevar el formato complejo puede ser un desafío (listas con viñetas, negrita, cursiva, enlaces, colores, etc.), ya que tendrás que profundizar mucho más en TextRun s, y las API relacionadas y calcular cómo generar HTML.
Me sentí mal porque mi respuesta anterior no funcionó, así que cavé un poco. Está un poco anticuado, pero funciona. PPTUtils , que se basa en la biblioteca apache que @Antony sugirió. Actualicé esta función para hacer lo que quieres. Puede que tenga que modificarlo un poco para hacer exactamente lo que quiere, pero me gusta el hecho de que esta utilidad le devuelve los datos en formato de datos en lugar de hacerlo en HTML, lo que tendría que analizar.
Y por si acaso, aquí está la referencia de la API de POI que utilicé para encontrar la función "getNotes ()".
<cffunction name="extractText" access="public" returntype="array" output="true" hint="i extract text from a PPT by means of an array of structs containing an array element for each slide in the PowerPoint">
<cfargument name="pathToPPT" required="true" hint="the full path to the powerpoint to convert" />
<cfset var hslf = instance.loader.create("org.apache.poi.hslf.HSLFSlideShow").init(arguments.pathToPPT) />
<cfset var slideshow = instance.loader.create("org.apache.poi.hslf.usermodel.SlideShow").init(hslf) />
<cfset var slides = slideshow.getSlides() />
<cfset var notes = slideshow.getNotes() />
<cfset var retArr = arrayNew(1) />
<cfset var slide = structNew() />
<cfset var i = "" />
<cfset var j = "" />
<cfset var k = "" />
<cfset var thisSlide = "" />
<cfset var thisSlideText = "" />
<cfset var thisSlideRichText = "" />
<cfset var rawText = "" />
<cfset var slideText = "" />
<cfloop from="1" to="#arrayLen(slides)#" index="i">
<cfset slide.slideText = structNew() />
<cfif arrayLen(notes)>
<cfset slide.notes = notes[i].getTextRuns()[1].getRawText() />
<cfelse>
<cfset slide.notes = "" />
</cfif>
<cfset thisSlide = slides[i] />
<cfset slide.slideTitle = thisSlide.getTitle() />
<cfset thisSlideText = thisSlide.getTextRuns() />
<cfset slideText = "" />
<cfloop from="1" to="#arrayLen(thisSlideText)#" index="j">
<cfset thisSlideRichText = thisSlideText[j].getRichTextRuns() />
<cfloop from="1" to="#arrayLen(thisSlideRichText)#" index="k">
<cfset rawText = thisSlideRichText[k].getText() />
<cfset slideText = slideText & rawText />
</cfloop>
</cfloop>
<cfset slide.slideText = duplicate(slideText) />
<cfset arrayAppend(retArr, duplicate(slide)) />
</cfloop>
<cfreturn retArr />
</cffunction>
La solución más simple:
Convierta la presentación de PowerPoint al formato OpenOffice ODP. Eso es un archivo ZIP. CFML puede descomprimirlo y dentro hay un archivo content.xml que contiene las diapositivas y las notas, por lo que CFML puede extraer las notas de ese formato.
Dada la funcionalidad CFDOCUMENT, ¿quizás ColdFusion puede incluso convertir el PPT en ODP por usted?