org.docx4j.model.fields.docproperty.DocPropertyResolver Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of docx4j Show documentation
Show all versions of docx4j Show documentation
docx4j is a library which helps you to work with the Office Open
XML file format as used in docx
documents, pptx presentations, and xlsx spreadsheets.
package org.docx4j.model.fields.docproperty;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.docx4j.docProps.core.dc.elements.SimpleLiteral;
import org.docx4j.model.fields.FieldFormattingException;
import org.docx4j.model.fields.FieldValueException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.DocPropsCustomPart;
public class DocPropertyResolver {
private static Logger log = LoggerFactory.getLogger(DocPropertyResolver.class);
/* Needs access to the following parts:
- core props
- custom props
- extended props
But not CoverPageProps (if available), since those are
accessible via content control data binding, but not
DOCPROPERTY field (at least via Word 2010 UI).
Notes:
DOCPROPERTY Pages \* MERGEFORMAT
--> 54
DOCPROPERTY PAGES / NUMPAGES \* MERGEFORMAT
!-> NOT FOUND!
*/
private DocPropsCustomPart docPropsCustomPart;
private org.docx4j.docProps.core.CoreProperties coreProperties;
private org.docx4j.docProps.extended.Properties extendedProperties;
private final static String BUILT_IN_FIELDS_CORE = "Author, Comments, CreateTime, LastPrinted, LastSavedBy, LastSavedTime, RevisionNumber, Subject, Title";
private final static String BUILT_IN_FIELDS_EXTENDED = "Characters, CharactersWithSpaces, Company, Lines, NameofApplication, Pages, Paragraphs, Security, Template, TotalEditingTime, Words";
private final static String BUILT_IN_FIELDS_UNSUPPORTED = "Bytes";
public DocPropertyResolver(WordprocessingMLPackage wordMLPackage) {
coreProperties = wordMLPackage.getDocPropsCorePart() == null ? null : wordMLPackage.getDocPropsCorePart().getJaxbElement();
extendedProperties = wordMLPackage.getDocPropsExtendedPart() == null ? null : wordMLPackage.getDocPropsExtendedPart().getJaxbElement();
docPropsCustomPart = wordMLPackage.getDocPropsCustomPart();
}
public String getValue(String key) throws FieldFormattingException, FieldValueException {
Object value = null;
// Most likely a custom value, so try this first
if (docPropsCustomPart!=null) {
value = docPropsCustomPart.getProperty(key);
}
if (BUILT_IN_FIELDS_CORE.contains(key)) {
value = getCoreValue(key);
} else if (BUILT_IN_FIELDS_EXTENDED.contains(key)) {
value = getExtendedValue(key);
} else if (BUILT_IN_FIELDS_UNSUPPORTED.contains(key)) {
log.warn("No support for DOCPROPERTY field " + key);
return null;
}
if (value==null) {
throw new FieldValueException("No value found for DOCPROPERTY " + key);
} else {
if (value instanceof String) {
return (String)value;
} else if (value instanceof Integer) {
return ((Integer)value).toString();
} else {
throw new FieldFormattingException("TODO: convert " + value.getClass().getName() + " to string");
}
}
}
private Object getCoreValue(String key) {
if ("Author".equals(key)) return getFirstValue(coreProperties.getCreator());
else if ("Comments".equals(key)) return getFirstValue(coreProperties.getDescription().getValue());
else if ("CreateTime".equals(key)) return getFirstValue(coreProperties.getCreated());
else if ("LastPrinted".equals(key)) return coreProperties.getLastPrinted(); // XMLGregorianCalendar
else if ("LastSavedBy".equals(key)) return getFirstValue(coreProperties.getModified());
else if ("LastSavedTime".equals(key)) return coreProperties.getLastModifiedBy();
else if ("RevisionNumber".equals(key)) return coreProperties.getRevision();
else if ("Subject".equals(key)) return getFirstValue(coreProperties.getSubject());
else if ("Title".equals(key)) return getFirstValue(coreProperties.getTitle().getValue());
else {
log.error("Handle " + key);
return null;
}
}
private Object getExtendedValue(String key) {
if ("Characters".equals(key)) return extendedProperties.getCharacters();
else if ("CharactersWithSpaces".equals(key)) return extendedProperties.getCharactersWithSpaces();
else if ("Company".equals(key)) return extendedProperties.getCompany();
else if ("HyperlinkBase".equals(key)) return extendedProperties.getHyperlinkBase();
else if ("Lines".equals(key)) return extendedProperties.getLines();
else if ("NameofApplication".equals(key)) return extendedProperties.getApplication();
else if ("Pages".equals(key)) return extendedProperties.getPages();
else if ("Paragraphs".equals(key)) return extendedProperties.getParagraphs();
else if ("Security".equals(key)) return extendedProperties.getDocSecurity();
else if ("Template".equals(key)) return extendedProperties.getTemplate();
else if ("TotalEditingTime".equals(key)) return extendedProperties.getTotalTime();
else if ("Words".equals(key)) return extendedProperties.getWords();
else {
log.error("Handle " + key);
return null;
}
}
private String getFirstValue(SimpleLiteral simpleLiteral) {
if (simpleLiteral.getContent().size()==0) {
return null;
} else {
return simpleLiteral.getContent().get(0);
}
}
}