public abstract class RootMetadataPackage extends MetadataPackage
Represents an entry point to all metadata packages presented in a particular file.
Modifier and Type | Method and Description |
---|---|
int |
addProperties(Specification specification,
PropertyValue value)
Adds known metadata properties satisfying the specification.
|
IReadOnlyList<MetadataProperty> |
findProperties(Specification specification)
Finds the metadata properties satisfying a specification.
|
FileTypePackage |
getFileType()
Gets the file type metadata package.
|
int |
removeProperties(Specification specification)
Removes metadata properties satisfying a specification.
|
int |
sanitize()
Removes writable metadata properties from the package.
|
int |
setProperties(Specification specification,
PropertyValue value)
Sets known metadata properties satisfying the specification.
|
int |
updateProperties(Specification specification,
PropertyValue value)
Updates known metadata properties satisfying a specification.
|
contains, get_Item, getCount, getKeys, getKnowPropertyDescriptors, getMetadataType, iterator
public final FileTypePackage getFileType()
Gets the file type metadata package.
public IReadOnlyList<MetadataProperty> findProperties(Specification specification)
Finds the metadata properties satisfying a specification. The search is recursive so it affects all nested packages as well.
findProperties
in class MetadataPackage
specification
- A function to test each metadata property for a condition.
This example demonstrates how to search for specific metadata properties using tags.
// Constants.InputPptx is an absolute or relative path to your document. Ex: @"C:\Docs\source.pptx" try (Metadata metadata = new Metadata(Constants.InputPptx)) { // Fetch all the properties satisfying the predicate: // property contains the name of the last document editor OR the date/time the document was last modified IReadOnlyList<MetadataProperty> properties = metadata.findProperties( new ContainsTagSpecification(Tags.getPerson().getEditor()).or(new ContainsTagSpecification(Tags.getTime().getModified()))); for (MetadataProperty property : properties) { System.out.println(String.format("Property name: %s, Property value: %s", property.getName(), property.getValue())); } }
public int updateProperties(Specification specification, PropertyValue value)
Updates known metadata properties satisfying a specification. The operation is recursive so it affects all nested packages as well.
updateProperties
in class MetadataPackage
specification
- A specification to test each metadata property for a condition.value
- A new value for the filtered properties.
This example demonstrates how to update existing metadata properties by various criteria regardless of the file format.
public class UpdatingMetadata { public static void run() { Date threeDaysAgo = new Date(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(3)); File folder = new File(Constants.InputPath); for (File file : folder.listFiles()) { try (Metadata metadata = new Metadata(file.getAbsolutePath())) { if (metadata.getFileFormat() != FileFormat.Unknown && !metadata.getDocumentInfo().isEncrypted()) { System.out.println(); System.out.println(file.getName()); // Update the file creation date/time if the existing value is older than 3 days int affected = metadata.updateProperties(new ContainsTagSpecification(Tags.getTime().getCreated()).and( new OfTypeSpecification(MetadataPropertyType.DateTime)).and( new UpdatingMetadata().new DateBeforeSpecification(threeDaysAgo)), new PropertyValue(new Date())); System.out.println(String.format("Affected properties: %s", affected)); metadata.save(Constants.OutputPath + "output." + FilenameUtils.getExtension(file.getName())); } } } } // Define your own specifications to filter metadata properties public class DateBeforeSpecification extends Specification { public DateBeforeSpecification(Date date) { setValue(date); } public final Date getValue() { return auto_Value; } private void setValue(Date value) { auto_Value = value; } private Date auto_Value; public boolean isSatisfiedBy(MetadataProperty candidate) { Date date = candidate.getValue().toClass(Date.class); if (date != null) { return date.before(getValue()); } return false; } } }
public int addProperties(Specification specification, PropertyValue value)
Adds known metadata properties satisfying the specification. The operation is recursive so it affects all nested packages as well.
addProperties
in class MetadataPackage
specification
- A specification to test each metadata property for a condition.value
- A value for the picked properties.
This example demonstrates how to add some missing metadata properties to a file regardless of its format.
File folder = new File(Constants.InputPath); for (File file : folder.listFiles()) { try (Metadata metadata = new Metadata(file.getAbsolutePath())) { if (metadata.getFileFormat() != FileFormat.Unknown && !metadata.getDocumentInfo().isEncrypted()) { System.out.println(); System.out.println(file.getName()); // Add a property containing the file last printing date if it's missing // Note that the property will be added to metadata packages that satisfy the following criteria: // 1) Only existing metadata packages will be affected. No new packages are added during this operation // 2) There should be a known metadata property in the package structure that fits the search condition but is actually missing in the package. // All properties supported by a certain package are usually defined in the specification of a particular metadata standard int affected = metadata.addProperties(new ContainsTagSpecification(Tags.getTime().getPrinted()), new PropertyValue(new Date())); System.out.println(String.format("Affected properties: %s", affected)); metadata.save(Constants.OutputPath + "output." + FilenameUtils.getExtension(file.getName())); } } }
public int setProperties(Specification specification, PropertyValue value)
Sets known metadata properties satisfying the specification.
The operation is recursive so it affects all nested packages as well.
This method is a combination of AddProperties
and UpdateProperties
.
If an existing property satisfies the specification its value is updated.
If there is a known property missing in the package that satisfies the specification it is added to the package.
setProperties
in class MetadataPackage
specification
- A specification to test each metadata property for a condition.value
- A new value for the filtered properties.
This example demonstrates how to set specific metadata properties using different criteria.
// Constants.InputVsdx is an absolute or relative path to your document. Ex: @"C:\Docs\source.vsdx" try (Metadata metadata = new Metadata(Constants.InputVsdx)) { // Set the value of each property that satisfies the predicate: // property contains the date/time the document was created OR modified int affected = metadata.setProperties( new ContainsTagSpecification(Tags.getTime().getCreated()).or(new ContainsTagSpecification(Tags.getTime().getModified())), new PropertyValue(new Date())); System.out.println(String.format("Properties set: %s", affected)); metadata.save(Constants.OutputVsdx); }
public int sanitize()
Removes writable metadata properties from the package. The operation is recursive so it affects all nested packages as well.
sanitize
in class MetadataPackage
public int removeProperties(Specification specification)
Removes metadata properties satisfying a specification.
removeProperties
in class MetadataPackage
specification
- A specification to test each metadata property for a condition.
This example demonstrates how to remove specific metadata properties using various criteria.
public class RemoveMetadataProperties { public static void run() { // Constants.InputDocx is an absolute or relative path to your document. Ex: @"C:\Docs\source.docx" try (Metadata metadata = new Metadata(Constants.InputDocx)) { // Remove all the properties satisfying the predicate: // property contains the name of the document author OR // it refers to the last editor OR // the property value is a string that is equal to the given string "John" (to remove any mentions of John from the detected metadata) int affected = metadata.removeProperties( new ContainsTagSpecification(Tags.getPerson().getCreator()).or( new ContainsTagSpecification(Tags.getPerson().getEditor())).or( new OfTypeSpecification(MetadataPropertyType.String).and(new RemoveMetadataProperties().new WithValueSpecification("John")))); System.out.println(String.format("Properties removed: %s", affected)); metadata.save(Constants.OutputDocx); } } // Define your own specifications to filter metadata properties public class WithValueSpecification extends Specification { public WithValueSpecification(Object value) { setValue(value); } public final Object getValue() { return auto_Value; } private void setValue(Object value) { auto_Value = value; } private Object auto_Value; public boolean isSatisfiedBy(MetadataProperty candidate) { return candidate.getValue().getRawValue().equals(getValue()); } } }
Copyright © 2020. All rights reserved.