5

我有一些由未知来源生成的文件,可以在 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 似乎以某种方式做到了这一点,但不幸的是,打开文件并再次保存它不起作用)。

4

1 回答 1

4

我不熟悉 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);
    }
于 2013-04-22T10:12:36.977 回答