2012-05-08 5 views
4

すべてのスライドにスピーカーノートを含む.PPT(PowerPoint、ODPまたはPPTXに転送可能)ファイルがあります。プレゼンテーション全体をダイナミックに抽出して、話している間に電話やテーブルで実行するためのスピーカーチートシートを作成できます(スピーカーノート付きのスライドのサムネイル)。私はこれを手で行うことを嫌うだけのことがしばしばあります。ColdFusionでPowerPointファイルからスライドノートを取り出す方法

ほぼ<cfpresentation format="html" showNotes="yes">で簡単にPPTをHTMLページに分割し、すべてのスライドに画像を作成します。しかし、cfpresentationはスピーカーノートを転送しないので、翻訳に失われます。

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

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

+1

あなたはHSLF poiプロジェクトを見ましたか? http://poi.apache.org/slideshow/index.html(私は広範囲にhssfプロジェクトを使用していますが、それが存在することを知る以外にpptを見ていない) – Antony

+1

それは私だけか、お互いに矛盾する?私は、Javaソリューションで最も具体的なソリューションを持っていると思います。 –

+0

さて、私はいつも問題への複数のアプローチを支持し、私はJavaのアプローチを見たいと思っていました。しかし、ネイティブCF関数のあまり知られていない属性のいくつかを強調する機会も逃しません。 – Sharondio

答えて

4

最も簡単な解決策:

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

CFDOCUMENT機能を使用すると、おそらくColdFusionでPPTをODPに変換することさえできますか?

+0

さらに、元のPPTファイルとPPTXファイルをcfzipで開くことができます。彼らはXMLファイルの束を投げ捨てて、私はそのノートを解析した。ありがとうございました! –

3

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

代わりに、またはそれが何らかの理由で動作しない場合は、Apache POIを使用する必要がありますが、ご使用のバージョンのColdFusionに同梱されているより新しいバージョンのpoiを使用する必要があります。 which 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

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

+0

私のcfpresentationにshowNotes = "yes"を追加することはできません。私はACF 9.0.1の最新バージョンを持っています。それはあなたのために働くのですか?やってみました? –

+0

私は過去にcfpresentationを使用しましたが、現在の環境では64ビット環境では32ビットのdllについては何もできません。それは何をしているのか、していないのですか?エラーを表示していますか? – Sharondio

+0

showNotesは出力を変更しません - 同じファイルがどこにでもメモなしで出力されます。 –

0

私の上記の答えはうまくいかないので、私はちょっと掘りました。それは少し日付がついていますが、動作します。 PPTUtils、これは@Antonyが提案したapacheライブラリに基づいています。私はあなたが望むことをするためにこの1つの機能を更新しました。あなたが望むものを正確に行うために少し微調整しなければならないかもしれませんが、私は、このユーティリティが、解析する必要があるHTMLではなく、データ形式でデータを返してくれるのが好きです。

私は「getNotes()」関数を見つけるために使ったPOI API referenceです。

<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> 
+0

奇妙なことに、PPTUtilsはCF9または10と互換性がないようです。私はこのエラーを受け取ります:Object instantiation exception。 Javaオブジェクトのインスタンス化中に例外が発生しました。クラスは、インタフェースまたは抽象クラスであってはなりません。エラー: '' –

+0

私は10beta(Win7 + Apache 2.2)で使用し、CF 9.0(9.0.1ではなく、WinXP + IIS 6.0)でもテストしました。あなたは私のトラブルシューティングの領域外にJavaエラーを打っています。これはあなたが必要とする一度限りの機能ですか、これを頻繁にやっていきますか? – Sharondio

+0

プレゼンテーションがあるときはいつでもやっています。私は、ショーン・コルフィールドのおかげでうまくいくものがあると思うが、あなたは私に固執する点に値する。 PPT、PPTX、ODPファイルはzipアーカイブですが、プレゼンテーションのcfzipへの別の答えを提案し、メモを抽出し、そこからテキストを解析できますか? –

関連する問題