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");
+ }
+ }
+
+}