Search code examples
javaexceptionpdfitextcolor-space

What to do with iText "Unexpected color space /CS0" type of exceptions


I have some files generated by unknown source that open just fine in PDF browsers (Reader/Foxit) but iText fails to process them. For particular file I get:

Exception in thread "main" java.lang.IllegalArgumentException: Unexpected colorspace /CS0
        at com.itextpdf.text.pdf.parser.InlineImageUtils.getComponentsPerPixel(InlineImageUtils.java:238)
        at com.itextpdf.text.pdf.parser.InlineImageUtils.computeBytesPerRow(InlineImageUtils.java:251)
        at com.itextpdf.text.pdf.parser.InlineImageUtils.parseUnfilteredSamples(InlineImageUtils.java:280)
        at com.itextpdf.text.pdf.parser.InlineImageUtils.parseInlineImageSamples(InlineImageUtils.java:320)
        at com.itextpdf.text.pdf.parser.InlineImageUtils.parseInlineImage(InlineImageUtils.java:153)
        at com.itextpdf.text.pdf.parser.PdfContentStreamProcessor.processContent(PdfContentStreamProcessor.java:370)
        at com.itextpdf.text.pdf.parser.PdfReaderContentParser.processContent(PdfReaderContentParser.java:79)

sometimes /CS0 color space changes to /CS1 through /CS9 (or something similar).

Is it a iText bug (I'm using java 1.7, iText 5.4.1) or are my pdf files just broken? Even if the pdf files are broken is there any way I can fix them? (Adobe Reader seems to do that somehow, but unfortunately opening the file and saving it again does not work).


Solution

  • I'm not familiar with PDF specification so I don't know if PDFs I worked with were valid or not. I did however managed to solve the problem by making changes to iText in file com.itextpdf.text.pdf.parser.InlineIamgeUtils method getComponentsPerPixel(...) from:

    private static int getComponentsPerPixel(PdfName colorSpaceName, PdfDictionary colorSpaceDic){
            if (colorSpaceName == null)
                return 1;
            if (colorSpaceName.equals(PdfName.DEVICEGRAY))
                return 1;
            if (colorSpaceName.equals(PdfName.DEVICERGB))
                return 3;
            if (colorSpaceName.equals(PdfName.DEVICECMYK))
                return 4;
    
            if (colorSpaceDic != null){
                PdfArray colorSpace = colorSpaceDic.getAsArray(colorSpaceName);
                if (colorSpace != null){
                    if (PdfName.INDEXED.equals(colorSpace.getAsName(0))){
                        return 1;
                    }
                }
            }
    
            throw new IllegalArgumentException("Unexpected color space " + colorSpaceName);
        }
    

    to

    private static int getComponentsPerPixel(PdfName colorSpaceName, PdfDictionary colorSpaceDic){
            if (colorSpaceName == null)
                return 1;
            if (colorSpaceName.equals(PdfName.DEVICEGRAY))
                return 1;
            if (colorSpaceName.equals(PdfName.DEVICERGB))
                return 3;
            if (colorSpaceName.equals(PdfName.DEVICECMYK))
                return 4;
    
            if (colorSpaceDic != null){
                PdfArray colorSpace = colorSpaceDic.getAsArray(colorSpaceName);
                if (colorSpace != null){
                    if (PdfName.INDEXED.equals(colorSpace.getAsName(0))){
                        return 1;
                    }
                } /* Begin mod # */ else {
                    PdfName tempName = colorSpaceDic.getAsName(colorSpaceName);
                    if(tempName != null) return(getComponentsPerPixel(tempName, colorSpaceDic));
                } /* End mod */
            }
    
            throw new IllegalArgumentException("Unexpected color space " + colorSpaceName);
        }