我有一个.PPT(PowerPoint,可转移到ODP或PPTX)文件,每张幻灯片上都有发言人备注。我想将整个演示文稿提取为动态的内容,这样我就可以创建一个扬声器备忘单,以便在我说话的同时在电话或桌面上运行(带有演讲者备注的幻灯片缩略图)。我经常做这件事就是憎恨手工做。
使用<cfpresentation format="html" showNotes="yes">
几乎足够简单,它将PPT分成HTML页面,并为每张幻灯片创建一个图像。但是,cfpresentation不转移发言者的说明,它们在翻译中丢失了。
我还尝试了<cfdocument>
,它在转换为PDF后无法保留幻灯片备注。
有没有办法从ColdFusion中获取PowerPoint文件中的注释?
答案 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>