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 に答える