Dear pdfbox team,

I am working on an application (JabRef) that has so far relied on pdfbox and jempbox for pdf and xmp handling. I am trying to update to pdfbox 2.0.0 and to replace jempbox with xmpbox and am having some trouble.

The problem is that we are encoding custom non-standard data into the xmp meta data, which can be serialized just fine with jempbox (using the class XMLUtil). I can serialize the data just as well with xmpbox (using XmpSerializer), but fail to get parsing working (with DomXmpParser). Maybe I am overlooking something very trivial or maybe xmpbox does not support custom namespaces? Is there any way in which I can make DomXmpParser aware of my custom namespace?

Below please find some example data, which I would like to be able to parse and the resulting stacktrace. The exception is: org.apache.xmpbox.xml.XmpParsingException: Cannot find a definition for the namespace http://jabref.sourceforge.net/bibteXMP/

My code for parsing is:
// testData is a String with xmp data
InputStream is = new ByteArrayInputStream(testData.getBytes(StandardCharsets.UTF_8));
DomXmpParser parser = new DomXmpParser();
XMPMetadata meta = parser.parse(is);

Any help will be very much appreciated.

Best regards

Jörg Lenhard

<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?><x:xmpmeta xmlns:x="adobe:ns:meta/">
  <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";>
<rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1/"; rdf:about="">
      <dc:description>
        <rdf:Alt>
<rdf:li xml:lang="x-default">The success of the Linux operating system has demonstrated the viability of an alternative form of software development � open source software � that challenges traditional assumptions about software markets. Understanding what drives open source developers to participate in open source projects is crucial for assessing the impact of open source software. This article identifies two broad types of motivations that account for their participation in open source projects. The first category includes internal factors such as intrinsic motivation and altruism, and the second category focuses on external rewards such as expected future returns and personal needs. This article also reports the results of a survey administered to open source programmers.</rdf:li>
        </rdf:Alt>
      </dc:description>
      <dc:creator>
        <rdf:Seq>
          <rdf:li>Kelly Clarkson</rdf:li>
          <rdf:li>Ozzy Osbourne</rdf:li>
        </rdf:Seq>
      </dc:creator>
      <dc:relation>
        <rdf:Bag>
          <rdf:li>bibtex/bibtexkey/Clarkson06</rdf:li>
          <rdf:li>bibtex/booktitle/Catch-22</rdf:li>
<rdf:li>bibtex/journal/International Journal of High Fidelity</rdf:li>
          <rdf:li>bibtex/pdf/YeKis03 - Towards.pdf</rdf:li>
        </rdf:Bag>
      </dc:relation>
      <dc:contributor>
        <rdf:Bag>
          <rdf:li>Huey Duck</rdf:li>
          <rdf:li>Dewey Duck</rdf:li>
          <rdf:li>Louie Duck</rdf:li>
        </rdf:Bag>
      </dc:contributor>
      <dc:subject>
        <rdf:Bag>
          <rdf:li>peanut</rdf:li>
          <rdf:li>butter</rdf:li>
          <rdf:li>jelly</rdf:li>
        </rdf:Bag>
      </dc:subject>
      <dc:title>
        <rdf:Alt>
          <rdf:li xml:lang="x-default">Hypersonic ultra-sound</rdf:li>
        </rdf:Alt>
      </dc:title>
      <dc:date>
        <rdf:Seq>
          <rdf:li>1982-07</rdf:li>
        </rdf:Seq>
      </dc:date>
      <dc:format>application/pdf</dc:format>
      <dc:type>
        <rdf:Bag>
          <rdf:li>InProceedings</rdf:li>
        </rdf:Bag>
      </dc:type>
    </rdf:Description>
<rdf:Description xmlns:bibtex="http://jabref.sourceforge.net/bibteXMP/"; rdf:about=""> <bibtex:abstract>The success of the Linux operating system has demonstrated the viability of an alternative form of software development � open source software � that challenges traditional assumptions about software markets. Understanding what drives open source developers to participate in open source projects is crucial for assessing the impact of open source software. This article identifies two broad types of motivations that account for their participation in open source projects. The first category includes internal factors such as intrinsic motivation and altruism, and the second category focuses on external rewards such as expected future returns and personal needs. This article also reports the results of a survey administered to open source programmers.</bibtex:abstract>
      <bibtex:author>
        <rdf:Seq>
          <rdf:li>Kelly Clarkson</rdf:li>
          <rdf:li>Ozzy Osbourne</rdf:li>
        </rdf:Seq>
      </bibtex:author>
      <bibtex:bibtexkey>Clarkson06</bibtex:bibtexkey>
      <bibtex:booktitle>Catch-22</bibtex:booktitle>
      <bibtex:editor>
        <rdf:Seq>
          <rdf:li>Huey Duck</rdf:li>
          <rdf:li>Dewey Duck</rdf:li>
          <rdf:li>Louie Duck</rdf:li>
        </rdf:Seq>
      </bibtex:editor>
<bibtex:journal>International Journal of High Fidelity</bibtex:journal>
      <bibtex:keywords>peanut, butter, jelly</bibtex:keywords>
      <bibtex:month>#jul#</bibtex:month>
      <bibtex:pdf>YeKis03 - Towards.pdf</bibtex:pdf>
      <bibtex:title>Hypersonic ultra-sound</bibtex:title>
      <bibtex:year>1982</bibtex:year>
      <bibtex:entrytype>inproceedings</bibtex:entrytype>
    </rdf:Description>
  </rdf:RDF>
</x:xmpmeta><?xpacket end="w"?>

The exception:

Cannot find a definition for the namespace http://jabref.sourceforge.net/bibteXMP/ org.apache.xmpbox.xml.XmpParsingException: Cannot find a definition for the namespace http://jabref.sourceforge.net/bibteXMP/ at org.apache.xmpbox.xml.DomXmpParser.checkPropertyDefinition(DomXmpParser.java:853) at org.apache.xmpbox.xml.DomXmpParser.parseChildrenAsProperties(DomXmpParser.java:290) at org.apache.xmpbox.xml.DomXmpParser.parseDescriptionRoot(DomXmpParser.java:234)
    at org.apache.xmpbox.xml.DomXmpParser.parse(DomXmpParser.java:198)
at net.sf.jabref.logic.xmp.XMPUtilTest.testReadWriteDC(XMPUtilTest.java:902)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:112) at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:56) at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:66) at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32) at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
    at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:109)
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:360) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54) at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)


Reply via email to