2015-05-29 113 views
1

我們正在尋找以編程方式將圖像批量轉換爲PDF。到目前爲止,它看起來像我們將使用iTextSharp,但我們有與剪切路徑的JPG圖像的問題。我們在測試中使用以下代碼:使用iTextSharp將圖像轉換爲PDF保留剪切路徑

using (FileStream fs = new FileStream(output, FileMode.Create, FileAccess.Write, FileShare.None)) 
{ 
    using (Document doc = new Document()) 
    { 
     using (PdfWriter writer = PdfWriter.GetInstance(doc, fs)) 
     { 
      doc.Open(); 
      iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(source); 

      image.SetAbsolutePosition(0, 0); 
      doc.SetPageSize(new iTextSharp.text.Rectangle(0, 0, image.Width, image.Height, 0)); 
      doc.NewPage(); 

      writer.DirectContent.AddImage(image,false); 

      doc.Close(); 
     } 
    } 
} 

在JPG圖像中的剪切路徑似乎只是被丟棄。有沒有辦法保留剪切路徑?另外,當調用AddImage時,InlineImage有一個選項,任何人都知道它的作用?

+0

請勿使用嵌入式圖像:使用嵌入式圖像意味着圖像存儲在PDF的內容流中。這隻能用於大小爲4 KB或更小的圖像。 PDF 2.0中將禁止更大的內嵌圖像。此外:iText將JPG的字節直接複製到PDF中。沒有一個字節被改變。如果你說你的JPG有裁剪路徑(我從來沒有聽說過這樣的事情),並且你沒有在PDF中看到這個特性,那麼你正面臨着PDF固有的侷限性,而不是iText(iText doesn'甚至看看JPG)。 –

+0

我確實在代碼中看到一個錯誤:第一個圖像的頁面大小將始終是錯誤的。它將是A4而不是圖像的大小。您需要使用您遇到的第一個圖像的大小來創建「Document」對象。 –

+0

我編輯了你的標題。請參閱:「[應該在題目中包含」標籤「嗎?](http://meta.stackexchange。com/questions/19190 /)「,其中的共識是」不,他們不應該「 –

回答

3

iText將JPG的字節直接複製到PDF中。沒有一個字節被改變。如果您說JPG文件有剪切路徑(我從來沒有聽說過這樣的事情),而您在PDF中沒有看到該功能,那麼您將面臨PDF固有的限制,而不是iText。 iText甚至不會查看JPG字節:它只是使用過濾器DCTDecode創建PDF流對象。

您必須在之前將剪貼路徑添加到PDF中。如您所知,PDF不支持PNG,PNG支持透明。當iText遇到透明的PNG時,它會處理PNG。它創建兩個圖像:一個使用/FlateDecode的不透明圖像和一個使用/FlateDecode的單色圖像。將不透明圖像與單色圖像一起添加爲其蒙版以獲得透明度。我想你必須以類似的方式預處理你的JPG。

關於內嵌圖像:

不要使用內聯圖像:使用嵌入式圖像意味着該圖像被存儲的PDF內容流中,而不是被存儲爲圖像x對象(它是將圖像存儲在PDF中的最佳方式)。內嵌圖像只能用於大小爲4 KB或更小的圖像。 PDF 2.0中將禁止更大的內嵌圖像。

額外注:

我想我在你的代碼中看到的一個問題。您正在創建的文檔頁面大小A4:

Document doc = new Document() 

A4是默認的大小,當你不參數傳遞給Document構造。然後,你嘗試改變頁面大小是這樣的:

doc.SetPageSize(new iTextSharp.text.Rectangle(0, 0, image.Width, image.Height, 0)); 
doc.NewPage(); 

不過:因爲你沒有任何內容添加到第一頁然而,NewPage()方法將被忽略,頁面大小不會改變。您仍然在第1頁上,尺寸爲A4。

iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(source); 
using (FileStream fs = new FileStream(output, FileMode.Create, FileAccess.Write, FileShare.None)) 
{ 
    using (Document doc = new Document(image)) 
    { 
     using (PdfWriter writer = PdfWriter.GetInstance(doc, fs)) 
     { 
      doc.Open(); 
      image.SetAbsolutePosition(0, 0); 
      writer.DirectContent.AddImage(image); 
      doc.Close(); 
     } 
    } 
} 
+0

好吧,複製圖像,然後我明白剪切路徑將被丟棄,因爲PDF不支持cliiping路徑。還有其他軟件替代方法,例如ImageMagick(+ GhostScript)在內部處理此內容,在轉換前應用剪切路徑 –

+0

是的,這就是iText用透明PNG做的事情,我會更新我的答案 –

+0

什麼是「輸出」? –