in tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/MetadataExtractor.java [160:241]
private void extractMetadata(POIXMLProperties.CustomProperties properties, Metadata metadata) {
org.openxmlformats.schemas.officeDocument.x2006.customProperties.CTProperties props =
properties.getUnderlyingProperties();
for (int i = 0; i < props.sizeOfPropertyArray(); i++) {
CTProperty property = props.getPropertyArray(i);
String val = null;
Date date = null;
if (property.isSetLpwstr()) {
val = property.getLpwstr();
} else if (property.isSetLpstr()) {
val = property.getLpstr();
} else if (property.isSetDate()) {
date = property.getDate().getTime();
} else if (property.isSetFiletime()) {
date = property.getFiletime().getTime();
} else if (property.isSetBool()) {
val = Boolean.toString(property.getBool());
}
// Integers
else if (property.isSetI1()) {
val = Integer.toString(property.getI1());
} else if (property.isSetI2()) {
val = Integer.toString(property.getI2());
} else if (property.isSetI4()) {
val = Integer.toString(property.getI4());
} else if (property.isSetI8()) {
val = Long.toString(property.getI8());
} else if (property.isSetInt()) {
val = Integer.toString(property.getInt());
}
// Unsigned Integers
else if (property.isSetUi1()) {
val = Integer.toString(property.getUi1());
} else if (property.isSetUi2()) {
val = Integer.toString(property.getUi2());
} else if (property.isSetUi4()) {
val = Long.toString(property.getUi4());
} else if (property.isSetUi8()) {
val = property.getUi8().toString();
} else if (property.isSetUint()) {
val = Long.toString(property.getUint());
}
// Reals
else if (property.isSetR4()) {
val = Float.toString(property.getR4());
} else if (property.isSetR8()) {
val = Double.toString(property.getR8());
} else if (property.isSetDecimal()) {
BigDecimal d = property.getDecimal();
if (d == null) {
val = null;
} else {
val = d.toPlainString();
}
} else if (property.isSetArray()) {
// TODO Fetch the array values and output
} else if (property.isSetVector()) {
// TODO Fetch the vector values and output
} else if (property.isSetBlob() || property.isSetOblob()) {
// TODO Decode, if possible
} else if (property.isSetStream() || property.isSetOstream() ||
property.isSetVstream()) {
// TODO Decode, if possible
} else if (property.isSetStorage() || property.isSetOstorage()) {
// TODO Decode, if possible
} else {
// This type isn't currently supported yet, skip the property
}
String propName = "custom:" + property.getName();
if (date != null) {
Property tikaProp = Property.externalDate(propName);
metadata.set(tikaProp, date);
} else if (val != null) {
metadata.set(propName, val);
}
}
}