Author: tilman
Date: Wed May 22 11:34:48 2024
New Revision: 1917892

URL: http://svn.apache.org/viewvc?rev=1917892&view=rev
Log:
PDFBOX-5826: check for /Type and /Subtype in metadata

Modified:
    
pdfbox/branches/3.0/preflight/src/main/java/org/apache/pdfbox/preflight/process/MetadataValidationProcess.java

Modified: 
pdfbox/branches/3.0/preflight/src/main/java/org/apache/pdfbox/preflight/process/MetadataValidationProcess.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/3.0/preflight/src/main/java/org/apache/pdfbox/preflight/process/MetadataValidationProcess.java?rev=1917892&r1=1917891&r2=1917892&view=diff
==============================================================================
--- 
pdfbox/branches/3.0/preflight/src/main/java/org/apache/pdfbox/preflight/process/MetadataValidationProcess.java
 (original)
+++ 
pdfbox/branches/3.0/preflight/src/main/java/org/apache/pdfbox/preflight/process/MetadataValidationProcess.java
 Wed May 22 11:34:48 2024
@@ -29,6 +29,7 @@ import java.util.ArrayList;
 import java.util.List;
 import javax.imageio.ImageIO;
 import org.apache.pdfbox.cos.COSBase;
+import org.apache.pdfbox.cos.COSDictionary;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.cos.COSStream;
 import org.apache.pdfbox.pdmodel.PDDocument;
@@ -65,7 +66,7 @@ public class MetadataValidationProcess e
 
             XMPMetadata metadata;
             DomXmpParser builder = new DomXmpParser();
-            try (InputStream is = getXpacket(document))
+            try (InputStream is = getXpacket(document, ctx))
             {
                 metadata = builder.parse(is);
             }
@@ -253,7 +254,7 @@ public class MetadataValidationProcess e
     /**
      * Return the xpacket from the dictionary's stream
      */
-    private static InputStream getXpacket(PDDocument document)
+    private InputStream getXpacket(PDDocument document, PreflightContext ctx)
             throws IOException, XpacketParsingException
     {
         PDDocumentCatalog catalog = document.getDocumentCatalog();
@@ -274,7 +275,8 @@ public class MetadataValidationProcess e
             throw new XpacketParsingException("Failed while retrieving 
xpacket", error);
         }
 
-        if (metadata.getCOSObject().containsKey(COSName.FILTER))
+        COSDictionary metadataDict = metadata.getCOSObject();
+        if (metadataDict.containsKey(COSName.FILTER))
         {
             // filter key should not be defined
             ValidationError error = new ValidationError(
@@ -282,6 +284,18 @@ public class MetadataValidationProcess e
                     "Filter specified in metadata dictionary");
             throw new XpacketParsingException("Failed while retrieving 
xpacket", error);
         }
+        String type = metadataDict.getNameAsString(COSName.TYPE);
+        if (!"Metadata".equals(type))
+        {
+            addValidationError(ctx, new 
ValidationError(PreflightConstants.ERROR_METADATA_FORMAT,
+                    "Missing or wrong /Type key in Metadata stream 
dictionary"));
+        }
+        String subType = metadataDict.getNameAsString(COSName.SUBTYPE);
+        if (!"XML".equals(subType))
+        {
+            addValidationError(ctx, new 
ValidationError(PreflightConstants.ERROR_METADATA_FORMAT,
+                    "Missing or wrong /Subtype key in Metadata stream 
dictionary"));
+        }
 
         return metadata.exportXMPMetadata();
     }


Reply via email to