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.