mirror of https://github.com/apache/poi.git
Fix exception for old powerpoint documents without the usual stream name
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1847442 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
e96aae8be4
commit
aad955d3bf
|
@ -289,6 +289,7 @@ public class TestAllFiles {
|
||||||
"document/Bug50955.doc",
|
"document/Bug50955.doc",
|
||||||
"document/57843.doc",
|
"document/57843.doc",
|
||||||
"slideshow/PPT95.ppt",
|
"slideshow/PPT95.ppt",
|
||||||
|
"slideshow/pp40only.ppt",
|
||||||
"slideshow/Divino_Revelado.pptx",
|
"slideshow/Divino_Revelado.pptx",
|
||||||
"openxml4j/OPCCompliance_CoreProperties_DCTermsNamespaceLimitedUseFAIL.docx",
|
"openxml4j/OPCCompliance_CoreProperties_DCTermsNamespaceLimitedUseFAIL.docx",
|
||||||
"openxml4j/OPCCompliance_CoreProperties_DoNotUseCompatibilityMarkupFAIL.docx",
|
"openxml4j/OPCCompliance_CoreProperties_DoNotUseCompatibilityMarkupFAIL.docx",
|
||||||
|
|
|
@ -47,7 +47,7 @@ public class TestPPTX2PNG {
|
||||||
private static final POIDataSamples samples = POIDataSamples.getSlideShowInstance();
|
private static final POIDataSamples samples = POIDataSamples.getSlideShowInstance();
|
||||||
private static final File basedir = null;
|
private static final File basedir = null;
|
||||||
private static final String files =
|
private static final String files =
|
||||||
"53446.ppt, alterman_security.ppt, alterman_security.pptx, KEY02.pptx, themes.pptx, backgrounds.pptx, layouts.pptx, sample.pptx, shapes.pptx, 54880_chinese.ppt, keyframes.ppt";
|
"53446.ppt, alterman_security.ppt, alterman_security.pptx, KEY02.pptx, themes.pptx, backgrounds.pptx, layouts.pptx, sample.pptx, shapes.pptx, 54880_chinese.ppt, keyframes.pptx";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,8 @@
|
||||||
|
|
||||||
package org.apache.poi.hslf.record;
|
package org.apache.poi.hslf.record;
|
||||||
|
|
||||||
|
import static org.apache.poi.hslf.usermodel.HSLFSlideShow.PP95_DOCUMENT;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -143,7 +145,7 @@ public class CurrentUserAtom
|
||||||
// See how long it is. If it's under 28 bytes long, we can't
|
// See how long it is. If it's under 28 bytes long, we can't
|
||||||
// read it
|
// read it
|
||||||
if(_contents.length < 28) {
|
if(_contents.length < 28) {
|
||||||
boolean isPP95 = dir.hasEntry("PP40");
|
boolean isPP95 = dir.hasEntry(PP95_DOCUMENT);
|
||||||
// PPT95 has 4 byte size, then data
|
// PPT95 has 4 byte size, then data
|
||||||
if (!isPP95 && _contents.length >= 4) {
|
if (!isPP95 && _contents.length >= 4) {
|
||||||
int size = LittleEndian.getInt(_contents);
|
int size = LittleEndian.getInt(_contents);
|
||||||
|
|
|
@ -71,6 +71,7 @@ public final class HSLFSlideShow implements SlideShow<HSLFShape,HSLFTextParagrap
|
||||||
|
|
||||||
/** Powerpoint document entry/stream name */
|
/** Powerpoint document entry/stream name */
|
||||||
public static final String POWERPOINT_DOCUMENT = "PowerPoint Document";
|
public static final String POWERPOINT_DOCUMENT = "PowerPoint Document";
|
||||||
|
public static final String PP95_DOCUMENT = "PP40";
|
||||||
|
|
||||||
enum LoadSavePhase {
|
enum LoadSavePhase {
|
||||||
INIT, LOADED
|
INIT, LOADED
|
||||||
|
|
|
@ -17,6 +17,9 @@
|
||||||
|
|
||||||
package org.apache.poi.hslf.usermodel;
|
package org.apache.poi.hslf.usermodel;
|
||||||
|
|
||||||
|
import static org.apache.poi.hslf.usermodel.HSLFSlideShow.POWERPOINT_DOCUMENT;
|
||||||
|
import static org.apache.poi.hslf.usermodel.HSLFSlideShow.PP95_DOCUMENT;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.Closeable;
|
import java.io.Closeable;
|
||||||
|
@ -35,6 +38,7 @@ import java.util.TreeMap;
|
||||||
import org.apache.poi.POIDocument;
|
import org.apache.poi.POIDocument;
|
||||||
import org.apache.poi.hslf.exceptions.CorruptPowerPointFileException;
|
import org.apache.poi.hslf.exceptions.CorruptPowerPointFileException;
|
||||||
import org.apache.poi.hslf.exceptions.HSLFException;
|
import org.apache.poi.hslf.exceptions.HSLFException;
|
||||||
|
import org.apache.poi.hslf.exceptions.OldPowerPointFormatException;
|
||||||
import org.apache.poi.hslf.record.CurrentUserAtom;
|
import org.apache.poi.hslf.record.CurrentUserAtom;
|
||||||
import org.apache.poi.hslf.record.DocumentEncryptionAtom;
|
import org.apache.poi.hslf.record.DocumentEncryptionAtom;
|
||||||
import org.apache.poi.hslf.record.ExOleObjStg;
|
import org.apache.poi.hslf.record.ExOleObjStg;
|
||||||
|
@ -183,13 +187,18 @@ public final class HSLFSlideShowImpl extends POIDocument implements Closeable {
|
||||||
* @throws IOException when the powerpoint can't be read
|
* @throws IOException when the powerpoint can't be read
|
||||||
*/
|
*/
|
||||||
private void readPowerPointStream() throws IOException {
|
private void readPowerPointStream() throws IOException {
|
||||||
|
final DirectoryNode dir = getDirectory();
|
||||||
|
|
||||||
|
if (!dir.hasEntry(POWERPOINT_DOCUMENT) && dir.hasEntry(PP95_DOCUMENT)) {
|
||||||
|
throw new OldPowerPointFormatException("You seem to have supplied a PowerPoint95 file, which isn't supported");
|
||||||
|
}
|
||||||
|
|
||||||
// Get the main document stream
|
// Get the main document stream
|
||||||
DocumentEntry docProps =
|
DocumentEntry docProps = (DocumentEntry)dir.getEntry(POWERPOINT_DOCUMENT);
|
||||||
(DocumentEntry) getDirectory().getEntry(HSLFSlideShow.POWERPOINT_DOCUMENT);
|
|
||||||
|
|
||||||
// Grab the document stream
|
// Grab the document stream
|
||||||
int len = docProps.getSize();
|
int len = docProps.getSize();
|
||||||
try (InputStream is = getDirectory().createDocumentInputStream(HSLFSlideShow.POWERPOINT_DOCUMENT)) {
|
try (InputStream is = dir.createDocumentInputStream(docProps)) {
|
||||||
_docstream = IOUtils.toByteArray(is, len);
|
_docstream = IOUtils.toByteArray(is, len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -665,8 +674,8 @@ public final class HSLFSlideShowImpl extends POIDocument implements Closeable {
|
||||||
|
|
||||||
// Write the PPT stream into the POIFS layer
|
// Write the PPT stream into the POIFS layer
|
||||||
ByteArrayInputStream bais = new ByteArrayInputStream(_docstream);
|
ByteArrayInputStream bais = new ByteArrayInputStream(_docstream);
|
||||||
outFS.createOrUpdateDocument(bais, HSLFSlideShow.POWERPOINT_DOCUMENT);
|
outFS.createOrUpdateDocument(bais, POWERPOINT_DOCUMENT);
|
||||||
writtenEntries.add(HSLFSlideShow.POWERPOINT_DOCUMENT);
|
writtenEntries.add(POWERPOINT_DOCUMENT);
|
||||||
|
|
||||||
currentUser.setEncrypted(encryptedSS.getDocumentEncryptionAtom() != null);
|
currentUser.setEncrypted(encryptedSS.getDocumentEncryptionAtom() != null);
|
||||||
currentUser.writeToFS(outFS);
|
currentUser.writeToFS(outFS);
|
||||||
|
|
Loading…
Reference in New Issue