2013-07-24 30 views
0

我有一個服務,需要一個PDF文檔,調整大小的所有圖像,並在pdf中取代它。我遇到的問題是壓縮。C#PdfImage LibTiff iTextSharp G3/G4壓縮

某些文檔使用Compression.CCITTFAX3壓縮進行掃描和保存,其中一些使用Compression.CCITTFAX4壓縮進行保存。我正在使用iTextSharp並將流字節轉換爲Tiff,否則由於步伐或其他原因,圖像變得怪異。

下面是我目前正在使用的代碼來檢查正確的過濾器,然後轉換爲tiff圖像。

   if (filter == "/CCITTFaxDecode") 
       { 
        byte[] data = PdfReader.GetStreamBytesRaw((PRStream)stream); 
        using (MemoryStream ms = new MemoryStream()) 
        { 
         using (Tiff myTiff = Tiff.ClientOpen("in-memory", "w", ms, new TiffStream())) 
         { 
          myTiff.SetField(TiffTag.IMAGEWIDTH, UInt32.Parse(dict.Get(PdfName.WIDTH).ToString())); 
          myTiff.SetField(TiffTag.IMAGELENGTH, UInt32.Parse(dict.Get(PdfName.HEIGHT).ToString())); 
          myTiff.SetField(TiffTag.COMPRESSION, Compression.CCITTFAX3); 
          myTiff.SetField(TiffTag.BITSPERSAMPLE, UInt32.Parse(dict.Get(PdfName.BITSPERCOMPONENT).ToString())); 
          myTiff.SetField(TiffTag.SAMPLESPERPIXEL, 1); 
          myTiff.WriteRawStrip(0, data, data.Length); 
          myTiff.Flush(); 

          using (System.Drawing.Image img = new Bitmap(ms)) 
          { 
           if (img == null) continue; 

           ReduceResolution(stream, img, quality); 
          } 

          myTiff.Close(); 
         } 
        } 
       } 

只是爲了確保你明白我的問題......

我想找出我怎麼知道什麼時候使用G3壓縮以及何時使用G4壓縮。

請記住,我已經試過了我能找到的每個代碼示例。

這是非常重要的,因爲我們與銀行系統接口,上傳的文件作爲FICA文件發送給他們。

請幫忙...

回答

0

非常感謝上述回覆。如果您確實獲得了來自Mihai的所有信息,Mihai的解決方案似乎可行。我發現iTextSharp沒有做到這一點,所以我最終購買了pdf4net。比試圖找出更好的解決方案更簡單,除此之外,它比我在這方面花費的時間更便宜。

OnceUponATime ....感謝您提供上述信息。

PDF4Net有一個內置的方法,你可以得到所有的圖像每頁...這對我的問題排序,而我試圖使用iTextSharp和給我的例子自己做這個。

1

你需要去低級別,檢查圖像字典。/DecodeParms條目是一個包含與CCITT壓縮相關的幾個密鑰的字典。/K鍵指定壓縮類型:-1是G4,0是G3 1D,1是G3 2D。

更新:更確切地說是負值,通常是-1,是G4,0是G3 1D,正值是1,通常是G3 2D。要在評論中回答您的問題,/ K條目是可選的,如果它缺少默認值被認爲是0.

+0

我站好了! –

+0

我的問題是,當我運行此代碼時, PdfDictionary Params =(PdfDictionary)dict.Get(PdfName.DECODEPARMS); 我的Params.Keys有列和行,沒有別的。所以,當試圖獲取PdfName.K時,它會返回null。 –

0

我不會建議直接插入數據。我基於多年來在ABCpdf .NET(我工作)等產品中使用PDF和TIFF的實踐經驗而斷言這一說法。

雖然理論上你應該能夠通過直接的數據移動,但是壓縮數據格式之間的細微差別很可能會導致偶然的不匹配。

事實上,某些傳真TIFFs包含的數據可以在TIFF查看器中正確顯示,但不在PDF中,這導致我懷疑相同類型的問題也可能在另一個方向上操作。

我不會說這種問題很常見,但如果我在銀行,這種事情我不會依賴。除非你確定你的數據源是統一的,否則我會建議解壓縮和重新壓縮要安全得多。

我還會注意到,有時圖像在內容流中保持內聯而不是在單獨的XObject中。同樣,這是你需要應對的,除非你的數據源生成一個標準格式,你肯定不會包含這種結構。