I have created a custom metadata schema as follows.
// MyMetadata.java
public class MyMetadata extends XMPMetadata {
public MyMetadata() {
super();
}
public MySchema createAndAddMySchema() {
MySchema schema = new MySchema(this);
addSchema(schema);
return schema;
}
public MySchema getMySchema() {
return (MySchema) getSchema(MySchema.class);
}
}
// MySchema.java
public class MySchema extends XMPSchema {
public static final String NAMESPACE = "http://www.mydomain.com/";
public MySchema(XMPMetadata parent) {
super(parent, NAMESPACE, "userdefined");
}
public void setId(String id) {
setTextPropertyValueAsSimple("id", id);
}
public String getId() {
return getUnqualifiedTextPropertyValue("id");
}
// ......
}
// main.kt
// Here I attach the metadata to an xobject and use
PDPageContentStream to draw the xobject form
fun attachMetadata(...) {
...
val lu = LayerUtility(wmdoc)
val xobject = lu.importPageAsForm(wmdoc, wmpage)
// attach metadata to the xobject
val metadata = MyMetadata()
val mySchema = metadata.createAndAddMySchema()
mySchema.Id = "1234"
val metadataStream = PDMetadata(outdoc)
val serializer = XmpSerializer()
val baos = ByteArrayOutputStream()
serializer.serialize(metadata, baos, true)
metadataStream.importXMPMetadata( baos.toByteArray() )
xobject.cosObject.setItem(COSName.METADATA, metadataStream)
for (i in 0 .. (outdoc.numberOfPages-1)) {
val cspg = PDPageContentStream(outdoc, outdoc.getPage(i),
PDPageContentStream.AppendMode.APPEND, true)
cspg.drawForm(xobject)
cspg.close()
}
// Save and close
inpdoc.close()
outdoc.save(outputdoc)
outdoc.close()
}
// When I attempt to read the metadata from the xobject I get the error:
// Exception in thread "main"
org.apache.xmpbox.xml.XmpParsingException: Cannot find a definition
for the namespace
fun extract(path: String) {
val doc = PDDocument.load(File(path))
val page = doc.getPage(0)
for (name in page.resources.xObjectNames) {
val xobj = page.resources.getXObject(name)
val xmeta =
xobj.cosObject.getDictionaryObject(COSName.METADATA) as COSStream
val xmpParser = DomXmpParser()
val parsed = xmpParser.parse(xmeta.createInputStream()) // <-
Error Occurs here
val mySchema = parsed.getSchema(MySchema::class.java) as MySchema
}
}
How can I add my schema to the DomXmpParser so I can read the metadata
I attached inside attachMetadata() ?