Summary: | Header/footer extraction must work for .ppt files saved from PPT 2007 | ||
---|---|---|---|
Product: | POI | Reporter: | Dmitry Goldenberg <dgoldenberg> |
Component: | HSLF | Assignee: | POI Developers List <dev> |
Status: | RESOLVED FIXED | ||
Severity: | critical | CC: | dgoldenberg |
Priority: | P1 | ||
Version: | unspecified | ||
Target Milestone: | --- | ||
Hardware: | PC | ||
OS: | Windows XP | ||
Attachments: |
The presentation as a ppt with no header/footer data.
The presentation as a pptx, no header/footer data. The presentation as ppt, with header and footer data. The presentation as pptx, with header and footer data. |
Description
Dmitry Goldenberg
2008-08-07 09:11:06 UTC
Created attachment 22403 [details]
The presentation as a pptx, no header/footer data.
Created attachment 22404 [details]
The presentation as ppt, with header and footer data.
Created attachment 22405 [details]
The presentation as pptx, with header and footer data.
Fixed in r685054. I hope I figured out how PPT 2007 stores headers / footers - quite differently from PPT 2003. If you have a big set of such ppt 2007 files, please exercise the code against it. Yegor I just got the latest POI sources and my testing code still returns all nulls for all the headers and footers. I used the document you can find attached to this issue, marked as "The presentation as ppt, with header and footer data." Thanks. Below is my tester code: package com.attivio.test; import java.io.FileInputStream; import org.apache.poi.hslf.model.HeadersFooters; import org.apache.poi.hslf.model.Slide; import org.apache.poi.hslf.usermodel.SlideShow; public class HslfHeaderFooterExtractor { public static void main(String[] args) throws Exception { FileInputStream fis = new FileInputStream(args[0]); SlideShow ppt = new SlideShow(); fis.close(); Slide[] slides = ppt.getSlides(); // presentation-scope headers / footers HeadersFooters hdd = ppt.getSlideHeadersFooters(); String headerText = hdd.getHeaderText(); String footerText = hdd.getFooterText(); System.out.println(">> Global header: " + headerText); System.out.println(">> Global footer: " + footerText); HeadersFooters notesHdd = ppt.getNotesHeadersFooters(); headerText = notesHdd.getHeaderText(); footerText = notesHdd.getFooterText(); String dateTimeText = notesHdd.getDateTimeText(); System.out.println(">> Notes header: " + headerText); System.out.println(">> Notes footer: " + footerText); System.out.println(">> Notes date time text: " + dateTimeText); // per-slide headers / footers for (int i = 0; i < slides.length; i++) { System.out.println(">> SLIDE #" + (i + 1)); HeadersFooters hdd2 = slides[i].getHeadersFooters(); headerText = hdd2.getHeaderText(); footerText = hdd2.getFooterText(); dateTimeText = hdd2.getDateTimeText(); int slideNum = slides[i].getSlideNumber(); System.out.println(">> HEADER: " + headerText); System.out.println(">> FOOTER: " + footerText); System.out.println(">> DATE TIME: " + dateTimeText); System.out.println(">> SLIDE NUM: " + slideNum); } } } Dmitry, You don't pass FileInputStream to SlideShow: FileInputStream fis = new FileInputStream(args[0]); SlideShow ppt = new SlideShow(); //ERROR fis.close(); Slide[] slides = ppt.getSlides(); it should be SlideShow ppt = new SlideShow(fis); //OK Below is the output: >> Global header: null >> Global footer: THE FOOTER TEXT >> Notes header: THE NOTES HEADER TEXT >> Notes footer: THE NOTES FOOTER TEXT >> Notes date time text: null >> SLIDE #1 >> HEADER: null >> FOOTER: THE FOOTER TEXT >> DATE TIME: Wednesday, August 06, 2008 >> SLIDE NUM: 1 >> SLIDE #2 >> HEADER: null >> FOOTER: THE FOOTER TEXT FOR SLIDE 2 >> DATE TIME: August 06, 2008 >> SLIDE NUM: 2 >> SLIDE #3 >> HEADER: null >> FOOTER: THE FOOTER TEXT >> DATE TIME: Wednesday, August 06, 2008 >> SLIDE NUM: 3 Regards, Yegor (In reply to comment #5) > I just got the latest POI sources and my testing code still returns all nulls > for all the headers and footers. I used the document you can find attached to > this issue, marked as "The presentation as ppt, with header and footer data." > > Thanks. Below is my tester code: > > > package com.attivio.test; > > import java.io.FileInputStream; > > import org.apache.poi.hslf.model.HeadersFooters; > import org.apache.poi.hslf.model.Slide; > import org.apache.poi.hslf.usermodel.SlideShow; > > public class HslfHeaderFooterExtractor { > public static void main(String[] args) throws Exception { > FileInputStream fis = new FileInputStream(args[0]); > SlideShow ppt = new SlideShow(); > fis.close(); > Slide[] slides = ppt.getSlides(); > > // presentation-scope headers / footers > HeadersFooters hdd = ppt.getSlideHeadersFooters(); > String headerText = hdd.getHeaderText(); > String footerText = hdd.getFooterText(); > > System.out.println(">> Global header: " + headerText); > System.out.println(">> Global footer: " + footerText); > > HeadersFooters notesHdd = ppt.getNotesHeadersFooters(); > headerText = notesHdd.getHeaderText(); > footerText = notesHdd.getFooterText(); > String dateTimeText = notesHdd.getDateTimeText(); > > System.out.println(">> Notes header: " + headerText); > System.out.println(">> Notes footer: " + footerText); > System.out.println(">> Notes date time text: " + dateTimeText); > > // per-slide headers / footers > for (int i = 0; i < slides.length; i++) { > > System.out.println(">> SLIDE #" + (i + 1)); > > HeadersFooters hdd2 = slides[i].getHeadersFooters(); > headerText = hdd2.getHeaderText(); > footerText = hdd2.getFooterText(); > dateTimeText = hdd2.getDateTimeText(); > int slideNum = slides[i].getSlideNumber(); > > System.out.println(">> HEADER: " + headerText); > System.out.println(">> FOOTER: " + footerText); > System.out.println(">> DATE TIME: " + dateTimeText); > System.out.println(">> SLIDE NUM: " + slideNum); > > } > > } > } > OMG I had a dumb bug in my tester, sorry! :) |