Bug 58190: Add more overloaded methods for adding pictures from streams and files

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1745073 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Dominik Stadler 2016-05-22 16:08:51 +00:00
parent 3d60c67151
commit e48e4e771d
4 changed files with 102 additions and 27 deletions

View File

@ -38,11 +38,11 @@ public class Tutorial5 {
XMLSlideShow ppt = new XMLSlideShow();
XSLFSlide slide = ppt.createSlide();
File img = new File(System.getProperty("POI.testdata.path"), "slideshow/clock.jpg");
byte[] data = IOUtils.toByteArray(new FileInputStream(img));
XSLFPictureData pictureIndex = ppt.addPicture(data, PictureType.PNG);
/*XSLFPictureShape shape =*/ slide.createPicture(pictureIndex);
File img = new File(System.getProperty("POI.testdata.path", "test-data"), "slideshow/clock.jpg");
XSLFPictureData pictureData = ppt.addPicture(img, PictureType.PNG);
/*XSLFPictureShape shape =*/ slide.createPicture(pictureData);
FileOutputStream out = new FileOutputStream("images.pptx");
ppt.write(out);

View File

@ -18,9 +18,7 @@
package org.apache.poi.sl.usermodel;
import java.awt.Dimension;
import java.io.Closeable;
import java.io.IOException;
import java.io.OutputStream;
import java.io.*;
import java.util.List;
import org.apache.poi.sl.usermodel.PictureData.PictureType;
@ -64,17 +62,36 @@ public interface SlideShow<
*/
List<? extends PictureData> getPictureData();
/**
* Adds a picture to the workbook.
* Adds a picture to the presentation.
*
* @param pictureData The bytes of the picture
* @param format The format of the picture.
*
* @return the new picture reference
* @return the picture data reference.
*/
PictureData addPicture(byte[] pictureData, PictureType format) throws IOException;
/**
* Adds a picture to the presentation.
*
* @param is The stream to read the image from
* @param format The format of the picture.
*
* @return the picture data reference.
*/
PictureData addPicture(InputStream is, PictureType format) throws IOException;
/**
* Adds a picture to the presentation.
*
* @param pict The file containing the image to add
* @param format The format of the picture.
*
* @return the picture data reference
*/
PictureData addPicture(File pict, PictureType format) throws IOException;
/**
* Writes out the slideshow file the is represented by an instance of this
* class

View File

@ -19,6 +19,8 @@ package org.apache.poi.xslf.usermodel;
import static org.apache.poi.POIXMLTypeLoader.DEFAULT_XML_OPTIONS;
import java.awt.Dimension;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@ -202,7 +204,7 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
/**
* Create a slide and initialize it from the specified layout.
*
* @param layout
* @param layout The layout to use for the new slide.
* @return created slide
*/
public XSLFSlide createSlide(XSLFSlideLayout layout) {
@ -461,6 +463,45 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
return img;
}
/**
* Adds a picture to the slideshow.
*
* @param is The stream to read image from
* @param format The format of the picture
*
* @return the picture data
*/
@Override
public XSLFPictureData addPicture(InputStream is, PictureType format) throws IOException
{
return addPicture(IOUtils.toByteArray(is), format);
}
/**
* Adds a picture to the presentation.
*
* @param pict The file containing the image to add
* @param format The format of the picture.
*
* @return the picture data
*/
@Override
public XSLFPictureData addPicture(File pict, PictureType format) throws IOException
{
int length = (int) pict.length();
byte[] data = new byte[length];
FileInputStream is = new FileInputStream(pict);
try {
IOUtils.readFully(is, data);
} finally {
is.close();
}
return addPicture(data, format);
}
/**
* check if a picture with this picture data already exists in this presentation
*/

View File

@ -78,6 +78,7 @@ import org.apache.poi.sl.usermodel.MasterSheet;
import org.apache.poi.sl.usermodel.PictureData.PictureType;
import org.apache.poi.sl.usermodel.Resources;
import org.apache.poi.sl.usermodel.SlideShow;
import org.apache.poi.util.IOUtils;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;
import org.apache.poi.util.Units;
@ -268,10 +269,10 @@ public final class HSLFSlideShow implements SlideShow<HSLFShape,HSLFTextParagrap
_documentRecord = (Document) record;
_fonts = _documentRecord.getEnvironment().getFontCollection();
}
} else {
} /*else {
// No record at this number
// Odd, but not normally a problem
}
}*/
}
}
@ -295,8 +296,7 @@ public final class HSLFSlideShow implements SlideShow<HSLFShape,HSLFTextParagrap
private Record getCoreRecordForRefID(int refID) {
Integer coreRecordId = _sheetIdToCoreRecordsLookup.get(refID);
if (coreRecordId != null) {
Record r = _mostRecentCoreRecords[coreRecordId];
return r;
return _mostRecentCoreRecords[coreRecordId];
}
logger.log(POILogger.ERROR,
"We tried to look up a reference to a core record, but there was no core ID for reference ID "
@ -705,12 +705,10 @@ public final class HSLFSlideShow implements SlideShow<HSLFShape,HSLFTextParagrap
*/
@Override
public HSLFSlide createSlide() {
SlideListWithText slist = null;
// We need to add the records to the SLWT that deals
// with Slides.
// Add it, if it doesn't exist
slist = _documentRecord.getSlideSlideListWithText();
SlideListWithText slist = _documentRecord.getSlideSlideListWithText();
if (slist == null) {
// Need to add a new one
slist = new SlideListWithText();
@ -828,24 +826,43 @@ public final class HSLFSlideShow implements SlideShow<HSLFShape,HSLFTextParagrap
}
/**
* Adds a picture to this presentation and returns the associated index.
* Adds a picture to the presentation.
*
* @param is The stream to read the image from
* @param format The format of the picture.
*
* @return the picture data.
*/
@Override
public HSLFPictureData addPicture(InputStream is, PictureType format) throws IOException {
if (format == null || format.nativeId == -1) { // fail early
throw new IllegalArgumentException("Unsupported picture format: " + format);
}
return addPicture(IOUtils.toByteArray(is), format);
}
/**
* Adds a picture to the presentation.
*
* @param pict
* the file containing the image to add
* @param format
* the format of the picture. One of constans defined in the
* <code>Picture</code> class.
* @return the index to this picture (1 based).
* The format of the picture.
*
* @return the picture data.
*/
@Override
public HSLFPictureData addPicture(File pict, PictureType format) throws IOException {
if (format == null || format.nativeId == -1) { // fail early
throw new IllegalArgumentException("Unsupported picture format: " + format);
}
int length = (int) pict.length();
byte[] data = new byte[length];
FileInputStream is = null;
try {
is = new FileInputStream(pict);
is.read(data);
FileInputStream is = new FileInputStream(pict);
try {
IOUtils.readFully(is, data);
} finally {
if(is != null) is.close();
is.close();
}
return addPicture(data, format);
}