编程语言
首页 > 编程语言> > java – 如何处理iText“Unexpected color space / CS0”类型的异常

java – 如何处理iText“Unexpected color space / CS0”类型的异常

作者:互联网

我有一些由未知来源生成的文件在PDF浏览器(Reader / Foxit)中打开很好但iText无法处理它们.对于特定文件我得到:

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)

有时/ CS0颜色空间变为/ CS1到/ CS9(或类似的东西).

这是一个iText错误(我使用的是java 1.7,iText 5.4.1)还是我的pdf文件坏了?即使pdf文件坏了,我有什么方法可以修复它们吗? (Adobe Reader似乎以某种方式这样做,但不幸的是打开文件并再次保存它不起作用).

解决方法:

我不熟悉PDF规范,因此我不知道我使用过的PDF是否有效.然而,我确实通过在文件com.itextpdf.text.pdf.parser.InlineIamgeUtils方法getComponentsPerPixel(…)中更改iText来解决问题:

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

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

标签:java,exception,pdf,itext,color-space
来源: https://codeday.me/bug/20190625/1284805.html