Author: lehmi
Date: Sun May 17 12:01:58 2026
New Revision: 1934295

Log:
PDFBOX-6192: add factory method to create an instance of PDIndexed based on a 
request from Stefan Ziegler

Added:
   
pdfbox/branches/3.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/color/PDIndexedTest.java
   (contents, props changed)
Modified:
   
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDIndexed.java

Modified: 
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDIndexed.java
==============================================================================
--- 
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDIndexed.java
    Sun May 17 11:44:40 2026        (r1934294)
+++ 
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDIndexed.java
    Sun May 17 12:01:58 2026        (r1934295)
@@ -24,6 +24,7 @@ import java.awt.image.IndexColorModel;
 import java.awt.image.Raster;
 import java.awt.image.WritableRaster;
 import java.io.IOException;
+import java.util.Arrays;
 
 import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSBase;
@@ -98,6 +99,40 @@ public final class PDIndexed extends PDS
         initRgbColorTable();
     }
 
+    /**
+     * Factory method to create a new indexed color space.
+     * 
+     * @param base base colorspace, mandantory has to be != null
+     * @param hival maximum valid index value for lookup data
+     * @param lookupData array for lookup data, mandantory has to be != null
+     * 
+     * @return an instance of PDIndedex initialized with the given values
+     * 
+     * @throws IOException if the colorspace could not be created
+     */
+    public static PDIndexed create(PDColorSpace base, int hival, byte[] 
lookupData)
+            throws IOException
+    {
+        if (base == null && lookupData == null)
+        {
+            throw new IllegalArgumentException("base value is null");
+        }
+        if (base == null && lookupData == null)
+        {
+            throw new IllegalArgumentException("lookupData value is null");
+        }
+        PDIndexed pdIndexed = new PDIndexed();
+        pdIndexed.baseColorSpace = base;
+        pdIndexed.array.set(1, base.getCOSObject());
+        pdIndexed.array.set(2, hival);
+        pdIndexed.lookupData = Arrays.copyOf(lookupData, lookupData.length);
+        COSString cosLookupData = new COSString(lookupData, true);
+        pdIndexed.array.set(3, cosLookupData);
+        pdIndexed.readColorTable();
+        pdIndexed.initRgbColorTable();
+        return pdIndexed;
+    }
+
     @Override
     public String getName()
     {

Added: 
pdfbox/branches/3.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/color/PDIndexedTest.java
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ 
pdfbox/branches/3.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/color/PDIndexedTest.java
        Sun May 17 12:01:58 2026        (r1934295)
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2015 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pdfbox.pdmodel.graphics.color;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import org.apache.pdfbox.cos.COSArray;
+import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.cos.COSNumber;
+import org.apache.pdfbox.cos.COSString;
+import org.apache.pdfbox.pdfwriter.compress.CompressParameters;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.pdmodel.PDResources;
+import org.junit.jupiter.api.Test;
+
+class PDIndexedTest
+{
+
+    /**
+     * Test of factory method for PDFBOX-6192.
+     */
+    @Test
+    void testFactory()
+    {
+        final PDColorSpace baseColorspace = PDDeviceRGB.INSTANCE;
+        // define 6 color values
+        final int hival = 5;
+        // create s string containing 6 RGB values. Spaces are added for a 
better readability
+        final String stringLookupData = "AA1166 112233 000000 FEDC01 4561FE 
DC34DA" //
+                .replace(" ", "");
+        // expected written string for COSArray
+        final String outputString = "/Indexed /DeviceRGB 5 <" + 
stringLookupData + ">";
+
+        try
+        {
+            byte[] lookupData = 
COSString.parseHex(stringLookupData).getBytes();
+            PDIndexed pdIndexed = PDIndexed.create(baseColorspace, hival, 
lookupData);
+            COSArray indexedCOSArray = ((COSArray) pdIndexed.getCOSObject());
+            assertEquals(hival, ((COSNumber) 
indexedCOSArray.getObject(2)).intValue(),
+                    "unexpected value for hival");
+            assertEquals(COSName.INDEXED.getName(), pdIndexed.getName(),
+                    "unexpected value for name");
+            assertEquals(baseColorspace, pdIndexed.getBaseColorSpace(),
+                    "unexpected value for base colorspace");
+            String lookupDataString = ((COSString) 
indexedCOSArray.getObject(3)).toHexString();
+            assertEquals(stringLookupData, lookupDataString, "unexpected value 
for lookup data");
+
+            PDDocument document = new PDDocument();
+            PDPage page = new PDPage();
+            PDResources resources = new PDResources();
+            resources.add(pdIndexed);
+            page.setResources(resources);
+            document.addPage(page);
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            document.save(baos, CompressParameters.NO_COMPRESSION);
+            document.close();
+            String pdfAsString = baos.toString();
+            assertTrue(pdfAsString.contains(outputString), "output doesn't 
match expected string");
+        }
+        catch (IOException e)
+        {
+            fail("Unexpected exception");
+        }
+    }
+
+}

Reply via email to