/*
* 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.pdfbox.cos;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdmodel.common.COSObjectable;
import org.apache.pdfbox.util.DateConverter;
/**
* This class represents a dictionary where name/value pairs reside.
*
* @author <a href="ben@benlitchfield.com">Ben Litchfield</a>
* @version $Revision: 1.32 $
*/
public class COSDictionary extends COSBase
{
private static final String PATH_SEPARATOR = "/";
/**
* The name-value pairs of this dictionary. The pairs are kept in the
* order they were added to the dictionary.
*/
protected final Map<COSName, COSBase> items =
new LinkedHashMap<COSName, COSBase>();
/**
* Constructor.
*/
public COSDictionary()
{
//default constructor
}
/**
* Copy Constructor. This will make a shallow copy of this dictionary.
*
* @param dict The dictionary to copy.
*/
public COSDictionary( COSDictionary dict )
{
items.putAll( dict.items );
}
/**
* @see java.util.Map#containsValue(java.lang.Object)
*
* @param value The value to find in the map.
*
* @return true if the map contains this value.
*/
public boolean containsValue( Object value )
{
boolean contains = items.containsValue( value );
if( !contains && value instanceof COSObject )
{
contains = items.containsValue( ((COSObject)value).getObject());
}
return contains;
}
/**
* Search in the map for the value that matches the parameter
* and return the first key that maps to that value.
*
* @param value The value to search for in the map.
* @return The key for the value in the map or null if it does not exist.
*/
public COSName getKeyForValue( Object value )
{
for( Map.Entry<COSName, COSBase> entry : items.entrySet() )
{
Object nextValue = entry.getValue();
if( nextValue.equals( value ) ||
(nextValue instanceof COSObject &&
((COSObject)nextValue).getObject().equals( value))
)
{
return entry.getKey();
}
}
return null;
}
/**
* This will return the number of elements in this dictionary.
*
* @return The number of elements in the dictionary.
*/
public int size()
{
return items.size();
}
/**
* This will clear all items in the map.
*/
public void clear()
{
items.clear();
}
/**
* This will get an object from this dictionary. If the object is a reference then it will
* dereference it and get it from the document. If the object is COSNull then
* null will be returned.
*
* @param key The key to the object that we are getting.
*
* @return The object that matches the key.
*/
public COSBase getDictionaryObject( String key )
{
return getDictionaryObject( COSName.getPDFName( key ) );
}
/**
* This is a special case of getDictionaryObject that takes multiple keys, it will handle
* the situation where multiple keys could get the same value, ie if either CS or ColorSpace
* is used to get the colorspace.
* This will get an object from this dictionary. If the object is a reference then it will
* dereference it and get it from the document. If the object is COSNull then
* null will be returned.
*
* @param firstKey The first key to try.
* @param secondKey The second key to try.
*
* @return The object that matches the key.
*
* @deprecated use {@link #getDictionaryObject(COSName, COSName)} using COSName constants instead
*/
public COSBase getDictionaryObject( String firstKey, String secondKey )
{
COSBase retval = getDictionaryObject( COSName.getPDFName( firstKey ) );
if( retval == null )
{
retval = getDictionaryObject( COSName.getPDFName( secondKey ) );
}
return retval;
}
/**
* This is a special case of getDictionaryObject that takes multiple keys, it will handle
* the situation where multiple keys could get the same value, ie if either CS or ColorSpace
* is used to get the colorspace.
* This will get an object from this dictionary. If the object is a reference then it will
* dereference it and get it from the document. If the object is COSNull then
* null will be returned.
*
* @param firstKey The first key to try.
* @param secondKey The second key to try.
*
* @return The object that matches the key.
*/
public COSBase getDictionaryObject( COSName firstKey, COSName secondKey )
{
COSBase retval = getDictionaryObject( firstKey );
if( retval == null && secondKey != null)
{
retval = getDictionaryObject( secondKey );
}
return retval;
}
/**
* This is a special case of getDictionaryObject that takes multiple keys, it will handle
* the situation where multiple keys could get the same value, ie if either CS or ColorSpace
* is used to get the colorspace.
* This will get an object from this dictionary. If the object is a reference then it will
* dereference it and get it from the document. If the object is COSNull then
* null will be returned.
*
* @param keyList The list of keys to find a value.
*
* @return The object that matches the key.
*/
public COSBase getDictionaryObject( String[] keyList )
{
COSBase retval = null;
for( int i=0; i<keyList.length && retval == null; i++ )
{
retval = getDictionaryObject( COSName.getPDFName( keyList[i] ) );
}
return retval;
}
/**
* This will get an object from this dictionary. If the object is a reference then it will
* dereference it and get it from the document. If the object is COSNull then
* null will be returned.
*
* @param key The key to the object that we are getting.
*
* @return The object that matches the key.
*/
public COSBase getDictionaryObject( COSName key )
{
COSBase retval = items.get( key );
if( retval instanceof COSObject )
{
retval = ((COSObject)retval).getObject();
}
if( retval instanceof COSNull )
{
retval = null;
}
return retval;
}
/**
* This will set an item in the dictionary. If value is null then the result
* will be the same as removeItem( key ).
*
* @param key The key to the dictionary object.
* @param value The value to the dictionary object.
*/
public void setItem( COSName key, COSBase value )
{
if( value == null )
{
removeItem( key );
}
else
{
items.put( key, value );
}
}
/**
* This will set an item in the dictionary. If value is null then the result
* will be the same as removeItem( key ).
*
* @param key The key to the dictionary object.
* @param value The value to the dictionary object.
*/
public void setItem( COSName key, COSObjectable value )
{
COSBase base = null;
if( value != null )
{
base = value.getCOSObject();
}
setItem( key, base );
}
/**
* This will set an item in the dictionary. If value is null then the result
* will be the same as removeItem( key ).
*
* @param key The key to the dictionary object.
* @param value The value to the dictionary object.
*/
public void setItem( String key, COSObjectable value )
{
setItem( COSName.getPDFName( key ), value );
}
/**
* This will set an item in the dictionary.
*
* @param key The key to the dictionary object.
* @param value The value to the dictionary object.
*/
public void setBoolean( String key, boolean value )
{
setItem( COSName.getPDFName( key ), COSBoolean.getBoolean( value ) );
}
/**
* This will set an item in the dictionary.
*
* @param key The key to the dictionary object.
* @param value The value to the dictionary object.
*/
public void setBoolean( COSName key, boolean value )
{
setItem( key , COSBoolean.getBoolean( value ) );
}
/**
* This will set an item in the dictionary. If value is null then the result
* will be the same as removeItem( key ).
*
* @param key The key to the dictionary object.
* @param value The value to the dictionary object.
*/
public void setItem( String key, COSBase value )
{
setItem( COSName.getPDFName( key ), value );
}
/**
* This is a convenience method that will convert the value to a COSName
* object. If it is null then the object will be removed.
*
* @param key The key to the object,
* @param value The string value for the name.
*/
public void setName( String key, String value )
{
setName( COSName.getPDFName( key ), value );
}
/**
* This is a convenience method that will convert the value to a COSName
* object. If it is null then the object will be removed.
*
* @param key The key to the object,
* @param value The string value for the name.
*/
public void setName( COSName key, String value )
{
COSName name = null;
if( value != null )
{
name = COSName.getPDFName( value );
}
setItem( key, name );
}
/**
* Set the value of a date entry in the dictionary.
*
* @param key The key to the date value.
* @param date The date value.
*/
public void setDate( String key, Calendar date )
{
setDate( COSName.getPDFName( key ), date );
}
/**
* Set the date object.
*
* @param key The key to the date.
* @param date The date to set.
*/
public void setDate( COSName key, Calendar date )
{
setString( key, DateConverter.toString( date ) );
}
/**
* Set the value of a date entry in the dictionary.
*
* @param embedded The embedded dictionary.
* @param key The key to the date value.
* @param date The date value.
*/
public void setEmbeddedDate( String embedded, String key, Calendar date )
{
setEmbeddedDate( embedded, COSName.getPDFName( key ), date );
}
/**
* Set the date object.
*
* @param embedded The embedded dictionary.
* @param key The key to the date.
* @param date The date to set.
*/
public void setEmbeddedDate( String embedded, COSName key, Calendar date )
{
COSDictionary dic = (COSDictionary)getDictionaryObject( embedded );
if( dic == null && date != null )
{
dic = new COSDictionary();
setItem( embedded, dic );
}
if( dic != null )
{
dic.setDate( key, date );
}
}
/**
* This is a convenience method that will convert the value to a COSString
* object. If it is null then the object will be removed.
*
* @param key The key to the object,
* @param value The string value for the name.
*/
public void setString( String key, String value )
{
setString( COSName.getPDFName( key ), value );
}
/**
* This is a convenience method that will convert the value to a COSString
* object. If it is null then the object will be removed.
*
* @param key The key to the object,
* @param value The string value for the name.
*/
public void setString( COSName key, String value )
{
COSString name = null;
if( value != null )
{
name = new COSString( value );
}
setItem( key, name );
}
/**
* This is a convenience method that will convert the value to a COSString
* object. If it is null then the object will be removed.
*
* @param embedded The embedded dictionary to set the item in.
* @param key The key to the object,
* @param value The string value for the name.
*/
public void setEmbeddedString( String embedded, String key, String value )
{
setEmbeddedString( embedded, COSName.getPDFName( key ), value );
}
/**
* This is a convenience method that will convert the value to a COSString
* object. If it is null then the object will be removed.
*
* @param embedded The embedded dictionary to set the item in.
* @param key The key to the object,
* @param value The string value for the name.
*/
public void setEmbeddedString( String embedded, COSName key, String value )
{
COSDictionary dic = (COSDictionary)getDictionaryObject( embedded );
if( dic == null && value != null )
{
dic = new COSDictionary();
setItem( embedded, dic );
}
if( dic != null )
{
dic.setString( key, value );
}
}
/**
* This is a convenience method that will convert the value to a COSInteger
* object.
*
* @param key The key to the object,
* @param value The int value for the name.
*/
public void setInt( String key, int value )
{
setInt( COSName.getPDFName( key ), value );
}
/**
* This is a convenience method that will convert the value to a COSInteger
* object.
*
* @param key The key to the object,
* @param value The int value for the name.
*/
public void setInt( COSName key, int value )
{
setItem( key, COSInteger.get(value) );
}
/**
* This is a convenience method that will convert the value to a COSInteger
* object.
*
* @param key The key to the object,
* @param value The int value for the name.
*/
public void setLong( String key, long value )
{
setLong( COSName.getPDFName( key ), value );
}
/**
* This is a convenience method that will convert the value to a COSInteger
* object.
*
* @param key The key to the object,
* @param value The int value for the name.
*/
public void setLong( COSName key, long value )
{
COSInteger intVal = null;
intVal = COSInteger.get(value);
setItem( key, intVal );
}
/**
* This is a convenience method that will convert the value to a COSInteger
* object.
*
* @param embeddedDictionary The embedded dictionary.
* @param key The key to the object,
* @param value The int value for the name.
*/
public void setEmbeddedInt( String embeddedDictionary, String key, int value )
{
setEmbeddedInt( embeddedDictionary, COSName.getPDFName( key ), value );
}
/**
* This is a convenience method that will convert the value to a COSInteger
* object.
*
* @param embeddedDictionary The embedded dictionary.
* @param key The key to the object,
* @param value The int value for the name.
*/
public void setEmbeddedInt( String embeddedDictionary, COSName key, int value )
{
COSDictionary embedded = (COSDictionary)getDictionaryObject( embeddedDictionary );
if( embedded == null )
{
embedded = new COSDictionary();
setItem( embeddedDictionary, embedded );
}
embedded.setInt( key, value );
}
/**
* This is a convenience method that will convert the value to a COSFloat
* object.
*
* @param key The key to the object,
* @param value The int value for the name.
*/
public void setFloat( String key, float value )
{
setFloat( COSName.getPDFName( key ), value );
}
/**
* This is a convenience method that will convert the value to a COSFloat
* object.
*
* @param key The key to the object,
* @param value The int value for the name.
*/
public void setFloat( COSName key, float value )
{
COSFloat fltVal = new COSFloat( value );
setItem( key, fltVal );
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be a name and convert it to a string. Null is returned
* if the entry does not exist in the dictionary.
*
* @param key The key to the item in the dictionary.
* @return The name converted to a string.
*/
public String getNameAsString( String key )
{
return getNameAsString( COSName.getPDFName( key ) );
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be a name and convert it to a string. Null is returned
* if the entry does not exist in the dictionary.
*
* @param key The key to the item in the dictionary.
* @return The name converted to a string.
*/
public String getNameAsString( COSName key )
{
String retval = null;
COSBase name = getDictionaryObject( key );
if( name != null )
{
if ( name instanceof COSName)
{
retval = ((COSName)name).getName();
}
else if ( name instanceof COSString)
{
retval = ((COSString)name).getString();
}
}
return retval;
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be a name and convert it to a string. Null is returned
* if the entry does not exist in the dictionary.
*
* @param key The key to the item in the dictionary.
* @param defaultValue The value to return if the dictionary item is null.
* @return The name converted to a string.
*/
public String getNameAsString( String key, String defaultValue )
{
return getNameAsString( COSName.getPDFName( key ), defaultValue );
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be a name and convert it to a string. Null is returned
* if the entry does not exist in the dictionary.
*
* @param key The key to the item in the dictionary.
* @param defaultValue The value to return if the dictionary item is null.
* @return The name converted to a string.
*/
public String getNameAsString( COSName key, String defaultValue )
{
String retval = getNameAsString( key );
if( retval == null )
{
retval = defaultValue;
}
return retval;
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be a name and convert it to a string. Null is returned
* if the entry does not exist in the dictionary.
*
* @param key The key to the item in the dictionary.
* @return The name converted to a string.
*/
public String getString( String key )
{
return getString( COSName.getPDFName( key ) );
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be a name and convert it to a string. Null is returned
* if the entry does not exist in the dictionary.
*
* @param key The key to the item in the dictionary.
* @return The name converted to a string.
*/
public String getString( COSName key )
{
String retval = null;
COSBase value = getDictionaryObject( key );
if( value != null && value instanceof COSString)
{
retval = ((COSString)value).getString();
}
return retval;
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be a name and convert it to a string. Null is returned
* if the entry does not exist in the dictionary.
*
* @param key The key to the item in the dictionary.
* @param defaultValue The default value to return.
* @return The name converted to a string.
*/
public String getString( String key, String defaultValue )
{
return getString( COSName.getPDFName( key ), defaultValue );
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be a name and convert it to a string. Null is returned
* if the entry does not exist in the dictionary.
*
* @param key The key to the item in the dictionary.
* @param defaultValue The default value to return.
* @return The name converted to a string.
*/
public String getString( COSName key, String defaultValue )
{
String retval = getString( key );
if( retval == null )
{
retval = defaultValue;
}
return retval;
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be a name and convert it to a string. Null is returned
* if the entry does not exist in the dictionary.
*
* @param embedded The embedded dictionary.
* @param key The key to the item in the dictionary.
* @return The name converted to a string.
*/
public String getEmbeddedString( String embedded, String key )
{
return getEmbeddedString( embedded, COSName.getPDFName( key ), null );
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be a name and convert it to a string. Null is returned
* if the entry does not exist in the dictionary.
*
* @param embedded The embedded dictionary.
* @param key The key to the item in the dictionary.
* @return The name converted to a string.
*/
public String getEmbeddedString( String embedded, COSName key )
{
return getEmbeddedString( embedded, key, null );
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be a name and convert it to a string. Null is returned
* if the entry does not exist in the dictionary.
*
* @param embedded The embedded dictionary.
* @param key The key to the item in the dictionary.
* @param defaultValue The default value to return.
* @return The name converted to a string.
*/
public String getEmbeddedString( String embedded, String key, String defaultValue )
{
return getEmbeddedString( embedded, COSName.getPDFName( key ), defaultValue );
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be a name and convert it to a string. Null is returned
* if the entry does not exist in the dictionary.
*
* @param embedded The embedded dictionary.
* @param key The key to the item in the dictionary.
* @param defaultValue The default value to return.
* @return The name converted to a string.
*/
public String getEmbeddedString( String embedded, COSName key, String defaultValue )
{
String retval = defaultValue;
COSDictionary dic = (COSDictionary)getDictionaryObject( embedded );
if( dic != null )
{
retval = dic.getString( key, defaultValue );
}
return retval;
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be a name and convert it to a string. Null is returned
* if the entry does not exist in the dictionary.
*
* @param key The key to the item in the dictionary.
* @return The name converted to a string.
* @throws IOException If there is an error converting to a date.
*/
public Calendar getDate( String key ) throws IOException
{
return getDate( COSName.getPDFName( key ) );
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be a name and convert it to a string. Null is returned
* if the entry does not exist in the dictionary.
*
* @param key The key to the item in the dictionary.
* @return The name converted to a string.
*
* @throws IOException If there is an error converting to a date.
*/
public Calendar getDate( COSName key ) throws IOException
{
COSString date = (COSString)getDictionaryObject( key );
return DateConverter.toCalendar( date );
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be a date. Null is returned
* if the entry does not exist in the dictionary.
*
* @param key The key to the item in the dictionary.
* @param defaultValue The default value to return.
* @return The name converted to a string.
* @throws IOException If there is an error converting to a date.
*/
public Calendar getDate( String key, Calendar defaultValue ) throws IOException
{
return getDate( COSName.getPDFName( key ), defaultValue );
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be a date. Null is returned
* if the entry does not exist in the dictionary.
*
* @param key The key to the item in the dictionary.
* @param defaultValue The default value to return.
* @return The name converted to a string.
* @throws IOException If there is an error converting to a date.
*/
public Calendar getDate( COSName key, Calendar defaultValue ) throws IOException
{
Calendar retval = getDate( key );
if( retval == null )
{
retval = defaultValue;
}
return retval;
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be a name and convert it to a string. Null is returned
* if the entry does not exist in the dictionary.
*
* @param embedded The embedded dictionary to get.
* @param key The key to the item in the dictionary.
* @return The name converted to a string.
* @throws IOException If there is an error converting to a date.
*/
public Calendar getEmbeddedDate( String embedded, String key ) throws IOException
{
return getEmbeddedDate( embedded, COSName.getPDFName( key ), null );
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be a name and convert it to a string. Null is returned
* if the entry does not exist in the dictionary.
*
* @param embedded The embedded dictionary to get.
* @param key The key to the item in the dictionary.
* @return The name converted to a string.
*
* @throws IOException If there is an error converting to a date.
*/
public Calendar getEmbeddedDate( String embedded, COSName key ) throws IOException
{
return getEmbeddedDate( embedded, key, null );
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be a date. Null is returned
* if the entry does not exist in the dictionary.
*
* @param embedded The embedded dictionary to get.
* @param key The key to the item in the dictionary.
* @param defaultValue The default value to return.
* @return The name converted to a string.
* @throws IOException If there is an error converting to a date.
*/
public Calendar getEmbeddedDate( String embedded, String key, Calendar defaultValue ) throws IOException
{
return getEmbeddedDate( embedded, COSName.getPDFName( key ), defaultValue );
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be a date. Null is returned
* if the entry does not exist in the dictionary.
*
* @param embedded The embedded dictionary to get.
* @param key The key to the item in the dictionary.
* @param defaultValue The default value to return.
* @return The name converted to a string.
* @throws IOException If there is an error converting to a date.
*/
public Calendar getEmbeddedDate( String embedded, COSName key, Calendar defaultValue ) throws IOException
{
Calendar retval = defaultValue;
COSDictionary eDic = (COSDictionary)getDictionaryObject( embedded );
if( eDic != null )
{
retval = eDic.getDate( key, defaultValue );
}
return retval;
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be a cos boolean and convert it to a primitive boolean.
*
* @param key The key to the item in the dictionary.
* @param defaultValue The value returned if the entry is null.
*
* @return The value converted to a boolean.
*/
public boolean getBoolean( String key, boolean defaultValue )
{
return getBoolean( COSName.getPDFName( key ), defaultValue );
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be a COSBoolean and convert it to a primitive boolean.
*
* @param key The key to the item in the dictionary.
* @param defaultValue The value returned if the entry is null.
*
* @return The entry converted to a boolean.
*/
public boolean getBoolean( COSName key, boolean defaultValue )
{
return getBoolean( key, null, defaultValue);
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be a COSBoolean and convert it to a primitive boolean.
*
* @param firstKey The first key to the item in the dictionary.
* @param secondKey The second key to the item in the dictionary.
* @param defaultValue The value returned if the entry is null.
*
* @return The entry converted to a boolean.
*/
public boolean getBoolean( COSName firstKey, COSName secondKey, boolean defaultValue )
{
boolean retval = defaultValue;
COSBase bool = getDictionaryObject( firstKey, secondKey );
if( bool != null && bool instanceof COSBoolean)
{
retval = ((COSBoolean)bool).getValue();
}
return retval;
}
/**
* Get an integer from an embedded dictionary. Useful for 1-1 mappings. default:-1
*
* @param embeddedDictionary The name of the embedded dictionary.
* @param key The key in the embedded dictionary.
*
* @return The value of the embedded integer.
*/
public int getEmbeddedInt( String embeddedDictionary, String key )
{
return getEmbeddedInt( embeddedDictionary, COSName.getPDFName( key ) );
}
/**
* Get an integer from an embedded dictionary. Useful for 1-1 mappings. default:-1
*
* @param embeddedDictionary The name of the embedded dictionary.
* @param key The key in the embedded dictionary.
*
* @return The value of the embedded integer.
*/
public int getEmbeddedInt( String embeddedDictionary, COSName key )
{
return getEmbeddedInt( embeddedDictionary, key, -1 );
}
/**
* Get an integer from an embedded dictionary. Useful for 1-1 mappings.
*
* @param embeddedDictionary The name of the embedded dictionary.
* @param key The key in the embedded dictionary.
* @param defaultValue The value if there is no embedded dictionary or it does not contain the key.
*
* @return The value of the embedded integer.
*/
public int getEmbeddedInt( String embeddedDictionary, String key, int defaultValue )
{
return getEmbeddedInt( embeddedDictionary, COSName.getPDFName( key ), defaultValue );
}
/**
* Get an integer from an embedded dictionary. Useful for 1-1 mappings.
*
* @param embeddedDictionary The name of the embedded dictionary.
* @param key The key in the embedded dictionary.
* @param defaultValue The value if there is no embedded dictionary or it does not contain the key.
*
* @return The value of the embedded integer.
*/
public int getEmbeddedInt( String embeddedDictionary, COSName key, int defaultValue )
{
int retval = defaultValue;
COSDictionary embedded = (COSDictionary)getDictionaryObject( embeddedDictionary );
if( embedded != null )
{
retval = embedded.getInt( key, defaultValue );
}
return retval;
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be an int. -1 is returned if there is no value.
*
* @param key The key to the item in the dictionary.
* @return The integer value.
*/
public int getInt( String key )
{
return getInt( COSName.getPDFName( key ), -1 );
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be an int. -1 is returned if there is no value.
*
* @param key The key to the item in the dictionary.
* @return The integer value..
*/
public int getInt( COSName key )
{
return getInt( key, -1 );
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be an integer. If the dictionary value is null then the
* default Value will be returned.
*
* @param keyList The key to the item in the dictionary.
* @param defaultValue The value to return if the dictionary item is null.
* @return The integer value.
*/
public int getInt( String[] keyList, int defaultValue )
{
int retval = defaultValue;
COSBase obj = getDictionaryObject( keyList );
if( obj != null && obj instanceof COSNumber)
{
retval = ((COSNumber)obj).intValue();
}
return retval;
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be an integer. If the dictionary value is null then the
* default Value will be returned.
*
* @param key The key to the item in the dictionary.
* @param defaultValue The value to return if the dictionary item is null.
* @return The integer value.
*/
public int getInt( String key, int defaultValue )
{
return getInt( COSName.getPDFName( key ), defaultValue );
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be an integer. If the dictionary value is null then the
* default Value will be returned.
*
* @param key The key to the item in the dictionary.
* @param defaultValue The value to return if the dictionary item is null.
* @return The integer value.
*/
public int getInt( COSName key, int defaultValue )
{
return getInt( key, null, defaultValue);
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be an integer. If the dictionary value is null then the
* default Value -1 will be returned.
*
* @param firstKey The first key to the item in the dictionary.
* @param secondKey The second key to the item in the dictionary.
* @return The integer value.
*/
public int getInt( COSName firstKey, COSName secondKey )
{
return getInt( firstKey, secondKey, -1 );
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be an integer. If the dictionary value is null then the
* default Value will be returned.
*
* @param firstKey The first key to the item in the dictionary.
* @param secondKey The second key to the item in the dictionary.
* @param defaultValue The value to return if the dictionary item is null.
* @return The integer value.
*/
public int getInt( COSName firstKey, COSName secondKey, int defaultValue )
{
int retval = defaultValue;
COSBase obj = getDictionaryObject( firstKey, secondKey );
if( obj != null && obj instanceof COSNumber)
{
retval = ((COSNumber)obj).intValue();
}
return retval;
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be an long. -1 is returned if there is no value.
*
* @param key The key to the item in the dictionary.
*
* @return The long value.
*/
public long getLong( String key )
{
return getLong( COSName.getPDFName( key ), -1L );
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be an long. -1 is returned if there is no value.
*
* @param key The key to the item in the dictionary.
* @return The long value.
*/
public long getLong( COSName key )
{
return getLong( key, -1L );
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be an long. If the dictionary value is null then the
* default Value will be returned.
*
* @param keyList The key to the item in the dictionary.
* @param defaultValue The value to return if the dictionary item is null.
* @return The long value.
*/
public long getLong( String[] keyList, long defaultValue )
{
long retval = defaultValue;
COSBase obj = getDictionaryObject( keyList );
if( obj != null && obj instanceof COSNumber)
{
retval = ((COSNumber)obj).longValue();
}
return retval;
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be an integer. If the dictionary value is null then the
* default Value will be returned.
*
* @param key The key to the item in the dictionary.
* @param defaultValue The value to return if the dictionary item is null.
* @return The integer value.
*/
public long getLong( String key, long defaultValue )
{
return getLong( COSName.getPDFName( key ), defaultValue );
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be an integer. If the dictionary value is null then the
* default Value will be returned.
*
* @param key The key to the item in the dictionary.
* @param defaultValue The value to return if the dictionary item is null.
* @return The integer value.
*/
public long getLong( COSName key, long defaultValue )
{
long retval = defaultValue;
COSBase obj = getDictionaryObject( key );
if( obj != null && obj instanceof COSNumber)
{
retval = ((COSNumber)obj).longValue();
}
return retval;
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be an float. -1 is returned if there is no value.
*
* @param key The key to the item in the dictionary.
* @return The float value.
*/
public float getFloat( String key )
{
return getFloat( COSName.getPDFName( key ), -1 );
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be an float. -1 is returned if there is no value.
*
* @param key The key to the item in the dictionary.
* @return The float value.
*/
public float getFloat( COSName key )
{
return getFloat( key, -1 );
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be a float. If the dictionary value is null then the
* default Value will be returned.
*
* @param key The key to the item in the dictionary.
* @param defaultValue The value to return if the dictionary item is null.
* @return The float value.
*/
public float getFloat( String key, float defaultValue )
{
return getFloat( COSName.getPDFName( key ), defaultValue );
}
/**
* This is a convenience method that will get the dictionary object that
* is expected to be an float. If the dictionary value is null then the
* default Value will be returned.
*
* @param key The key to the item in the dictionary.
* @param defaultValue The value to return if the dictionary item is null.
* @return The float value.
*/
public float getFloat( COSName key, float defaultValue )
{
float retval = defaultValue;
COSBase obj = getDictionaryObject( key );
if( obj != null && obj instanceof COSNumber)
{
retval = ((COSNumber)obj).floatValue();
}
return retval;
}
/**
* This will remove an item for the dictionary. This
* will do nothing of the object does not exist.
*
* @param key The key to the item to remove from the dictionary.
*/
public void removeItem( COSName key )
{
items.remove( key );
}
/**
* This will do a lookup into the dictionary.
*
* @param key The key to the object.
*
* @return The item that matches the key.
*/
public COSBase getItem( COSName key )
{
return items.get( key );
}
/**
* This will get the keys for all objects in the dictionary in the sequence that
* they were added.
*
* @deprecated Use the {@link #entrySet()} method instead.
* @return a list of the keys in the sequence of insertion
*/
public List<COSName> keyList()
{
return new ArrayList<COSName>(items.keySet());
}
/**
* Returns the names of the entries in this dictionary. The returned
* set is in the order the entries were added to the dictionary.
*
* @since Apache PDFBox 1.1.0
* @return names of the entries in this dictionary
*/
public Set<COSName> keySet()
{
return items.keySet();
}
/**
* Returns the name-value entries in this dictionary. The returned
* set is in the order the entries were added to the dictionary.
*
* @since Apache PDFBox 1.1.0
* @return name-value entries in this dictionary
*/
public Set<Map.Entry<COSName, COSBase>> entrySet()
{
return items.entrySet();
}
/**
* This will get all of the values for the dictionary.
*
* @return All the values for the dictionary.
*/
public Collection<COSBase> getValues()
{
return items.values();
}
/**
* visitor pattern double dispatch method.
*
* @param visitor The object to notify when visiting this object.
* @return The object that the visitor returns.
*
* @throws COSVisitorException If there is an error visiting this object.
*/
public Object accept(ICOSVisitor visitor) throws COSVisitorException
{
return visitor.visitFromDictionary(this);
}
/**
* This will add all of the dictionarys keys/values to this dictionary.
* Only called when adding keys to a trailer that already exists.
*
* @param dic The dic to get the keys from.
*/
public void addAll( COSDictionary dic )
{
for( Map.Entry<COSName, COSBase> entry : dic.entrySet() )
{
/*
* If we're at a second trailer, we have a linearized
* pdf file, meaning that the first Size entry represents
* all of the objects so we don't need to grab the second.
*/
if(!entry.getKey().getName().equals("Size")
|| !items.containsKey(COSName.getPDFName("Size")))
{
setItem( entry.getKey(), entry.getValue() );
}
}
}
/**
* This will add all of the dictionarys keys/values to this dictionary, but only
* if they don't already exist. If a key already exists in this dictionary then
* nothing is changed.
*
* @param dic The dic to get the keys from.
*/
public void mergeInto( COSDictionary dic )
{
for( Map.Entry<COSName, COSBase> entry : dic.entrySet() )
{
if( getItem( entry.getKey() ) == null )
{
setItem( entry.getKey(), entry.getValue() );
}
}
}
/**
* Nice method, gives you every object you want
* Arrays works properly too. Try "P/Annots/[k]/Rect"
* where k means the index of the Annotsarray.
*
* @param objPath the relative path to the object.
* @return the object
*/
public COSBase getObjectFromPath(String objPath)
{
COSBase retval = null;
String[] path = objPath.split(PATH_SEPARATOR);
retval = this;
for (int i = 0; i < path.length; i++)
{
if(retval instanceof COSArray)
{
int idx = new Integer(path[i].replaceAll("\\[","").replaceAll("\\]","")).intValue();
retval = ((COSArray)retval).getObject(idx);
}
else if (retval instanceof COSDictionary)
{
retval = ((COSDictionary)retval).getDictionaryObject( path[i] );
}
}
return retval;
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
StringBuilder retVal = new StringBuilder("COSDictionary{");
for(COSName key : items.keySet()) {
retVal.append("(");
retVal.append(key);
retVal.append(":");
if(getDictionaryObject(key) != null)
retVal.append(getDictionaryObject(key).toString());
else
retVal.append("<null>");
retVal.append(") ");
}
retVal.append("}");
return retVal.toString();
}
}