From 54bbd99ce49254411d67a6e3f04e2cfa3f15cb24 Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Sun, 1 Mar 2015 17:50:16 +0000 Subject: [PATCH] Add missing close and handle theme-pptx in ExtractorFactory. Add creating slide-bitmaps to PPTX integration test. git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1663137 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/stress/XSLFFileHandler.java | 66 +++++++++++++++++-- .../poi/extractor/ExtractorFactory.java | 9 +++ 2 files changed, 71 insertions(+), 4 deletions(-) diff --git a/src/integrationtest/org/apache/poi/stress/XSLFFileHandler.java b/src/integrationtest/org/apache/poi/stress/XSLFFileHandler.java index e6cbb184b..b734c4e4b 100644 --- a/src/integrationtest/org/apache/poi/stress/XSLFFileHandler.java +++ b/src/integrationtest/org/apache/poi/stress/XSLFFileHandler.java @@ -18,35 +18,93 @@ package org.apache.poi.stress; import static org.junit.Assert.assertNotNull; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.FileInputStream; +import java.io.IOException; import java.io.InputStream; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.xslf.XSLFSlideShow; +import org.apache.poi.xslf.usermodel.XMLSlideShow; +import org.apache.poi.xslf.usermodel.XSLFNotes; +import org.apache.poi.xslf.usermodel.XSLFShape; +import org.apache.poi.xslf.usermodel.XSLFSlide; +import org.apache.poi.xslf.usermodel.XSLFTextParagraph; +import org.apache.poi.xslf.usermodel.XSLFTextShape; import org.junit.Test; public class XSLFFileHandler extends AbstractFileHandler { @Override public void handleFile(InputStream stream) throws Exception { - // ignore password protected files - if (POIXMLDocumentHandler.isEncrypted(stream)) return; - XSLFSlideShow slide = new XSLFSlideShow(OPCPackage.open(stream)); assertNotNull(slide.getPresentation()); assertNotNull(slide.getSlideMasterReferences()); assertNotNull(slide.getSlideReferences()); new POIXMLDocumentHandler().handlePOIXMLDocument(slide); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + try { + slide.write(out); + } finally { + out.close(); + } + + createBitmaps(out); } + private void createBitmaps(ByteArrayOutputStream out) throws IOException { + XMLSlideShow ppt = new XMLSlideShow(new ByteArrayInputStream(out.toByteArray())); + Dimension pgsize = ppt.getPageSize(); + XSLFSlide[] xmlSlide = ppt.getSlides(); + int slideSize = xmlSlide.length; + for (int i = 0; i < slideSize; i++) { +// System.out.println("slide-" + (i + 1)); +// System.out.println("" + xmlSlide[i].getTitle()); + + BufferedImage img = new BufferedImage(pgsize.width, pgsize.height, BufferedImage.TYPE_INT_RGB); + Graphics2D graphics = img.createGraphics(); + + // draw stuff + xmlSlide[i].draw(graphics); + + // Also try to read notes + XSLFNotes notes = xmlSlide[i].getNotes(); + if(notes != null) { + for (XSLFShape note : notes) { + note.draw(graphics); + + if (note instanceof XSLFTextShape) { + XSLFTextShape txShape = (XSLFTextShape) note; + for (XSLFTextParagraph xslfParagraph : txShape.getTextParagraphs()) { + xslfParagraph.getText(); + } + } + } + } + } + } + // a test-case to test this locally without executing the full TestAllFiles @Test public void test() throws Exception { - InputStream stream = new FileInputStream("test-data/slideshow/testPPT.pptx"); + InputStream stream = new FileInputStream("test-data/slideshow/pptx2svg.pptx"); try { handleFile(stream); } finally { stream.close(); } } + + + // a test-case to test this locally without executing the full TestAllFiles + @Test + public void testExtractor() throws Exception { + handleExtracting(new File("test-data/slideshow/testPPT.thmx")); + } } \ No newline at end of file diff --git a/src/ooxml/java/org/apache/poi/extractor/ExtractorFactory.java b/src/ooxml/java/org/apache/poi/extractor/ExtractorFactory.java index 60a0f5181..46cd2cd38 100644 --- a/src/ooxml/java/org/apache/poi/extractor/ExtractorFactory.java +++ b/src/ooxml/java/org/apache/poi/extractor/ExtractorFactory.java @@ -51,6 +51,7 @@ import org.apache.poi.poifs.filesystem.DirectoryEntry; import org.apache.poi.poifs.filesystem.DirectoryNode; import org.apache.poi.poifs.filesystem.Entry; import org.apache.poi.poifs.filesystem.POIFSFileSystem; +import org.apache.poi.xslf.XSLFSlideShow; import org.apache.poi.xslf.extractor.XSLFPowerPointExtractor; import org.apache.poi.xslf.usermodel.XSLFRelation; import org.apache.poi.xssf.extractor.XSSFEventBasedExcelExtractor; @@ -190,6 +191,14 @@ public class ExtractorFactory { } } + // special handling for SlideShow-Theme-files, + if(XSLFRelation.THEME_MANAGER.getContentType().equals(corePart.getContentType())) { + return new XSLFPowerPointExtractor(new XSLFSlideShow(pkg)); + } + + // ensure that we close the package again if there is an error opening it, however + // we need to revert the package to not re-write the file via close(), which is very likely not wanted for a TextExtractor! + pkg.revert(); throw new IllegalArgumentException("No supported documents found in the OOXML package (found "+corePart.getContentType()+")"); }