PdfBox - PDColorSpaceFactory.createColorSpace (documento, iccColorSpace) lança nulopointerexception

Estou tentando criar um PDF com uma única imagem em uma única página. A parte complicada é usar um espaço de cores CMYK personalizado (definido em um arquivo separado).

Eu tentei ligar

PDColorSpaceFactory.createColorSpace (documento, iccColorSpace)

mas continue obtendo uma nulopointercepção. Consegui acompanhar o problema até o construtor:

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

oPDICCBased objeto temcorrente campo e obviamente não está definido. Assim, quando é chamado em:

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;
}

Uma NullPointerException é lançada.

Estou esquecendo de algo? Existe outra maneira \ melhor de criar PDF usando o espaço de cores CMYK?

AtualizadacreateColorSpace:

    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;
}

Isso fez o truque de criar o colorSpace.

A criação do ColorSpace a partir de um icc personalizado e a aplicação a uma determinada imagem:

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);

A criação do 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();

Espero que isto ajude.

questionAnswers(1)

yourAnswerToTheQuestion