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 + *
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 + * + *
Note that in order to properly release resources the + * SlideShow should be closed after use.
+ * + * @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. + * + *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}.
+ * + *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. + *
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}.
+ * + *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. + * @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. + *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 + *
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 + *
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;
+ }
+ }
+ }
+}
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/CharacterPropertyFetcher.java b/src/ooxml/java/org/apache/poi/xslf/model/CharacterPropertyFetcher.java
index ced941ccb3..c20f94259b 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/CharacterPropertyFetcher.java
+++ b/src/ooxml/java/org/apache/poi/xslf/model/CharacterPropertyFetcher.java
@@ -27,8 +27,6 @@ import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties
* @author Yegor Kozlov
*/
public abstract class CharacterPropertyFetcher
* The title is a run of text of type null
value means to use the text font color.
*/
- public Color getBulletFontColor(){
+ public PaintStyle getBulletFontColor(){
final XSLFTheme theme = getParentShape().getSheet().getTheme();
ParagraphPropertyFetcherTextHeaderAtom.CENTER_TITLE_TYPE
or
* TextHeaderAtom.TITLE_TYPE
*