如何使用ColdFusion从PowerPoint文件中提取幻灯片笔记

时间:2012-05-08 21:54:38

标签: coldfusion powerpoint

我有一个.PPT(PowerPoint,可转移到ODP或PPTX)文件,每张幻灯片上都有发言人备注。我想将整个演示文稿提取为动态的内容,这样我就可以创建一个扬声器备忘单,以便在我说话的同时在电话或桌面上运行(带有演讲者备注的幻灯片缩略图)。我经常做这件事就是憎恨手工做。

使用<cfpresentation format="html" showNotes="yes"> 几乎足够简单,它将PPT分成HTML页面,并为每张幻灯片创建一个图像。但是,cfpresentation不转移发言者的说明,它们在翻译中丢失了。

我还尝试了<cfdocument>,它在转换为PDF后无法保留幻灯片备注。

有没有办法从ColdFusion中获取PowerPoint文件中的注释?

4 个答案:

答案 0 :(得分:4)

最简单的解决方案:

将PowerPoint演示文稿转换为OpenOffice ODP格式。这是一个ZIP文件。 CFML可以解压缩它,里面有一个包含幻灯片和注释的content.xml文件,因此CFML可以从该格式中提取注释。

鉴于CFDOCUMENT功能,也许ColdFusion甚至可以为您将PPT转换为ODP?

答案 1 :(得分:3)

无法直接在CF中执行此操作。您可以通过删除底层Java来实现此目的。我已经纠正了。使用<cfpresentation> tag上的showNotes属性,应该将注释添加到HTML中。

作为替代方案,或者如果由于某种原因无效,您应该可以使用Apache POI来执行此操作,但您可能需要使用比版本附带的更新版本的poi冷融,may require some additional work

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;
}

进行复杂的格式化可能是一个挑战(项目符号列表,粗体,斜体,链接,颜色等),因为您需要深入了解TextRun以及相关的API和数字如何生成HTML。

答案 2 :(得分:2)

CFPRESENTATION(至少从版本9开始)确实有showNotes属性,但你仍然需要解析输出。根据输出的标记,jQuery可以简单地抓取你想要的东西。

答案 3 :(得分:0)

感觉不好,我的上述答案没有成功,所以我挖了一下。这有点过时了,但它确实有效。 PPTUtils,它基于@Antony建议的apache库。我更新了这个功能来做你想做的事。您可能需要稍微调整一下才能完成您想要的操作,但我喜欢这个实用程序以数据格式而不是HTML格式向您返回数据这一事实。

以防万一,这里是POI API reference我曾经找到的“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>