Search in sources :

Example 1 with PictureType

use of org.apache.poi.sl.usermodel.PictureData.PictureType in project poi by apache.

the class HSLFSlideShowImpl method readPictures.

/**
     * Find and read in pictures contained in this presentation.
     * This is lazily called as and when we want to touch pictures.
     */
private void readPictures() throws IOException {
    _pictures = new ArrayList<HSLFPictureData>();
    // if the presentation doesn't contain pictures - will use a null set instead
    if (!getDirectory().hasEntry("Pictures")) {
        return;
    }
    DocumentEntry entry = (DocumentEntry) getDirectory().getEntry("Pictures");
    DocumentInputStream is = getDirectory().createDocumentInputStream(entry);
    byte[] pictstream = IOUtils.toByteArray(is, entry.getSize());
    is.close();
    HSLFSlideShowEncrypted decryptData = new HSLFSlideShowEncrypted(getDocumentEncryptionAtom());
    try {
        int pos = 0;
        // An empty picture record (length 0) will take up 8 bytes
        while (pos <= (pictstream.length - 8)) {
            int offset = pos;
            decryptData.decryptPicture(pictstream, offset);
            // Image signature
            int signature = LittleEndian.getUShort(pictstream, pos);
            pos += LittleEndianConsts.SHORT_SIZE;
            // Image type + 0xF018
            int type = LittleEndian.getUShort(pictstream, pos);
            pos += LittleEndianConsts.SHORT_SIZE;
            // Image size (excluding the 8 byte header)
            int imgsize = LittleEndian.getInt(pictstream, pos);
            pos += LittleEndianConsts.INT_SIZE;
            //  should terminate if the type isn't 0xf007 or 0xf018->0xf117
            if (!((type == 0xf007) || (type >= 0xf018 && type <= 0xf117))) {
                break;
            }
            //  time, so we won't get stuck)
            if (imgsize < 0) {
                throw new CorruptPowerPointFileException("The file contains a picture, at position " + _pictures.size() + ", which has a negatively sized data length, so we can't trust any of the picture data");
            }
            // If they type (including the bonus 0xF018) is 0, skip it
            PictureType pt = PictureType.forNativeID(type - 0xF018);
            if (pt == null) {
                logger.log(POILogger.ERROR, "Problem reading picture: Invalid image type 0, on picture with length " + imgsize + ".\nYou document will probably become corrupted if you save it!");
                logger.log(POILogger.ERROR, "" + pos);
            } else {
                //that are not used in any slide -- BUG-60305
                if (pos + imgsize > pictstream.length) {
                    logger.log(POILogger.WARN, "\"Pictures\" stream may have ended early. In some circumstances, this is not a problem; " + "in others, this could indicate a corrupt file");
                    break;
                }
                // Build the PictureData object from the data
                try {
                    HSLFPictureData pict = HSLFPictureData.create(pt);
                    pict.setSignature(signature);
                    // Copy the data, ready to pass to PictureData
                    byte[] imgdata = new byte[imgsize];
                    System.arraycopy(pictstream, pos, imgdata, 0, imgdata.length);
                    pict.setRawData(imgdata);
                    pict.setOffset(offset);
                    pict.setIndex(_pictures.size());
                    _pictures.add(pict);
                } catch (IllegalArgumentException e) {
                    logger.log(POILogger.ERROR, "Problem reading picture: " + e + "\nYou document will probably become corrupted if you save it!");
                }
            }
            pos += imgsize;
        }
    } finally {
        decryptData.close();
    }
}
Also used : CorruptPowerPointFileException(org.apache.poi.hslf.exceptions.CorruptPowerPointFileException) PictureType(org.apache.poi.sl.usermodel.PictureData.PictureType) DocumentEntry(org.apache.poi.poifs.filesystem.DocumentEntry) DocumentInputStream(org.apache.poi.poifs.filesystem.DocumentInputStream)

Example 2 with PictureType

use of org.apache.poi.sl.usermodel.PictureData.PictureType in project poi by apache.

the class ImageExtractor method main.

public static void main(String[] args) throws IOException {
    if (args.length < 1) {
        System.err.println("Usage:");
        System.err.println("\tImageExtractor <file>");
        return;
    }
    HSLFSlideShow ppt = new HSLFSlideShow(new HSLFSlideShowImpl(args[0]));
    //extract all pictures contained in the presentation
    int i = 0;
    for (HSLFPictureData pict : ppt.getPictureData()) {
        // picture data
        byte[] data = pict.getData();
        PictureType type = pict.getType();
        FileOutputStream out = new FileOutputStream("pict_" + i++ + type.extension);
        out.write(data);
        out.close();
    }
    ppt.close();
}
Also used : PictureType(org.apache.poi.sl.usermodel.PictureData.PictureType) FileOutputStream(java.io.FileOutputStream) HSLFPictureData(org.apache.poi.hslf.usermodel.HSLFPictureData) HSLFSlideShow(org.apache.poi.hslf.usermodel.HSLFSlideShow) HSLFSlideShowImpl(org.apache.poi.hslf.usermodel.HSLFSlideShowImpl)

Aggregations

PictureType (org.apache.poi.sl.usermodel.PictureData.PictureType)2 FileOutputStream (java.io.FileOutputStream)1 CorruptPowerPointFileException (org.apache.poi.hslf.exceptions.CorruptPowerPointFileException)1 HSLFPictureData (org.apache.poi.hslf.usermodel.HSLFPictureData)1 HSLFSlideShow (org.apache.poi.hslf.usermodel.HSLFSlideShow)1 HSLFSlideShowImpl (org.apache.poi.hslf.usermodel.HSLFSlideShowImpl)1 DocumentEntry (org.apache.poi.poifs.filesystem.DocumentEntry)1 DocumentInputStream (org.apache.poi.poifs.filesystem.DocumentInputStream)1