mirror of https://github.com/apache/poi.git
removed common sl path
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1704207 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
c7e9309e83
commit
3d9c0077df
|
@ -1,298 +0,0 @@
|
||||||
/* ====================================================================
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
||||||
contributor license agreements. See the NOTICE file distributed with
|
|
||||||
this work for additional information regarding copyright ownership.
|
|
||||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
|
||||||
(the "License"); you may not use this file except in compliance with
|
|
||||||
the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
==================================================================== */
|
|
||||||
package org.apache.poi.sl;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.PushbackInputStream;
|
|
||||||
import java.security.GeneralSecurityException;
|
|
||||||
|
|
||||||
import org.apache.poi.EmptyFileException;
|
|
||||||
import org.apache.poi.EncryptedDocumentException;
|
|
||||||
import org.apache.poi.POIXMLDocument;
|
|
||||||
import org.apache.poi.hslf.usermodel.HSLFSlideShow;
|
|
||||||
import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
|
|
||||||
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
|
||||||
import org.apache.poi.openxml4j.opc.OPCPackage;
|
|
||||||
import org.apache.poi.openxml4j.opc.PackageAccess;
|
|
||||||
import org.apache.poi.poifs.crypt.Decryptor;
|
|
||||||
import org.apache.poi.poifs.crypt.EncryptionInfo;
|
|
||||||
import org.apache.poi.poifs.filesystem.DirectoryNode;
|
|
||||||
import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
|
|
||||||
import org.apache.poi.poifs.filesystem.OfficeXmlFileException;
|
|
||||||
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
|
||||||
import org.apache.poi.sl.usermodel.SlideShow;
|
|
||||||
import org.apache.poi.util.IOUtils;
|
|
||||||
import org.apache.poi.xslf.usermodel.XMLSlideShow;
|
|
||||||
|
|
||||||
public class SlideShowFactory {
|
|
||||||
/**
|
|
||||||
* Creates a HSLFSlideShow from the given POIFSFileSystem
|
|
||||||
* <p>Note that in order to properly release resources the
|
|
||||||
* SlideShow should be closed after use.
|
|
||||||
*/
|
|
||||||
public static SlideShow create(POIFSFileSystem fs) throws IOException {
|
|
||||||
return new HSLFSlideShow(fs);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a HSLFSlideShow from the given NPOIFSFileSystem
|
|
||||||
* <p>Note that in order to properly release resources the
|
|
||||||
* SlideShow should be closed after use.
|
|
||||||
*/
|
|
||||||
public static SlideShow create(NPOIFSFileSystem fs) throws IOException {
|
|
||||||
try {
|
|
||||||
return create(fs, null);
|
|
||||||
} catch (InvalidFormatException e) {
|
|
||||||
// Special case of OOXML-in-POIFS which is broken
|
|
||||||
throw new IOException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a SlideShow from the given NPOIFSFileSystem, which may
|
|
||||||
* be password protected
|
|
||||||
*
|
|
||||||
* @param fs The {@link NPOIFSFileSystem} to read the document from
|
|
||||||
* @param password The password that should be used or null if no password is necessary.
|
|
||||||
*
|
|
||||||
* @return The created SlideShow
|
|
||||||
*
|
|
||||||
* @throws IOException if an error occurs while reading the data
|
|
||||||
* @throws InvalidFormatException if the contents of the file cannot be parsed into a {@link SlideShow}
|
|
||||||
*/
|
|
||||||
private static SlideShow create(NPOIFSFileSystem fs, String password) throws IOException, InvalidFormatException {
|
|
||||||
DirectoryNode root = fs.getRoot();
|
|
||||||
|
|
||||||
// Encrypted OOXML files go inside OLE2 containers, is this one?
|
|
||||||
if (root.hasEntry(Decryptor.DEFAULT_POIFS_ENTRY)) {
|
|
||||||
EncryptionInfo info = new EncryptionInfo(fs);
|
|
||||||
Decryptor d = Decryptor.getInstance(info);
|
|
||||||
|
|
||||||
boolean passwordCorrect = false;
|
|
||||||
InputStream stream = null;
|
|
||||||
try {
|
|
||||||
if (password != null && d.verifyPassword(password)) {
|
|
||||||
passwordCorrect = true;
|
|
||||||
}
|
|
||||||
if (!passwordCorrect && d.verifyPassword(Decryptor.DEFAULT_PASSWORD)) {
|
|
||||||
passwordCorrect = true;
|
|
||||||
}
|
|
||||||
if (passwordCorrect) {
|
|
||||||
stream = d.getDataStream(root);
|
|
||||||
}
|
|
||||||
} catch (GeneralSecurityException e) {
|
|
||||||
throw new IOException(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (! passwordCorrect) {
|
|
||||||
if (password != null)
|
|
||||||
throw new EncryptedDocumentException("Password incorrect");
|
|
||||||
else
|
|
||||||
throw new EncryptedDocumentException("The supplied spreadsheet is protected, but no password was supplied");
|
|
||||||
}
|
|
||||||
|
|
||||||
OPCPackage pkg = OPCPackage.open(stream);
|
|
||||||
return create(pkg);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we get here, it isn't an encrypted PPTX file
|
|
||||||
// So, treat it as a regular HSLF PPT one
|
|
||||||
if (password != null) {
|
|
||||||
Biff8EncryptionKey.setCurrentUserPassword(password);
|
|
||||||
}
|
|
||||||
SlideShow wb = new HSLFSlideShow(root);
|
|
||||||
Biff8EncryptionKey.setCurrentUserPassword(null);
|
|
||||||
return wb;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a XMLSlideShow from the given OOXML Package
|
|
||||||
*
|
|
||||||
* <p>Note that in order to properly release resources the
|
|
||||||
* SlideShow should be closed after use.</p>
|
|
||||||
*
|
|
||||||
* @param pkg The {@link OPCPackage} opened for reading data.
|
|
||||||
*
|
|
||||||
* @return The created SlideShow
|
|
||||||
*
|
|
||||||
* @throws IOException if an error occurs while reading the data
|
|
||||||
*/
|
|
||||||
public static SlideShow create(OPCPackage pkg) throws IOException {
|
|
||||||
return new XMLSlideShow(pkg);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates the appropriate HSLFSlideShow / XMLSlideShow from
|
|
||||||
* the given InputStream.
|
|
||||||
*
|
|
||||||
* <p>Your input stream MUST either support mark/reset, or
|
|
||||||
* be wrapped as a {@link PushbackInputStream}! Note that
|
|
||||||
* using an {@link InputStream} has a higher memory footprint
|
|
||||||
* than using a {@link File}.</p>
|
|
||||||
*
|
|
||||||
* <p>Note that in order to properly release resources the
|
|
||||||
* SlideShow should be closed after use. Note also that loading
|
|
||||||
* from an InputStream requires more memory than loading
|
|
||||||
* from a File, so prefer {@link #create(File)} where possible.
|
|
||||||
*
|
|
||||||
* @param inp The {@link InputStream} to read data from.
|
|
||||||
*
|
|
||||||
* @return The created SlideShow
|
|
||||||
*
|
|
||||||
* @throws IOException if an error occurs while reading the data
|
|
||||||
* @throws InvalidFormatException if the contents of the file cannot be parsed into a {@link SlideShow}
|
|
||||||
* @throws EncryptedDocumentException If the SlideShow given is password protected
|
|
||||||
*/
|
|
||||||
public static SlideShow create(InputStream inp) throws IOException, InvalidFormatException, EncryptedDocumentException {
|
|
||||||
return create(inp, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates the appropriate HSLFSlideShow / XMLSlideShow from
|
|
||||||
* the given InputStream, which may be password protected.
|
|
||||||
* <p>Your input stream MUST either support mark/reset, or
|
|
||||||
* be wrapped as a {@link PushbackInputStream}! Note that
|
|
||||||
* using an {@link InputStream} has a higher memory footprint
|
|
||||||
* than using a {@link File}.</p>
|
|
||||||
*
|
|
||||||
* <p>Note that in order to properly release resources the
|
|
||||||
* SlideShow should be closed after use. Note also that loading
|
|
||||||
* from an InputStream requires more memory than loading
|
|
||||||
* from a File, so prefer {@link #create(File)} where possible.</p>
|
|
||||||
*
|
|
||||||
* @param inp The {@link InputStream} to read data from.
|
|
||||||
* @param password The password that should be used or null if no password is necessary.
|
|
||||||
*
|
|
||||||
* @return The created SlideShow
|
|
||||||
*
|
|
||||||
* @throws IOException if an error occurs while reading the data
|
|
||||||
* @throws InvalidFormatException if the contents of the file cannot be parsed into a {@link SlideShow}
|
|
||||||
* @throws EncryptedDocumentException If the wrong password is given for a protected file
|
|
||||||
* @throws EmptyFileException If an empty stream is given
|
|
||||||
*/
|
|
||||||
public static SlideShow create(InputStream inp, String password) throws IOException, InvalidFormatException, EncryptedDocumentException {
|
|
||||||
// If clearly doesn't do mark/reset, wrap up
|
|
||||||
if (! inp.markSupported()) {
|
|
||||||
inp = new PushbackInputStream(inp, 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure that there is at least some data there
|
|
||||||
byte[] header8 = IOUtils.peekFirst8Bytes(inp);
|
|
||||||
|
|
||||||
// Try to create
|
|
||||||
if (NPOIFSFileSystem.hasPOIFSHeader(header8)) {
|
|
||||||
NPOIFSFileSystem fs = new NPOIFSFileSystem(inp);
|
|
||||||
return create(fs, password);
|
|
||||||
}
|
|
||||||
if (POIXMLDocument.hasOOXMLHeader(inp)) {
|
|
||||||
return new XMLSlideShow(OPCPackage.open(inp));
|
|
||||||
}
|
|
||||||
throw new IllegalArgumentException("Your InputStream was neither an OLE2 stream, nor an OOXML stream");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates the appropriate HSLFSlideShow / XMLSlideShow from
|
|
||||||
* the given File, which must exist and be readable.
|
|
||||||
* <p>Note that in order to properly release resources the
|
|
||||||
* SlideShow should be closed after use.
|
|
||||||
*
|
|
||||||
* @param file The file to read data from.
|
|
||||||
*
|
|
||||||
* @return The created SlideShow
|
|
||||||
*
|
|
||||||
* @throws IOException if an error occurs while reading the data
|
|
||||||
* @throws InvalidFormatException if the contents of the file cannot be parsed into a {@link SlideShow}
|
|
||||||
* @throws EncryptedDocumentException If the SlideShow given is password protected
|
|
||||||
*/
|
|
||||||
public static SlideShow create(File file) throws IOException, InvalidFormatException, EncryptedDocumentException {
|
|
||||||
return create(file, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates the appropriate HSLFSlideShow / XMLSlideShow from
|
|
||||||
* the given File, which must exist and be readable, and
|
|
||||||
* may be password protected
|
|
||||||
* <p>Note that in order to properly release resources the
|
|
||||||
* SlideShow should be closed after use.
|
|
||||||
*
|
|
||||||
* @param file The file to read data from.
|
|
||||||
* @param password The password that should be used or null if no password is necessary.
|
|
||||||
*
|
|
||||||
* @return The created SlideShow
|
|
||||||
*
|
|
||||||
* @throws IOException if an error occurs while reading the data
|
|
||||||
* @throws InvalidFormatException if the contents of the file cannot be parsed into a {@link SlideShow}
|
|
||||||
* @throws EncryptedDocumentException If the wrong password is given for a protected file
|
|
||||||
* @throws EmptyFileException If an empty stream is given
|
|
||||||
*/
|
|
||||||
public static SlideShow create(File file, String password) throws IOException, InvalidFormatException, EncryptedDocumentException {
|
|
||||||
return create(file, password, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates the appropriate HSLFSlideShow / XMLSlideShow from
|
|
||||||
* the given File, which must exist and be readable, and
|
|
||||||
* may be password protected
|
|
||||||
* <p>Note that in order to properly release resources the
|
|
||||||
* SlideShow should be closed after use.
|
|
||||||
*
|
|
||||||
* @param file The file to read data from.
|
|
||||||
* @param password The password that should be used or null if no password is necessary.
|
|
||||||
* @param readOnly If the SlideShow should be opened in read-only mode to avoid writing back
|
|
||||||
* changes when the document is closed.
|
|
||||||
*
|
|
||||||
* @return The created SlideShow
|
|
||||||
*
|
|
||||||
* @throws IOException if an error occurs while reading the data
|
|
||||||
* @throws InvalidFormatException if the contents of the file cannot be parsed into a {@link SlideShow}
|
|
||||||
* @throws EncryptedDocumentException If the wrong password is given for a protected file
|
|
||||||
* @throws EmptyFileException If an empty stream is given
|
|
||||||
*/
|
|
||||||
public static SlideShow create(File file, String password, boolean readOnly) throws IOException, InvalidFormatException, EncryptedDocumentException {
|
|
||||||
if (! file.exists()) {
|
|
||||||
throw new FileNotFoundException(file.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
NPOIFSFileSystem fs = new NPOIFSFileSystem(file, readOnly);
|
|
||||||
return create(fs, password);
|
|
||||||
} catch(OfficeXmlFileException e) {
|
|
||||||
// opening as .ppt failed => try opening as .pptx
|
|
||||||
OPCPackage pkg = OPCPackage.open(file, readOnly ? PackageAccess.READ : PackageAccess.READ_WRITE);
|
|
||||||
try {
|
|
||||||
return new XMLSlideShow(pkg);
|
|
||||||
// } catch (IOException ioe) {
|
|
||||||
// // ensure that file handles are closed (use revert() to not re-write the file)
|
|
||||||
// pkg.revert();
|
|
||||||
// //pkg.close();
|
|
||||||
//
|
|
||||||
// // rethrow exception
|
|
||||||
// throw ioe;
|
|
||||||
} catch (IllegalArgumentException ioe) {
|
|
||||||
// ensure that file handles are closed (use revert() to not re-write the file)
|
|
||||||
pkg.revert();
|
|
||||||
//pkg.close();
|
|
||||||
|
|
||||||
// rethrow exception
|
|
||||||
throw ioe;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue