Search in sources :

Example 1 with DirectoryEntry

use of org.apache.poi.poifs.filesystem.DirectoryEntry in project poi by apache.

the class HSSFObjectData method getDirectory.

@Override
public DirectoryEntry getDirectory() throws IOException {
    EmbeddedObjectRefSubRecord subRecord = findObjectRecord();
    int streamId = subRecord.getStreamId().intValue();
    String streamName = "MBD" + HexDump.toHex(streamId);
    Entry entry = _root.getEntry(streamName);
    if (entry instanceof DirectoryEntry) {
        return (DirectoryEntry) entry;
    }
    throw new IOException("Stream " + streamName + " was not an OLE2 directory");
}
Also used : Entry(org.apache.poi.poifs.filesystem.Entry) DirectoryEntry(org.apache.poi.poifs.filesystem.DirectoryEntry) IOException(java.io.IOException) DirectoryEntry(org.apache.poi.poifs.filesystem.DirectoryEntry)

Example 2 with DirectoryEntry

use of org.apache.poi.poifs.filesystem.DirectoryEntry in project poi by apache.

the class POIFSDump method dump.

public static void dump(DirectoryEntry root, File parent) throws IOException {
    for (Iterator<Entry> it = root.getEntries(); it.hasNext(); ) {
        Entry entry = it.next();
        if (entry instanceof DocumentNode) {
            DocumentNode node = (DocumentNode) entry;
            DocumentInputStream is = new DocumentInputStream(node);
            byte[] bytes = IOUtils.toByteArray(is);
            is.close();
            OutputStream out = new FileOutputStream(new File(parent, node.getName().trim()));
            try {
                out.write(bytes);
            } finally {
                out.close();
            }
        } else if (entry instanceof DirectoryEntry) {
            DirectoryEntry dir = (DirectoryEntry) entry;
            File file = new File(parent, entry.getName());
            if (!file.exists() && !file.mkdirs()) {
                throw new IOException("Could not create directory " + file);
            }
            dump(dir, file);
        } else {
            System.err.println("Skipping unsupported POIFS entry: " + entry);
        }
    }
}
Also used : Entry(org.apache.poi.poifs.filesystem.Entry) DirectoryEntry(org.apache.poi.poifs.filesystem.DirectoryEntry) DocumentNode(org.apache.poi.poifs.filesystem.DocumentNode) OutputStream(java.io.OutputStream) FileOutputStream(java.io.FileOutputStream) FileOutputStream(java.io.FileOutputStream) IOException(java.io.IOException) DocumentInputStream(org.apache.poi.poifs.filesystem.DocumentInputStream) DirectoryEntry(org.apache.poi.poifs.filesystem.DirectoryEntry) File(java.io.File)

Example 3 with DirectoryEntry

use of org.apache.poi.poifs.filesystem.DirectoryEntry in project poi by apache.

the class POIFSDump method main.

public static void main(String[] args) throws IOException {
    if (args.length == 0) {
        System.err.println("Must specify at least one file to dump");
        System.exit(1);
    }
    boolean dumpProps = false, dumpMini = false;
    for (String filename : args) {
        if (filename.equalsIgnoreCase("-dumprops") || filename.equalsIgnoreCase("-dump-props") || filename.equalsIgnoreCase("-dump-properties")) {
            dumpProps = true;
            continue;
        }
        if (filename.equalsIgnoreCase("-dumpmini") || filename.equalsIgnoreCase("-dump-mini") || filename.equalsIgnoreCase("-dump-ministream") || filename.equalsIgnoreCase("-dump-mini-stream")) {
            dumpMini = true;
            continue;
        }
        System.out.println("Dumping " + filename);
        FileInputStream is = new FileInputStream(filename);
        NPOIFSFileSystem fs;
        try {
            fs = new NPOIFSFileSystem(is);
        } finally {
            is.close();
        }
        try {
            DirectoryEntry root = fs.getRoot();
            String filenameWithoutPath = new File(filename).getName();
            File dumpDir = new File(filenameWithoutPath + "_dump");
            File file = new File(dumpDir, root.getName());
            if (!file.exists() && !file.mkdirs()) {
                throw new IOException("Could not create directory " + file);
            }
            dump(root, file);
            if (dumpProps) {
                HeaderBlock header = fs.getHeaderBlock();
                dump(fs, header.getPropertyStart(), "properties", file);
            }
            if (dumpMini) {
                NPropertyTable props = fs.getPropertyTable();
                int startBlock = props.getRoot().getStartBlock();
                if (startBlock == POIFSConstants.END_OF_CHAIN) {
                    System.err.println("No Mini Stream in file");
                } else {
                    dump(fs, startBlock, "mini-stream", file);
                }
            }
        } finally {
            fs.close();
        }
    }
}
Also used : NPOIFSFileSystem(org.apache.poi.poifs.filesystem.NPOIFSFileSystem) HeaderBlock(org.apache.poi.poifs.storage.HeaderBlock) NPropertyTable(org.apache.poi.poifs.property.NPropertyTable) IOException(java.io.IOException) DirectoryEntry(org.apache.poi.poifs.filesystem.DirectoryEntry) File(java.io.File) FileInputStream(java.io.FileInputStream)

Example 4 with DirectoryEntry

use of org.apache.poi.poifs.filesystem.DirectoryEntry in project poi by apache.

the class CopyCompare method equal.

/**
     * <p>Compares two {@link DirectoryEntry} instances of a POI file system.
     * The directories must contain the same streams with the same names and
     * contents.</p>
     *
     * @param d1 The first directory.
     * @param d2 The second directory.
     * @param msg The method may append human-readable comparison messages to
     * this string buffer. 
     * @return <code>true</code> if the directories are equal, else
     * <code>false</code>.
     * @exception MarkUnsupportedException if a POI document stream does not
     * support the mark() operation.
     * @exception NoPropertySetStreamException if the application tries to
     * create a property set from a POI document stream that is not a property
     * set stream.
     * @throws UnsupportedEncodingException 
     * @exception IOException if any I/O exception occurs.
     */
private static boolean equal(final DirectoryEntry d1, final DirectoryEntry d2, final StringBuffer msg) throws NoPropertySetStreamException, MarkUnsupportedException, UnsupportedEncodingException, IOException {
    boolean equal = true;
    /* Iterate over d1 and compare each entry with its counterpart in d2. */
    for (final Entry e1 : d1) {
        final String n1 = e1.getName();
        if (!d2.hasEntry(n1)) {
            msg.append("Document \"" + n1 + "\" exists only in the source.\n");
            equal = false;
            break;
        }
        Entry e2 = d2.getEntry(n1);
        if (e1.isDirectoryEntry() && e2.isDirectoryEntry()) {
            equal = equal((DirectoryEntry) e1, (DirectoryEntry) e2, msg);
        } else if (e1.isDocumentEntry() && e2.isDocumentEntry()) {
            equal = equal((DocumentEntry) e1, (DocumentEntry) e2, msg);
        } else {
            msg.append("One of \"" + e1 + "\" and \"" + e2 + "\" is a " + "document while the other one is a directory.\n");
            equal = false;
        }
    }
    /* Iterate over d2 just to make sure that there are no entries in d2
         * that are not in d1. */
    for (final Entry e2 : d2) {
        final String n2 = e2.getName();
        Entry e1 = null;
        try {
            e1 = d1.getEntry(n2);
        } catch (FileNotFoundException ex) {
            msg.append("Document \"" + e2 + "\" exitsts, document \"" + e1 + "\" does not.\n");
            equal = false;
            break;
        }
    }
    return equal;
}
Also used : Entry(org.apache.poi.poifs.filesystem.Entry) DocumentEntry(org.apache.poi.poifs.filesystem.DocumentEntry) DirectoryEntry(org.apache.poi.poifs.filesystem.DirectoryEntry) FileNotFoundException(java.io.FileNotFoundException) DirectoryEntry(org.apache.poi.poifs.filesystem.DirectoryEntry)

Example 5 with DirectoryEntry

use of org.apache.poi.poifs.filesystem.DirectoryEntry in project poi by apache.

the class ModifyDocumentSummaryInformation method main.

/**
     * <p>Main method - see class description.</p>
     *
     * @param args The command-line parameters.
     * @throws IOException
     * @throws MarkUnsupportedException
     * @throws NoPropertySetStreamException
     * @throws UnexpectedPropertySetTypeException
     * @throws WritingNotSupportedException
     */
public static void main(final String[] args) throws IOException, NoPropertySetStreamException, MarkUnsupportedException, UnexpectedPropertySetTypeException, WritingNotSupportedException {
    /* Read the name of the POI filesystem to modify from the command line.
         * For brevity to boundary check is performed on the command-line
         * arguments. */
    File summaryFile = new File(args[0]);
    /* Open the POI filesystem. */
    NPOIFSFileSystem poifs = new NPOIFSFileSystem(summaryFile, false);
    /* Read the summary information. */
    DirectoryEntry dir = poifs.getRoot();
    SummaryInformation si;
    try {
        si = (SummaryInformation) PropertySetFactory.create(dir, SummaryInformation.DEFAULT_STREAM_NAME);
    } catch (FileNotFoundException ex) {
        // There is no summary information yet. We have to create a new one
        si = PropertySetFactory.newSummaryInformation();
    }
    /* Change the author to "Rainer Klute". Any former author value will
         * be lost. If there has been no author yet, it will be created. */
    si.setAuthor("Rainer Klute");
    System.out.println("Author changed to " + si.getAuthor() + ".");
    /* Handling the document summary information is analogous to handling
         * the summary information. An additional feature, however, are the
         * custom properties. */
    /* Read the document summary information. */
    DocumentSummaryInformation dsi;
    try {
        dsi = (DocumentSummaryInformation) PropertySetFactory.create(dir, DocumentSummaryInformation.DEFAULT_STREAM_NAME);
    } catch (FileNotFoundException ex) {
        /* There is no document summary information yet. We have to create a
             * new one. */
        dsi = PropertySetFactory.newDocumentSummaryInformation();
    }
    /* Change the category to "POI example". Any former category value will
         * be lost. If there has been no category yet, it will be created. */
    dsi.setCategory("POI example");
    System.out.println("Category changed to " + dsi.getCategory() + ".");
    /* Read the custom properties. If there are no custom properties yet,
         * the application has to create a new CustomProperties object. It will
         * serve as a container for custom properties. */
    CustomProperties customProperties = dsi.getCustomProperties();
    if (customProperties == null)
        customProperties = new CustomProperties();
    /* Insert some custom properties into the container. */
    customProperties.put("Key 1", "Value 1");
    customProperties.put("Schlüssel 2", "Wert 2");
    customProperties.put("Sample Number", new Integer(12345));
    customProperties.put("Sample Boolean", Boolean.TRUE);
    customProperties.put("Sample Date", new Date());
    /* Read a custom property. */
    Object value = customProperties.get("Sample Number");
    System.out.println("Custom Sample Number is now " + value);
    /* Write the custom properties back to the document summary
         * information. */
    dsi.setCustomProperties(customProperties);
    /* Write the summary information and the document summary information
         * to the POI filesystem. */
    si.write(dir, SummaryInformation.DEFAULT_STREAM_NAME);
    dsi.write(dir, DocumentSummaryInformation.DEFAULT_STREAM_NAME);
    /* Write the POI filesystem back to the original file. Please note that
         * in production code you should take care when write directly to the 
         * origin, to make sure you don't loose things on error */
    poifs.writeFilesystem();
    poifs.close();
}
Also used : NPOIFSFileSystem(org.apache.poi.poifs.filesystem.NPOIFSFileSystem) SummaryInformation(org.apache.poi.hpsf.SummaryInformation) DocumentSummaryInformation(org.apache.poi.hpsf.DocumentSummaryInformation) FileNotFoundException(java.io.FileNotFoundException) DocumentSummaryInformation(org.apache.poi.hpsf.DocumentSummaryInformation) DirectoryEntry(org.apache.poi.poifs.filesystem.DirectoryEntry) File(java.io.File) Date(java.util.Date) CustomProperties(org.apache.poi.hpsf.CustomProperties)

Aggregations

DirectoryEntry (org.apache.poi.poifs.filesystem.DirectoryEntry)23 Entry (org.apache.poi.poifs.filesystem.Entry)12 IOException (java.io.IOException)9 FileNotFoundException (java.io.FileNotFoundException)7 ByteArrayInputStream (java.io.ByteArrayInputStream)5 File (java.io.File)5 NPOIFSFileSystem (org.apache.poi.poifs.filesystem.NPOIFSFileSystem)5 InputStream (java.io.InputStream)4 DocumentSummaryInformation (org.apache.poi.hpsf.DocumentSummaryInformation)4 DirectoryNode (org.apache.poi.poifs.filesystem.DirectoryNode)4 ByteArrayOutputStream (java.io.ByteArrayOutputStream)3 FileInputStream (java.io.FileInputStream)3 POIFSFileSystem (org.apache.poi.poifs.filesystem.POIFSFileSystem)3 Test (org.junit.Test)3 FileOutputStream (java.io.FileOutputStream)2 OutputStream (java.io.OutputStream)2 ArrayList (java.util.ArrayList)2 POITextExtractor (org.apache.poi.POITextExtractor)2 SummaryInformation (org.apache.poi.hpsf.SummaryInformation)2 MAPIMessage (org.apache.poi.hsmf.MAPIMessage)2