450 lines
14 KiB
Java
450 lines
14 KiB
Java
/* ====================================================================
|
|
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.hpsf.wellknown;
|
|
|
|
import java.util.Collections;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
|
|
/**
|
|
* <p>This is a dictionary which maps property ID values to property
|
|
* ID strings.</p>
|
|
*
|
|
* <p>The methods {@link #getSummaryInformationProperties} and {@link
|
|
* #getDocumentSummaryInformationProperties} return singleton {@link
|
|
* PropertyIDMap}s. An application that wants to extend these maps
|
|
* should treat them as unmodifiable, copy them and modifiy the
|
|
* copies.</p>
|
|
*/
|
|
public class PropertyIDMap extends HashMap<Long,String> {
|
|
|
|
/*
|
|
* The following definitions are for property IDs in the first
|
|
* (and only) section of the Summary Information property set.
|
|
*/
|
|
|
|
/** <p>ID of the property that denotes the document's title</p> */
|
|
public static final int PID_TITLE = 2;
|
|
|
|
/** <p>ID of the property that denotes the document's subject</p> */
|
|
public static final int PID_SUBJECT = 3;
|
|
|
|
/** <p>ID of the property that denotes the document's author</p> */
|
|
public static final int PID_AUTHOR = 4;
|
|
|
|
/** <p>ID of the property that denotes the document's keywords</p> */
|
|
public static final int PID_KEYWORDS = 5;
|
|
|
|
/** <p>ID of the property that denotes the document's comments</p> */
|
|
public static final int PID_COMMENTS = 6;
|
|
|
|
/** <p>ID of the property that denotes the document's template</p> */
|
|
public static final int PID_TEMPLATE = 7;
|
|
|
|
/** <p>ID of the property that denotes the document's last author</p> */
|
|
public static final int PID_LASTAUTHOR = 8;
|
|
|
|
/** <p>ID of the property that denotes the document's revision number</p> */
|
|
public static final int PID_REVNUMBER = 9;
|
|
|
|
/** <p>ID of the property that denotes the document's edit time</p> */
|
|
public static final int PID_EDITTIME = 10;
|
|
|
|
/** <p>ID of the property that denotes the date and time the document was
|
|
* last printed</p> */
|
|
public static final int PID_LASTPRINTED = 11;
|
|
|
|
/** <p>ID of the property that denotes the date and time the document was
|
|
* created.</p> */
|
|
public static final int PID_CREATE_DTM = 12;
|
|
|
|
/** <p>ID of the property that denotes the date and time the document was
|
|
* saved</p> */
|
|
public static final int PID_LASTSAVE_DTM = 13;
|
|
|
|
/** <p>ID of the property that denotes the number of pages in the
|
|
* document</p> */
|
|
public static final int PID_PAGECOUNT = 14;
|
|
|
|
/** <p>ID of the property that denotes the number of words in the
|
|
* document</p> */
|
|
public static final int PID_WORDCOUNT = 15;
|
|
|
|
/** <p>ID of the property that denotes the number of characters in the
|
|
* document</p> */
|
|
public static final int PID_CHARCOUNT = 16;
|
|
|
|
/** <p>ID of the property that denotes the document's thumbnail</p> */
|
|
public static final int PID_THUMBNAIL = 17;
|
|
|
|
/** <p>ID of the property that denotes the application that created the
|
|
* document</p> */
|
|
public static final int PID_APPNAME = 18;
|
|
|
|
/** <p>ID of the property that denotes whether read/write access to the
|
|
* document is allowed or whether is should be opened as read-only. It can
|
|
* have the following values:</p>
|
|
*
|
|
* <table summary="">
|
|
* <tbody>
|
|
* <tr>
|
|
* <th><p>Value</p></th>
|
|
* <th><p>Description</p></th>
|
|
* </tr>
|
|
* <tr>
|
|
* <th><p>0</p></th>
|
|
* <th><p>No restriction</p></th>
|
|
* </tr>
|
|
* <tr>
|
|
* <th><p>2</p></th>
|
|
* <th><p>Read-only recommended</p></th>
|
|
* </tr>
|
|
* <tr>
|
|
* <th><p>4</p></th>
|
|
* <th><p>Read-only enforced</p></th>
|
|
* </tr>
|
|
* </tbody>
|
|
* </table>
|
|
*/
|
|
public static final int PID_SECURITY = 19;
|
|
|
|
|
|
|
|
/*
|
|
* The following definitions are for property IDs in the first
|
|
* section of the Document Summary Information property set.
|
|
*/
|
|
|
|
/**
|
|
* <p>The entry is a dictionary.</p>
|
|
*/
|
|
public static final int PID_DICTIONARY = 0;
|
|
|
|
/**
|
|
* <p>The entry denotes a code page.</p>
|
|
*/
|
|
public static final int PID_CODEPAGE = 1;
|
|
|
|
/**
|
|
* <p>The entry is a string denoting the category the file belongs
|
|
* to, e.g. review, memo, etc. This is useful to find documents of
|
|
* same type.</p>
|
|
*/
|
|
public static final int PID_CATEGORY = 2;
|
|
|
|
/**
|
|
* <p>Target format for power point presentation, e.g. 35mm,
|
|
* printer, video etc.</p>
|
|
*/
|
|
public static final int PID_PRESFORMAT = 3;
|
|
|
|
/**
|
|
* <p>Number of bytes.</p>
|
|
*/
|
|
public static final int PID_BYTECOUNT = 4;
|
|
|
|
/**
|
|
* <p>Number of lines.</p>
|
|
*/
|
|
public static final int PID_LINECOUNT = 5;
|
|
|
|
/**
|
|
* <p>Number of paragraphs.</p>
|
|
*/
|
|
public static final int PID_PARCOUNT = 6;
|
|
|
|
/**
|
|
* <p>Number of slides in a power point presentation.</p>
|
|
*/
|
|
public static final int PID_SLIDECOUNT = 7;
|
|
|
|
/**
|
|
* <p>Number of slides with notes.</p>
|
|
*/
|
|
public static final int PID_NOTECOUNT = 8;
|
|
|
|
/**
|
|
* <p>Number of hidden slides.</p>
|
|
*/
|
|
public static final int PID_HIDDENCOUNT = 9;
|
|
|
|
/**
|
|
* <p>Number of multimedia clips, e.g. sound or video.</p>
|
|
*/
|
|
public static final int PID_MMCLIPCOUNT = 10;
|
|
|
|
/**
|
|
* <p>This entry is set to -1 when scaling of the thumbnail is
|
|
* desired. Otherwise the thumbnail should be cropped.</p>
|
|
*/
|
|
public static final int PID_SCALE = 11;
|
|
|
|
/**
|
|
* <p>This entry denotes an internally used property. It is a
|
|
* vector of variants consisting of pairs of a string (VT_LPSTR)
|
|
* and a number (VT_I4). The string is a heading name, and the
|
|
* number tells how many document parts are under that
|
|
* heading.</p>
|
|
*/
|
|
public static final int PID_HEADINGPAIR = 12;
|
|
|
|
/**
|
|
* <p>This entry contains the names of document parts (word: names
|
|
* of the documents in the master document, excel: sheet names,
|
|
* power point: slide titles, binder: document names).</p>
|
|
*/
|
|
public static final int PID_DOCPARTS = 13;
|
|
|
|
/**
|
|
* <p>This entry contains the name of the project manager.</p>
|
|
*/
|
|
public static final int PID_MANAGER = 14;
|
|
|
|
/**
|
|
* <p>This entry contains the company name.</p>
|
|
*/
|
|
public static final int PID_COMPANY = 15;
|
|
|
|
/**
|
|
* <p>If this entry is -1 the links are dirty and should be
|
|
* re-evaluated.</p>
|
|
*/
|
|
public static final int PID_LINKSDIRTY = 0x10;
|
|
|
|
/**
|
|
* <p>The entry specifies an estimate of the number of characters
|
|
* in the document, including whitespace, as an integer
|
|
*/
|
|
public static final int PID_CCHWITHSPACES = 0x11;
|
|
|
|
// 0x12 Unused
|
|
// 0x13 GKPIDDSI_SHAREDDOC - Must be False
|
|
// 0x14 GKPIDDSI_LINKBASE - Must not be written
|
|
// 0x15 GKPIDDSI_HLINKS - Must not be written
|
|
|
|
/**
|
|
* <p>This entry contains a boolean which marks if the User Defined
|
|
* Property Set has been updated outside of the Application, if so the
|
|
* hyperlinks should be updated on document load.
|
|
*/
|
|
public static final int PID_HYPERLINKSCHANGED = 0x16;
|
|
|
|
/**
|
|
* <p>This entry contains the version of the Application which wrote the
|
|
* Property set, stored with the two high order bytes having the major
|
|
* version number, and the two low order bytes the minor version number.
|
|
*/
|
|
public static final int PID_VERSION = 0x17;
|
|
|
|
/**
|
|
* <p>This entry contains the VBA digital signature for the VBA project
|
|
* embedded in the document.
|
|
*/
|
|
public static final int PID_DIGSIG = 0x18;
|
|
|
|
// 0x19 Unused
|
|
|
|
/**
|
|
* <p>This entry contains a string of the content type of the file.
|
|
*/
|
|
public static final int PID_CONTENTTYPE = 0x1A;
|
|
|
|
/**
|
|
* <p>This entry contains a string of the document status.
|
|
*/
|
|
public static final int PID_CONTENTSTATUS = 0x1B;
|
|
|
|
/**
|
|
* <p>This entry contains a string of the document language, but
|
|
* normally should be empty.
|
|
*/
|
|
public static final int PID_LANGUAGE = 0x1C;
|
|
|
|
/**
|
|
* <p>This entry contains a string of the document version, but
|
|
* normally should be empty
|
|
*/
|
|
public static final int PID_DOCVERSION = 0x1D;
|
|
|
|
/**
|
|
* <p>The highest well-known property ID. Applications are free to use
|
|
* higher values for custom purposes. (This value is based on Office 12,
|
|
* earlier versions of Office had lower values)</p>
|
|
*/
|
|
public static final int PID_MAX = 0x1F;
|
|
|
|
|
|
|
|
/**
|
|
* <p>Contains the summary information property ID values and
|
|
* associated strings. See the overall HPSF documentation for
|
|
* details!</p>
|
|
*/
|
|
private static PropertyIDMap summaryInformationProperties;
|
|
|
|
/**
|
|
* <p>Contains the summary information property ID values and
|
|
* associated strings. See the overall HPSF documentation for
|
|
* details!</p>
|
|
*/
|
|
private static PropertyIDMap documentSummaryInformationProperties;
|
|
|
|
|
|
|
|
/**
|
|
* <p>Creates a {@link PropertyIDMap}.</p>
|
|
*
|
|
* @param initialCapacity The initial capacity as defined for
|
|
* {@link HashMap}
|
|
* @param loadFactor The load factor as defined for {@link HashMap}
|
|
*/
|
|
public PropertyIDMap(final int initialCapacity, final float loadFactor)
|
|
{
|
|
super(initialCapacity, loadFactor);
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* <p>Creates a {@link PropertyIDMap} backed by another map.</p>
|
|
*
|
|
* @param map The instance to be created is backed by this map.
|
|
*/
|
|
public PropertyIDMap(final Map<Long,String> map)
|
|
{
|
|
super(map);
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* <p>Puts a ID string for an ID into the {@link
|
|
* PropertyIDMap}.</p>
|
|
*
|
|
* @param id The ID.
|
|
* @param idString The ID string.
|
|
* @return As specified by the {@link java.util.Map} interface, this method
|
|
* returns the previous value associated with the specified
|
|
* <var>id</var>, or <code>null</code> if there was no mapping for
|
|
* key.
|
|
*/
|
|
public Object put(final long id, final String idString)
|
|
{
|
|
return put(Long.valueOf(id), idString);
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* <p>Gets the ID string for an ID from the {@link
|
|
* PropertyIDMap}.</p>
|
|
*
|
|
* @param id The ID.
|
|
* @return The ID string associated with <var>id</var>.
|
|
*/
|
|
public Object get(final long id)
|
|
{
|
|
return get(Long.valueOf(id));
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* @return the Summary Information properties singleton
|
|
*/
|
|
public static PropertyIDMap getSummaryInformationProperties()
|
|
{
|
|
if (summaryInformationProperties == null)
|
|
{
|
|
PropertyIDMap m = new PropertyIDMap(18, (float) 1.0);
|
|
m.put(PID_TITLE, "PID_TITLE");
|
|
m.put(PID_SUBJECT, "PID_SUBJECT");
|
|
m.put(PID_AUTHOR, "PID_AUTHOR");
|
|
m.put(PID_KEYWORDS, "PID_KEYWORDS");
|
|
m.put(PID_COMMENTS, "PID_COMMENTS");
|
|
m.put(PID_TEMPLATE, "PID_TEMPLATE");
|
|
m.put(PID_LASTAUTHOR, "PID_LASTAUTHOR");
|
|
m.put(PID_REVNUMBER, "PID_REVNUMBER");
|
|
m.put(PID_EDITTIME, "PID_EDITTIME");
|
|
m.put(PID_LASTPRINTED, "PID_LASTPRINTED");
|
|
m.put(PID_CREATE_DTM, "PID_CREATE_DTM");
|
|
m.put(PID_LASTSAVE_DTM, "PID_LASTSAVE_DTM");
|
|
m.put(PID_PAGECOUNT, "PID_PAGECOUNT");
|
|
m.put(PID_WORDCOUNT, "PID_WORDCOUNT");
|
|
m.put(PID_CHARCOUNT, "PID_CHARCOUNT");
|
|
m.put(PID_THUMBNAIL, "PID_THUMBNAIL");
|
|
m.put(PID_APPNAME, "PID_APPNAME");
|
|
m.put(PID_SECURITY, "PID_SECURITY");
|
|
summaryInformationProperties =
|
|
new PropertyIDMap(Collections.unmodifiableMap(m));
|
|
}
|
|
return summaryInformationProperties;
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* <p>Returns the Document Summary Information properties
|
|
* singleton.</p>
|
|
*
|
|
* @return The Document Summary Information properties singleton.
|
|
*/
|
|
public static PropertyIDMap getDocumentSummaryInformationProperties()
|
|
{
|
|
if (documentSummaryInformationProperties == null)
|
|
{
|
|
PropertyIDMap m = new PropertyIDMap(17, (float) 1.0);
|
|
m.put(PID_DICTIONARY, "PID_DICTIONARY");
|
|
m.put(PID_CODEPAGE, "PID_CODEPAGE");
|
|
m.put(PID_CATEGORY, "PID_CATEGORY");
|
|
m.put(PID_PRESFORMAT, "PID_PRESFORMAT");
|
|
m.put(PID_BYTECOUNT, "PID_BYTECOUNT");
|
|
m.put(PID_LINECOUNT, "PID_LINECOUNT");
|
|
m.put(PID_PARCOUNT, "PID_PARCOUNT");
|
|
m.put(PID_SLIDECOUNT, "PID_SLIDECOUNT");
|
|
m.put(PID_NOTECOUNT, "PID_NOTECOUNT");
|
|
m.put(PID_HIDDENCOUNT, "PID_HIDDENCOUNT");
|
|
m.put(PID_MMCLIPCOUNT, "PID_MMCLIPCOUNT");
|
|
m.put(PID_SCALE, "PID_SCALE");
|
|
m.put(PID_HEADINGPAIR, "PID_HEADINGPAIR");
|
|
m.put(PID_DOCPARTS, "PID_DOCPARTS");
|
|
m.put(PID_MANAGER, "PID_MANAGER");
|
|
m.put(PID_COMPANY, "PID_COMPANY");
|
|
m.put(PID_LINKSDIRTY, "PID_LINKSDIRTY");
|
|
documentSummaryInformationProperties =
|
|
new PropertyIDMap(Collections.unmodifiableMap(m));
|
|
}
|
|
return documentSummaryInformationProperties;
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* <p>For the most basic testing.</p>
|
|
*
|
|
* @param args The command-line arguments
|
|
*/
|
|
public static void main(final String[] args)
|
|
{
|
|
PropertyIDMap s1 = getSummaryInformationProperties();
|
|
PropertyIDMap s2 = getDocumentSummaryInformationProperties();
|
|
System.out.println("s1: " + s1);
|
|
System.out.println("s2: " + s2);
|
|
}
|
|
}
|