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() ?

Reply via email to