Author: tilman
Date: Sat Dec 27 19:41:47 2025
New Revision: 1930898

Log:
PDFBOX-6135: fallback to text for undefined property in lenient mode + test

Modified:
   pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java
   pdfbox/trunk/xmpbox/src/test/java/org/apache/xmpbox/xml/DomXmpParserTest.java

Modified: 
pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java
==============================================================================
--- pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java   
Sat Dec 27 19:41:42 2025        (r1930897)
+++ pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java   
Sat Dec 27 19:41:47 2025        (r1930898)
@@ -824,11 +824,15 @@ public class DomXmpParser
             PropertyType type = pm.getPropertyType(name);
             if (type == null)
             {
-                // not defined
-                throw new XmpParsingException(ErrorType.NoType, "Type '" + 
prefix + ":" + name + "' not defined in "
-                        + liDescriptionElementChild.getNamespaceURI());
+                if (strictParsing)
+                {
+                    throw new XmpParsingException(ErrorType.NoType, "Type '" + 
prefix + ":" + name + "' not defined in "
+                            + liDescriptionElementChild.getNamespaceURI());
+                }
+                // PDFBOX-6135: Default to text if no type is found
+                type = TypeMapping.createPropertyType(Types.Text, 
Cardinality.Simple);
             }
-            else if (type.card().isArray())
+            if (type.card().isArray())
             {
                 ArrayProperty array = tm.createArrayProperty(namespace, 
prefix, name, type.card());
                 ast.getContainer().addProperty(array);

Modified: 
pdfbox/trunk/xmpbox/src/test/java/org/apache/xmpbox/xml/DomXmpParserTest.java
==============================================================================
--- 
pdfbox/trunk/xmpbox/src/test/java/org/apache/xmpbox/xml/DomXmpParserTest.java   
    Sat Dec 27 19:41:42 2025        (r1930897)
+++ 
pdfbox/trunk/xmpbox/src/test/java/org/apache/xmpbox/xml/DomXmpParserTest.java   
    Sat Dec 27 19:41:47 2025        (r1930898)
@@ -1073,6 +1073,37 @@ class DomXmpParserTest
     }
 
     @Test
+    void testBadProp2() throws XmpParsingException
+    {
+        // PDFBOX-6135: from file 000316.pdf, stRef:documentName isn't defined
+        String s = 
+                "<?xml version=\"1.0\" encoding=\"UTF-8\" 
standalone=\"no\"?>\n" +
+                "<?xpacket begin=\"\" 
id=\"W5M0MpCehiHzreSzNTczkc9d\"?><x:xmpmeta xmlns:x=\"adobe:ns:meta/\" 
x:xmptk=\"3.1-701\">\n" +
+                "    <rdf:RDF 
xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\";>\n" +
+                "        <rdf:Description 
xmlns:stRef=\"http://ns.adobe.com/xap/1.0/sType/ResourceRef#\"; 
xmlns:xapMM=\"http://ns.adobe.com/xap/1.0/mm/\"; rdf:about=\"\">\n" +
+                "            
<xapMM:DocumentID>uuid:CE03288B61A6DB11A55CA11F14F48514</xapMM:DocumentID>\n" +
+                "            
<xapMM:InstanceID>uuid:474647e9-680a-47dc-83d5-ba3f3a7e2a67</xapMM:InstanceID>\n"
 +
+                "            <xapMM:DerivedFrom rdf:parseType=\"Resource\">\n" 
+
+                "                
<stRef:documentName>uuid:8705447f-b80d-4cc8-82f7-0ec27187edfe</stRef:documentName>\n"
 +
+                "                
<stRef:documentID>uuid:b2f88223-2723-430d-b93c-3503ccb0e34b</stRef:documentID>\n"
 +
+                "            </xapMM:DerivedFrom>\n" +
+                "        </rdf:Description>\n" +
+                "    </rdf:RDF>\n" +
+                "</x:xmpmeta><?xpacket end=\"w\"?>";
+        final DomXmpParser xmpParser1 = new DomXmpParser();
+        XmpParsingException ex = assertThrows(XmpParsingException.class,
+                () -> xmpParser1.parse(s.getBytes(StandardCharsets.UTF_8)));
+        assertEquals("Type 'stRef:documentName' not defined in 
http://ns.adobe.com/xap/1.0/sType/ResourceRef#";, ex.getMessage());
+        final DomXmpParser xmpParser2 = new DomXmpParser();
+        xmpParser2.setStrictParsing(false);
+        XMPMetadata xmp2 = 
xmpParser2.parse(s.getBytes(StandardCharsets.UTF_8));
+        XMPMediaManagementSchema xmpMediaManagementSchema = 
xmp2.getXMPMediaManagementSchema();
+        ResourceRefType derived = 
xmpMediaManagementSchema.getDerivedFromProperty();
+        assertEquals("uuid:b2f88223-2723-430d-b93c-3503ccb0e34b", 
derived.getDocumentID());
+        
assertEquals("[documentName=TextType:uuid:8705447f-b80d-4cc8-82f7-0ec27187edfe]",
 derived.getProperty("documentName").toString());
+    }
+
+    @Test
     void testParseFailure() throws XmpParsingException
     {
         String s = "<?xml version=\"1.0\" encoding=\"UTF-8\" 
standalone=\"no\"?>";

Reply via email to