4

すべてのスライドにスピーカー ノートを含む .PPT (PowerPoint、ODP または PPTX に転送可能) ファイルがあります。プレゼンテーション全体を動的なものに抽出して、話している間に電話やテーブルで実行するスピーカー チート シートを作成できるようにしたいと考えています (スライドのサムネイルとスピーカー ノート)。私はこれを手作業で行うのが嫌いなほど頻繁に行います。

これは、 PPTを HTML ページに分割し、すべてのスライドの画像を作成するのとほぼ同じです。<cfpresentation format="html" showNotes="yes">ただし、cfpresentation はスピーカー ノートを転送せず、翻訳中に失われます。

<cfdocument>また、PDF に変換した後にスライド ノートを保持するオプションがないものも試しました。

ColdFusion 内から PowerPoint ファイルからメモを取得する方法はありますか?

4

4 に答える 4

4

最も簡単な解決策:

PowerPoint プレゼンテーションを OpenOffice ODP 形式に変換します。それがZIPファイルです。CFML はそれを解凍でき、その中にスライドとメモを含む content.xml ファイルがあるため、CFML はその形式からメモを抽出できます。

CFDOCUMENT 機能があれば、ColdFusion は PPT を ODP に変換することさえできるのでしょうか?

于 2012-05-11T18:06:06.850 に答える
3

これを CF で直接行う方法はありません。これを行うには、基盤となる Java にドロップします。私は訂正します。<cfpresentation> タグでshowNotes 属性を使用すると、HTML にメモが追加されます。

別の方法として、または何らかの理由でそれが機能しない場合は、Apache POIを使用してこれを行うことができますが、coldfusion のバージョンに付属しているバージョンよりも新しいバージョンの poi を使用する必要がある場合があります。いくつかの追加作業

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 の生成方法を理解する必要があるためです。

于 2012-05-09T00:40:50.387 に答える
2

CFPRESENTATION(少なくともバージョン9以降)にはshowNotes属性がありますが、それでも出力を解析する必要があります。出力のマークアップに応じて、jQueryは必要なものを取得するための短い作業を行います。

于 2012-05-09T01:56:47.953 に答える
0

上記の答えがうまくいかなかったので、少し掘り下げました。少し古いですが、機能します。 PPTUtilsは、@Antonyが提案したapacheライブラリに基づいています。私はあなたが望むことをするためにこの1つの関数を更新しました。正確にやりたいことを行うには少し調整する必要があるかもしれませんが、このユーティリティは、解析する必要のあるHTMLではなく、データ形式でデータを返すという事実が気に入っています。

念のため、「getNotes()」関数を見つけるために使用したPOIAPI リファレンスを次に示します。

 <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>
于 2012-05-10T14:42:18.870 に答える