/*
* Copyright 2006-2012 ICEsoft Technologies Inc.
*
* Licensed 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.icepdf.core.pobjects;
import org.icepdf.core.pobjects.fonts.ofont.Encoding;
import org.icepdf.core.pobjects.security.SecurityManager;
import org.icepdf.core.util.Library;
import java.util.Hashtable;
/**
* <p>This class represents the data stored in a File trailers optional "info"
* entry.</p>
* <p/>
* <p>Any entry whose value is not known should be omitted from the dictionary,
* rather than included with an empty string as its value.</p>
* <p/>
* <p>Some plug-in extensions may choose to permit searches on the contents of the
* document information dictionary. To facilitate browsing and editing, all keys
* in the dictionary are fully spelled out, not abbreviated. New keys should be
* chosen with care so that they make sense to users.</p>
*
* @since 1.1
*/
public class PInfo extends Dictionary {
// security manager need for decrypting strings.
private SecurityManager securityManager;
/**
* Create a new instance of a <code>PInfo</code> object.
*
* @param library document library
* @param entries entries for this object dictionary.
*/
public PInfo(Library library, Hashtable entries){
super(library, entries);
securityManager = library.getSecurityManager();
}
/**
* Gets the value of the custom extension specified by <code>name</code>.
*
* @param name som plug-in extensions name.
* @return value of the plug-in extension.
*/
public Object getCustomExtension(String name) {
Object value = library.getObject(entries, name);
if (value != null && value instanceof StringObject) {
StringObject text = (StringObject) value;
return cleanString(text.getDecryptedLiteralString(securityManager));
}
return value;
}
/**
* Gets the title of the document.
*
* @return the documents title.
*/
public String getTitle() {
Object value = library.getObject(entries, "Title");
if (value != null && value instanceof StringObject) {
StringObject text = (StringObject) value;
return cleanString(text.getDecryptedLiteralString(securityManager));
}
else if (value instanceof String) {
return (String) value;
}
return null;
}
/**
* Gets the name of the person who created the document.
*
* @return author name.
*/
public String getAuthor() {
Object value = library.getObject(entries, "Author");
if (value != null && value instanceof StringObject) {
StringObject text = (StringObject) value;
return cleanString(text.getDecryptedLiteralString(securityManager));
}
else if (value instanceof String) {
return (String) value;
}
return null;
}
/**
* Gets the subject of the document.
*
* @return documents subject.
*/
public String getSubject() {
Object value = library.getObject(entries, "Subject");
if (value != null && value instanceof StringObject) {
StringObject text = (StringObject) value;
return cleanString(text.getDecryptedLiteralString(securityManager));
}
else if (value instanceof String) {
return (String) value;
}
return null;
}
/**
* Gets the keywords associated with the document.
*
* @return documents keywords.
*/
public String getKeywords() {
Object value = library.getObject(entries, "Keywords");
if (value != null && value instanceof StringObject) {
StringObject text = (StringObject) value;
return cleanString(text.getDecryptedLiteralString(securityManager));
}
else if (value instanceof String) {
return (String) value;
}
return null;
}
/**
* Gets the name of the application. If the PDF document was converted from
* another format that <b>created</b> the original document.
*
* @return creator name.
*/
public String getCreator() {
Object value = library.getObject(entries, "Creator");
if (value != null && value instanceof StringObject) {
StringObject text = (StringObject) value;
return cleanString(text.getDecryptedLiteralString(securityManager));
}
else if (value instanceof String) {
return (String) value;
}
return null;
}
/**
* Gets the name of the application. If the PDF document was converted from
* another format that <b>converted</b> the original document.
*
* @return producer name.
*/
public String getProducer() {
Object value = library.getObject(entries, "Producer");
if (value != null && value instanceof StringObject) {
StringObject text = (StringObject) value;
return cleanString(text.getDecryptedLiteralString(securityManager));
}
else if (value instanceof String) {
return (String) value;
}
return null;
}
/**
* Gets the date and time the document was created.
*
* @return creation date.
*/
public PDate getCreationDate() {
Object value = library.getObject(entries, "CreationDate");
if (value != null && value instanceof StringObject) {
StringObject text = (StringObject) value;
return new PDate(securityManager, text.getDecryptedLiteralString(securityManager));
}
return null;
}
/**
* Gets the date and time the document was most recently modified.
*
* @return modification date.
*/
public PDate getModDate() {
Object value = library.getObject(entries, "ModDate");
if (value != null && value instanceof StringObject) {
StringObject text = (StringObject) value;
return new PDate(securityManager, text.getDecryptedLiteralString(securityManager));
}
return null;
}
/**
* Get the name object indicating whether the document has been modified to
* include trapping information:
* <ul>
* <li><b>False</b> - The document has not yet been trapped; any desired
* trapping must still be done.</li>
* <li><b>Unknown</b> - (default) Either it is unknown whether the document has
* been trapped or it has been partly but not yet fully
* trapped; some additional trapping may still be needed.</li>
* </ul>
*
* @return trapped name.
*/
public String getTrappingInformation() {
Object value = library.getObject(entries, "Trapped");
if (value != null && value instanceof StringObject) {
StringObject text = (StringObject) value;
return cleanString(text.getDecryptedLiteralString(securityManager));
}
else if (value instanceof String) {
return (String) value;
}
return null;
}
/**
* Utility method for removing extra characters associated with 4 byte
* characters codes.
* @param text string to clean
* @return cleaned
*/
private String cleanString(String text) {
if (text != null && text.length() > 0) {
if (((int) text.charAt(0)) == 254 && ((int) text.charAt(1)) == 255) {
StringBuilder sb1 = new StringBuilder();
// strip and white space, as the will offset the below algorithm
// which assumes the string is made up of two byte chars.
String hexTmp = "";
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
if (!((c == '\t') || (c == '\r') || (c == '\n'))) {
hexTmp = hexTmp + text.charAt(i);
}
}
byte title1[] = hexTmp.getBytes();
for (int i = 2; i < title1.length; i += 2) {
try {
int b1 = ((int) title1[i]) & 0xFF;
int b2 = ((int) title1[i + 1]) & 0xFF;
sb1.append((char) (b1 * 256 + b2));
} catch (Exception ex) {
// intentionally left empty
}
}
text = sb1.toString();
} else {
StringBuilder sb = new StringBuilder();
Encoding enc = Encoding.getPDFDoc();
for (int i = 0; i < text.length(); i++) {
sb.append(enc.get(text.charAt(i)));
}
text = sb.toString();
}
return text;
} else {
return "";
}
}
}