Hi,

Thank you, fixed in https://issues.apache.org/jira/browse/PDFBOX-6173 as suggested.

Sadly we're just doing a release so the fix will be in the next release.

Tilman

Am 09.03.2026 um 11:14 schrieb Julian Stenzel:
Hello PDFBox team,

we found a reproducible NullPointerException in PDFBox 3.0.6 while merging PDFs 
with output intents.

The issue occurs when the destination document already contains a 
PDOutputIntent without an OutputConditionIdentifier, and the source document 
contains a PDOutputIntent with a non-null identifier.

Expected behavior:

Merging should not throw a NullPointerException when an existing destination 
PDOutputIntent has no OutputConditionIdentifier. A missing identifier should 
simply not be treated as a duplicate match.
Below is a minimal JUnit 5 test that reproduces the issue.

import java.awt.color.ColorSpace;
import java.awt.color.ICC_Profile;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

import org.apache.pdfbox.io.IOUtils;
import org.apache.pdfbox.io.RandomAccessReadBuffer;
import org.apache.pdfbox.multipdf.PDFMergerUtility;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.graphics.color.PDOutputIntent;
import org.junit.jupiter.api.Test;

class PDFMergerUtilityOutputIntentNpeTest {

     private byte[] createPdf(final String outputConditionIdentifier) throws 
Exception {

         final byte[] profileData = 
ICC_Profile.getInstance(ColorSpace.CS_sRGB).getData();

         try (final PDDocument doc = new PDDocument();
              final ByteArrayOutputStream out = new ByteArrayOutputStream()) {
             doc.addPage(new PDPage());
             final PDOutputIntent intent =
                     new PDOutputIntent(doc, new 
ByteArrayInputStream(profileData));
             if (outputConditionIdentifier != null) {
                 intent.setOutputConditionIdentifier(outputConditionIdentifier);
             }
             doc.getDocumentCatalog().addOutputIntent(intent);
             doc.save(out);
             return out.toByteArray();
         }
     }

     @Test
     void 
reproducesNullPointerExceptionWhenDestinationOutputConditionIdentifierIsMissing()
             throws Exception {

         final byte[] destination = createPdf(null);
         final byte[] source = createPdf("sRGB IEC61966-2.1");
         final PDFMergerUtility merger = new PDFMergerUtility();
         merger.addSource(RandomAccessReadBuffer.createBufferFromStream(
                 new ByteArrayInputStream(destination)));
         merger.addSource(RandomAccessReadBuffer.createBufferFromStream(
                 new ByteArrayInputStream(source)));
         merger.setDestinationStream(new ByteArrayOutputStream());
         merger.mergeDocuments(IOUtils.createMemoryOnlyStreamCache());
     }

}

Since srcOCI is guaranteed to be non-null in this code path, reversing the 
equals comparison would avoid the NPE

Thanks

Julian




---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to