PdfBox - PDColorSpaceFactory.createColorSpace (document, iccColorSpace) выбрасывает nullpointerexception

Я пытаюсь создать PDF, который имеет одно изображение на одной странице. Сложнее всего использовать пользовательское (определенное в отдельном файле) цветовое пространство CMYK.

Я пытался позвонить

PDColorSpaceFactory.createColorSpace (document, iccColorSpace)

но продолжайте получать nullpointerexception. Мне удалось отследить проблему до конструктора:

public PDICCBased( PDDocument doc )
{
    array = new COSArray();
    array.add( COSName.ICCBASED );
    array.add( new PDStream( doc ) );
}

PDICCBased объект имеетпоток поле, и это явно не установлено. Таким образом, когда он вызывается в:

public static PDColorSpace createColorSpace( PDDocument doc, ColorSpace cs ) throws IOException
{
    PDColorSpace retval = null;
    if( cs.isCS_sRGB() )
    {
        retval = PDDeviceRGB.INSTANCE;
    }
    else if( cs instanceof ICC_ColorSpace )
    {
        ICC_ColorSpace ics = (ICC_ColorSpace)cs;
        PDICCBased pdCS = new PDICCBased( doc );
        retval = pdCS;
        COSArray ranges = new COSArray();
        for( int i=0; i<cs.getNumComponents(); i++ )
        {
            ranges.add( new COSFloat( ics.getMinValue( i ) ) );
            ranges.add( new COSFloat( ics.getMaxValue( i ) ) );
        }
        PDStream iccData = pdCS.getPDStream();
        OutputStream output = null;
        try
        {
            output = iccData.createOutputStream(); <<<<<<<<<-------------
            output.write( ics.getProfile().getData() );
        }
        finally
        {
            if( output != null )
            {
                output.close();
            }
        }
        pdCS.setNumberOfComponents( cs.getNumComponents() );
    }
    else
    {
        throw new IOException( "Not yet implemented:" + cs );
    }
    return retval;
}

Выдается исключение NullPointerException.

Я что-то пропустил? Есть ли еще один лучший способ создания PDF с использованием цветового пространства CMYK?

обновленныйcreateColorSpace:

    public static PDColorSpace createColorSpace( PDDocument doc, ColorSpace cs ) throws IOException
{
    PDColorSpace retval = null;
    if( cs.isCS_sRGB() )
    {
        retval = PDDeviceRGB.INSTANCE;
    }
    else if( cs instanceof ICC_ColorSpace )
    {
        ICC_ColorSpace ics = (ICC_ColorSpace)cs;

        // CREATING MANUALLY THE COS ARR  ****************************
        COSArray cosArray = new COSArray();  
        cosArray.add(COSName.ICCBASED);
        PDStream pdStream = new PDStream(doc);
        cosArray.add(pdStream.getStream());

        // USING DIFFERENT CONSTRUTOR  *******************************
        PDICCBased pdCS = new PDICCBased( cosArray );
        retval = pdCS;
        COSArray ranges = new COSArray();
        for( int i=0; i<cs.getNumComponents(); i++ )
        {
            ranges.add( new COSFloat( ics.getMinValue( i ) ) );
            ranges.add( new COSFloat( ics.getMaxValue( i ) ) );
        }
        PDStream iccData = pdCS.getPDStream();
        OutputStream output = null;
        try
        {
            output = ((COSStream)iccData.getCOSObject()).createFilteredStream();
            output.write( ics.getProfile().getData() );
        }
        finally
        {
            if( output != null )
            {
                output.close();
            }
        }
        pdCS.setNumberOfComponents( cs.getNumComponents() );
    }
    else
    {
        throw new IOException( "Not yet implemented:" + cs );
    }
    return retval;
}

Это добилось цели от создания colorSpace.

Создание ColorSpace из пользовательского icc и применение его к заданному изображению:

ICC_ColorSpace iccColorSpace = new ICC_ColorSpace(ICC_Profile.getInstance("C:\\...\\USWebCoatedSWOP.icc")); 
ColorConvertOp op = new ColorConvertOp(image.getColorModel().getColorSpace(), iccColorSpace, null);
image = op.filter(image, null);

Создание PDF:

PDDocument document = new PDDocument();

PDColorSpace colorSpace = createColorSpace(document, iccColorSpace);

PDPage blankPage = new PDPage(new PDRectangle(100, 100));
document.addPage(blankPage);

PDPageContentStream pdPageContentStream = new PDPageContentStream(document, blankPage);

PDXObjectImage pdxObjectImage = new PDPixelMap(document, image);
pdxObjectImage.setColorSpace(colorSpace);
pdPageContentStream.drawXObject(pdxObjectImage, 0, 0, imagePostScriptWidth, imagePostScriptHeight);
pdPageContentStream.close();

document.save(byteArrayOutputStream);
document.close();

Надеюсь это поможет.

Ответы на вопрос(1)

Ваш ответ на вопрос