More XSLF tests for the less common extensions, and initial support for .thmx (theme) files - currently just stretches to not breaking...
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@958923 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
bcb8069d1a
commit
5f323eb6ea
@ -34,6 +34,7 @@
|
|||||||
|
|
||||||
<changes>
|
<changes>
|
||||||
<release version="3.7-beta2" date="2010-??-??">
|
<release version="3.7-beta2" date="2010-??-??">
|
||||||
|
<action dev="POI-DEVELOPERS" type="fix">XSLFSlideShow shouldn't break on .thmx (theme) files. Support for them is still very limited though</action>
|
||||||
</release>
|
</release>
|
||||||
<release version="3.7-beta1" date="2010-06-20">
|
<release version="3.7-beta1" date="2010-06-20">
|
||||||
<action dev="POI-DEVELOPERS" type="fix">49432 - Lazy caching of XSSFComment CTComment objects by reference, to make repeated comment searching faster</action>
|
<action dev="POI-DEVELOPERS" type="fix">49432 - Lazy caching of XSSFComment CTComment objects by reference, to make repeated comment searching faster</action>
|
||||||
|
@ -16,23 +16,30 @@
|
|||||||
==================================================================== */
|
==================================================================== */
|
||||||
package org.apache.poi;
|
package org.apache.poi;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.IOException;
|
||||||
import java.util.*;
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.io.PushbackInputStream;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import org.apache.poi.poifs.common.POIFSConstants;
|
|
||||||
import org.apache.poi.util.IOUtils;
|
|
||||||
import org.apache.poi.util.PackageHelper;
|
|
||||||
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
||||||
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
|
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
|
||||||
import org.apache.poi.openxml4j.opc.*;
|
import org.apache.poi.openxml4j.opc.OPCPackage;
|
||||||
|
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||||
|
import org.apache.poi.openxml4j.opc.PackagePartName;
|
||||||
|
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
||||||
|
import org.apache.poi.openxml4j.opc.PackageRelationshipCollection;
|
||||||
|
import org.apache.poi.openxml4j.opc.PackagingURIHelper;
|
||||||
|
import org.apache.poi.poifs.common.POIFSConstants;
|
||||||
|
import org.apache.poi.util.IOUtils;
|
||||||
|
|
||||||
public abstract class POIXMLDocument extends POIXMLDocumentPart{
|
public abstract class POIXMLDocument extends POIXMLDocumentPart{
|
||||||
public static final String DOCUMENT_CREATOR = "Apache POI";
|
public static final String DOCUMENT_CREATOR = "Apache POI";
|
||||||
|
|
||||||
public static final String CORE_PROPERTIES_REL_TYPE = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties";
|
|
||||||
public static final String EXTENDED_PROPERTIES_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties";
|
|
||||||
public static final String CUSTOM_PROPERTIES_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties";
|
|
||||||
|
|
||||||
// OLE embeddings relation name
|
// OLE embeddings relation name
|
||||||
public static final String OLE_OBJECT_REL_TYPE="http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject";
|
public static final String OLE_OBJECT_REL_TYPE="http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject";
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@ import java.net.URI;
|
|||||||
import org.apache.xmlbeans.XmlOptions;
|
import org.apache.xmlbeans.XmlOptions;
|
||||||
import org.apache.poi.util.POILogger;
|
import org.apache.poi.util.POILogger;
|
||||||
import org.apache.poi.util.POILogFactory;
|
import org.apache.poi.util.POILogFactory;
|
||||||
|
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
||||||
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
|
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
|
||||||
import org.apache.poi.openxml4j.opc.*;
|
import org.apache.poi.openxml4j.opc.*;
|
||||||
|
|
||||||
@ -86,6 +87,24 @@ public class POIXMLDocumentPart {
|
|||||||
this.packageRel = rel;
|
this.packageRel = rel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When you open something like a theme, call this to
|
||||||
|
* re-base the XML Document onto the core child of the
|
||||||
|
* current core document
|
||||||
|
*/
|
||||||
|
protected final void rebase(OPCPackage pkg) throws InvalidFormatException {
|
||||||
|
PackageRelationshipCollection cores =
|
||||||
|
packagePart.getRelationshipsByType(PackageRelationshipTypes.CORE_DOCUMENT);
|
||||||
|
if(cores.size() != 1) {
|
||||||
|
throw new IllegalStateException(
|
||||||
|
"Tried to rebase using " + PackageRelationshipTypes.CORE_DOCUMENT +
|
||||||
|
" but found " + cores.size() + " parts of the right type"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
packageRel = cores.getRelationship(0);
|
||||||
|
packagePart = POIXMLDocument.getTargetPart(pkg, packageRel);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides access to the underlying PackagePart
|
* Provides access to the underlying PackagePart
|
||||||
*
|
*
|
||||||
|
@ -28,6 +28,7 @@ import org.apache.poi.openxml4j.opc.OPCPackage;
|
|||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||||
import org.apache.poi.openxml4j.opc.PackagePartName;
|
import org.apache.poi.openxml4j.opc.PackagePartName;
|
||||||
import org.apache.poi.openxml4j.opc.PackageRelationshipCollection;
|
import org.apache.poi.openxml4j.opc.PackageRelationshipCollection;
|
||||||
|
import org.apache.poi.openxml4j.opc.PackageRelationshipTypes;
|
||||||
import org.apache.poi.openxml4j.opc.PackagingURIHelper;
|
import org.apache.poi.openxml4j.opc.PackagingURIHelper;
|
||||||
import org.apache.poi.openxml4j.opc.TargetMode;
|
import org.apache.poi.openxml4j.opc.TargetMode;
|
||||||
import org.apache.poi.openxml4j.opc.internal.PackagePropertiesPart;
|
import org.apache.poi.openxml4j.opc.internal.PackagePropertiesPart;
|
||||||
@ -68,7 +69,7 @@ public class POIXMLProperties {
|
|||||||
|
|
||||||
// Extended properties
|
// Extended properties
|
||||||
PackageRelationshipCollection extRel =
|
PackageRelationshipCollection extRel =
|
||||||
pkg.getRelationshipsByType(POIXMLDocument.EXTENDED_PROPERTIES_REL_TYPE);
|
pkg.getRelationshipsByType(PackageRelationshipTypes.EXTENDED_PROPERTIES);
|
||||||
if(extRel.size() == 1) {
|
if(extRel.size() == 1) {
|
||||||
extPart = pkg.getPart( extRel.getRelationship(0));
|
extPart = pkg.getPart( extRel.getRelationship(0));
|
||||||
org.openxmlformats.schemas.officeDocument.x2006.extendedProperties.PropertiesDocument props = org.openxmlformats.schemas.officeDocument.x2006.extendedProperties.PropertiesDocument.Factory.parse(
|
org.openxmlformats.schemas.officeDocument.x2006.extendedProperties.PropertiesDocument props = org.openxmlformats.schemas.officeDocument.x2006.extendedProperties.PropertiesDocument.Factory.parse(
|
||||||
@ -82,7 +83,7 @@ public class POIXMLProperties {
|
|||||||
|
|
||||||
// Custom properties
|
// Custom properties
|
||||||
PackageRelationshipCollection custRel =
|
PackageRelationshipCollection custRel =
|
||||||
pkg.getRelationshipsByType(POIXMLDocument.CUSTOM_PROPERTIES_REL_TYPE);
|
pkg.getRelationshipsByType(PackageRelationshipTypes.CUSTOM_PROPERTIES);
|
||||||
if(custRel.size() == 1) {
|
if(custRel.size() == 1) {
|
||||||
custPart = pkg.getPart( custRel.getRelationship(0));
|
custPart = pkg.getPart( custRel.getRelationship(0));
|
||||||
org.openxmlformats.schemas.officeDocument.x2006.customProperties.PropertiesDocument props = org.openxmlformats.schemas.officeDocument.x2006.customProperties.PropertiesDocument.Factory.parse(
|
org.openxmlformats.schemas.officeDocument.x2006.customProperties.PropertiesDocument props = org.openxmlformats.schemas.officeDocument.x2006.customProperties.PropertiesDocument.Factory.parse(
|
||||||
|
@ -55,6 +55,11 @@ public interface PackageRelationshipTypes {
|
|||||||
*/
|
*/
|
||||||
String EXTENDED_PROPERTIES = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties";
|
String EXTENDED_PROPERTIES = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom properties relationship type.
|
||||||
|
*/
|
||||||
|
String CUSTOM_PROPERTIES = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Core properties relationship type.
|
* Core properties relationship type.
|
||||||
*/
|
*/
|
||||||
|
@ -29,6 +29,7 @@ import org.apache.poi.openxml4j.opc.PackagePart;
|
|||||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
||||||
import org.apache.poi.openxml4j.opc.PackageRelationshipCollection;
|
import org.apache.poi.openxml4j.opc.PackageRelationshipCollection;
|
||||||
import org.apache.xmlbeans.XmlException;
|
import org.apache.xmlbeans.XmlException;
|
||||||
|
import org.openxmlformats.schemas.drawingml.x2006.main.ThemeDocument;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTCommentList;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTCommentList;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTNotesSlide;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTNotesSlide;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTPresentation;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTPresentation;
|
||||||
@ -62,6 +63,7 @@ public class XSLFSlideShow extends POIXMLDocument {
|
|||||||
public static final String PRESENTATIONML_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml";
|
public static final String PRESENTATIONML_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml";
|
||||||
public static final String PRESENTATIONML_TEMPLATE_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml";
|
public static final String PRESENTATIONML_TEMPLATE_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml";
|
||||||
public static final String PRESENTATION_MACRO_CONTENT_TYPE = "application/vnd.ms-powerpoint.presentation.macroEnabled.main+xml";
|
public static final String PRESENTATION_MACRO_CONTENT_TYPE = "application/vnd.ms-powerpoint.presentation.macroEnabled.main+xml";
|
||||||
|
public static final String THEME_MANAGER_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.themeManager+xml";
|
||||||
public static final String NOTES_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.presentationml.notesSlide+xml";
|
public static final String NOTES_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.presentationml.notesSlide+xml";
|
||||||
public static final String SLIDE_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.presentationml.slide+xml";
|
public static final String SLIDE_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.presentationml.slide+xml";
|
||||||
public static final String SLIDE_LAYOUT_RELATION_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout";
|
public static final String SLIDE_LAYOUT_RELATION_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout";
|
||||||
@ -77,6 +79,10 @@ public class XSLFSlideShow extends POIXMLDocument {
|
|||||||
public XSLFSlideShow(OPCPackage container) throws OpenXML4JException, IOException, XmlException {
|
public XSLFSlideShow(OPCPackage container) throws OpenXML4JException, IOException, XmlException {
|
||||||
super(container);
|
super(container);
|
||||||
|
|
||||||
|
if(getCorePart().getContentType().equals(THEME_MANAGER_CONTENT_TYPE)) {
|
||||||
|
rebase(getPackage());
|
||||||
|
}
|
||||||
|
|
||||||
presentationDoc =
|
presentationDoc =
|
||||||
PresentationDocument.Factory.parse(getCorePart().getInputStream());
|
PresentationDocument.Factory.parse(getCorePart().getInputStream());
|
||||||
|
|
||||||
@ -112,6 +118,11 @@ public class XSLFSlideShow extends POIXMLDocument {
|
|||||||
*/
|
*/
|
||||||
@Internal
|
@Internal
|
||||||
public CTSlideIdList getSlideReferences() {
|
public CTSlideIdList getSlideReferences() {
|
||||||
|
if(! getPresentation().isSetSldIdLst()) {
|
||||||
|
getPresentation().setSldIdLst(
|
||||||
|
CTSlideIdList.Factory.newInstance()
|
||||||
|
);
|
||||||
|
}
|
||||||
return getPresentation().getSldIdLst();
|
return getPresentation().getSldIdLst();
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
|
@ -126,4 +126,53 @@ public class TestXSLFPowerPointExtractor extends TestCase {
|
|||||||
// Check comments are there
|
// Check comments are there
|
||||||
assertTrue("Unable to find expected word in text\n" + text, text.contains("TEST"));
|
assertTrue("Unable to find expected word in text\n" + text, text.contains("TEST"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test that we can get the text from macro enabled,
|
||||||
|
* template, theme, slide enabled etc formats, as
|
||||||
|
* well as from the normal file
|
||||||
|
*/
|
||||||
|
public void testDifferentSubformats() throws Exception {
|
||||||
|
POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
|
||||||
|
String[] extensions = new String[] {
|
||||||
|
"pptx", "pptm", "ppsm", "ppsx",
|
||||||
|
"thmx",
|
||||||
|
//"xps" // Doesn't have a core document
|
||||||
|
};
|
||||||
|
for(String extension : extensions) {
|
||||||
|
String filename = "testPPT." + extension;
|
||||||
|
xmlA = new XSLFSlideShow(OPCPackage.open(slTests.openResourceAsStream(filename)));
|
||||||
|
XSLFPowerPointExtractor extractor =
|
||||||
|
new XSLFPowerPointExtractor(xmlA);
|
||||||
|
|
||||||
|
String text = extractor.getText();
|
||||||
|
if(extension.equals("thmx")) {
|
||||||
|
// Theme file doesn't have any textual content
|
||||||
|
assertEquals(0, text.length());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
assertTrue(text.length() > 0);
|
||||||
|
assertTrue(
|
||||||
|
"Text missing for " + filename + "\n" + text,
|
||||||
|
text.contains("Attachment Test")
|
||||||
|
);
|
||||||
|
assertTrue(
|
||||||
|
"Text missing for " + filename + "\n" + text,
|
||||||
|
text.contains("This is a test file data with the same content")
|
||||||
|
);
|
||||||
|
assertTrue(
|
||||||
|
"Text missing for " + filename + "\n" + text,
|
||||||
|
text.contains("content parsing")
|
||||||
|
);
|
||||||
|
assertTrue(
|
||||||
|
"Text missing for " + filename + "\n" + text,
|
||||||
|
text.contains("Different words to test against")
|
||||||
|
);
|
||||||
|
assertTrue(
|
||||||
|
"Text missing for " + filename + "\n" + text,
|
||||||
|
text.contains("Mystery")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
BIN
test-data/slideshow/testPPT.ppsm
Normal file
BIN
test-data/slideshow/testPPT.ppsm
Normal file
Binary file not shown.
BIN
test-data/slideshow/testPPT.ppsx
Normal file
BIN
test-data/slideshow/testPPT.ppsx
Normal file
Binary file not shown.
BIN
test-data/slideshow/testPPT.pptm
Normal file
BIN
test-data/slideshow/testPPT.pptm
Normal file
Binary file not shown.
BIN
test-data/slideshow/testPPT.pptx
Normal file
BIN
test-data/slideshow/testPPT.pptx
Normal file
Binary file not shown.
BIN
test-data/slideshow/testPPT.thmx
Normal file
BIN
test-data/slideshow/testPPT.thmx
Normal file
Binary file not shown.
BIN
test-data/slideshow/testPPT.xps
Normal file
BIN
test-data/slideshow/testPPT.xps
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user