2013-04-17 17 views
4

我有一些由未知源生成的文件,在PDF瀏覽器(Reader/Foxit)中打開得很好,但iText無法處理它們。對於特定的文件,我得到:如何處理iText「意外顏色空間/ CS0」類型的例外

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似乎這樣做,但不幸的是打開文件並再次保存它不起作用)。

+0

燦你共享這些文件之一? –

+0

對不起,但我不能 - 我正在處理_very_大集pdf,不再記得哪些導致了問題(我解決了這個問題) – matt

回答

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

謝謝。我沒有檢查是否符合ISO-32000-1標準,但是我將變更上傳到了SVN存儲庫,因爲它看起來一眼就可以了。 –

+0

我使用iText for Android(com.itextpdf:itextg:5.5.10),它具有此固定代碼。我得到以「/ R」開頭的錯誤顏色空間。例如,「/ R9」,「/ R10」,「/ R11」。當InlineImageDictionary中沒有「Filter」鍵時,它看起來像試圖在嵌入圖像上做某種OCR?我挖了一下,colorSpaceDic.GetAsArray()返回,在一種情況下,「[/ ICCBased,10,0,R]」。爲什麼ICCB基於一個意想不到的色彩空間?問題是編寫的代碼不僅放棄了圖像......它放棄了頁面。 – Oded

+0

有趣的是,這似乎是由我使用ghostscript嵌入字體造成的。如果我沒有運行ghostscript,則不會發生這些問題。然後,我的情況完全可能是一個幽靈腳本錯誤。 – Oded