📄 cosdictionary.java
字号:
/**
* Copyright (c) 2003-2005, www.pdfbox.org
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of pdfbox; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://www.pdfbox.org
*
*/
package org.pdfbox.cos;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Iterator;
import org.pdfbox.exceptions.COSVisitorException;
import org.pdfbox.pdmodel.common.COSObjectable;
import org.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 = "/";
/**
* These are all of the items in the dictionary.
*/
private Map items = new HashMap();
/**
* Used to store original sequence of keys, for testing.
*/
private List keys = new ArrayList();
/**
* 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 = new HashMap( dict.items );
keys = new ArrayList( dict.keys );
}
/**
* @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 )
{
COSName key = null;
Iterator iter = items.entrySet().iterator();
while( key == null && iter.hasNext() )
{
Map.Entry next = (Map.Entry)iter.next();
Object nextValue = next.getValue();
if( nextValue.equals( value ) ||
(nextValue instanceof COSObject &&
((COSObject)nextValue).getObject().equals( value))
)
{
key = (COSName)next.getKey();
}
}
return key;
}
/**
* This will return the number of elements in this dictionary.
*
* @return The number of elements in the dictionary.
*/
public int size()
{
return keys.size();
}
/**
* This will clear all items in the map.
*/
public void clear()
{
items.clear();
keys.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.
*/
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 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 = (COSBase)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
{
if (!items.containsKey(key))
{
// insert only if not already there
keys.add(key);
}
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 );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -