| /* ==================================================================== |
| 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.examples.hpsf; |
| |
| import java.io.File; |
| import java.io.FileNotFoundException; |
| import java.util.Date; |
| |
| import org.apache.poi.hpsf.CustomProperties; |
| import org.apache.poi.hpsf.DocumentSummaryInformation; |
| import org.apache.poi.hpsf.PropertySetFactory; |
| import org.apache.poi.hpsf.SummaryInformation; |
| import org.apache.poi.poifs.filesystem.DirectoryEntry; |
| import org.apache.poi.poifs.filesystem.POIFSFileSystem; |
| |
| /** |
| * <p>This is a sample application showing how to easily modify properties in |
| * the summary information and in the document summary information. The |
| * application reads the name of a POI filesystem from the command line and |
| * performs the following actions:</p> |
| * |
| * <ul> |
| * |
| * <li><p>Open the POI filesystem.</p></li> |
| * |
| * <li><p>Read the summary information.</p></li> |
| * |
| * <li><p>Read and print the "author" property.</p></li> |
| * |
| * <li><p>Change the author to "Rainer Klute".</p></li> |
| * |
| * <li><p>Read the document summary information.</p></li> |
| * |
| * <li><p>Read and print the "category" property.</p></li> |
| * |
| * <li><p>Change the category to "POI example".</p></li> |
| * |
| * <li><p>Read the custom properties (if available).</p></li> |
| * |
| * <li><p>Insert a new custom property.</p></li> |
| * |
| * <li><p>Write the custom properties back to the document summary |
| * information.</p></li> |
| * |
| * <li><p>Write the summary information to the POI filesystem.</p></li> |
| * |
| * <li><p>Write the document summary information to the POI filesystem.</p></li> |
| * |
| * <li><p>Write the POI filesystem back to the original file.</p></li> |
| * |
| * </ol> |
| */ |
| @SuppressWarnings({"java:S106","java:S4823"}) |
| public final class ModifyDocumentSummaryInformation { |
| |
| private ModifyDocumentSummaryInformation() {} |
| |
| /** |
| * <p>Main method - see class description.</p> |
| * |
| * @param args The command-line parameters. |
| */ |
| public static void main(final String[] args) throws Exception { |
| /* 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. */ |
| try (POIFSFileSystem poifs = new POIFSFileSystem(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(); |
| } |
| assert(si != null); |
| |
| /* 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(); |
| } |
| assert(dsi != null); |
| |
| /* 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\u00fcssel 2", "Wert 2"); |
| customProperties.put("Sample Number", 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(); |
| } |
| } |
| } |