Author: tilman
Date: Sat Dec 27 19:41:42 2025
New Revision: 1930897
Log:
PDFBOX-6135: fallback to text for undefined property in lenient mode + test
Modified:
pdfbox/branches/2.0/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java
pdfbox/branches/2.0/xmpbox/src/test/java/org/apache/xmpbox/xml/DomXmpParserTest.java
Modified:
pdfbox/branches/2.0/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java
==============================================================================
---
pdfbox/branches/2.0/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java
Sat Dec 27 16:22:29 2025 (r1930896)
+++
pdfbox/branches/2.0/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java
Sat Dec 27 19:41:42 2025 (r1930897)
@@ -793,11 +793,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/branches/2.0/xmpbox/src/test/java/org/apache/xmpbox/xml/DomXmpParserTest.java
==============================================================================
---
pdfbox/branches/2.0/xmpbox/src/test/java/org/apache/xmpbox/xml/DomXmpParserTest.java
Sat Dec 27 16:22:29 2025 (r1930896)
+++
pdfbox/branches/2.0/xmpbox/src/test/java/org/apache/xmpbox/xml/DomXmpParserTest.java
Sat Dec 27 19:41:42 2025 (r1930897)
@@ -1106,6 +1106,42 @@ public class DomXmpParserTest
}
@Test
+ public void testBadProp2() throws XmpParsingException,
UnsupportedEncodingException
+ {
+ // 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\"?>";
+ try
+ {
+ new DomXmpParser().parse(s.getBytes("utf-8"));
+ fail("XmpParsingException expected");
+ }
+ catch (XmpParsingException ex)
+ {
+ 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("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
public void testParseFailure() throws XmpParsingException,
UnsupportedEncodingException
{
String s = "<?xml version=\"1.0\" encoding=\"UTF-8\"
standalone=\"no\"?>";