2011-10-11 164 views
1

我目前使用iText從TIFF圖像生成PDF文件。使用iText從TIFF圖像創建PDF

基本上程序如下: 1.閱讀TIFF文件。 2.對於每個「頁」的TIFF的,實例化一個圖片對象和寫入到文獻實例,這是PDF文件。

我很難理解如何將這些圖像添加到PDF保持原始分辨率。

我試着縮放圖片的尺寸在TIFF的原始圖像的像素,比如:

// Pixel Dimensions 1728 × 2156 pixels 
// Resolution 204 × 196 ppi 
RandomAccessFileOrArray tiff = new RandomAccessFileOrArray("/path/to/tiff/file"); 
Document pdf = new Document(PageSize.LETTER); 
Image temp = TiffImage.getTiffImage(tiff, page); 
temp.scaleAbsolute(1728f, 2156f); 
pdf.add(temp); 

我會很感激,如果有人可以提供一些線索這個。也許我缺少的圖片類方法的功能...

提前感謝!

回答

6

我認爲如果你縮放圖像,那麼你不能保留原來的分辨率(請糾正我,如果我錯了:))。 你可以嘗試做的是創建一個不同大小頁面的PDF文檔(如果圖像在tif圖像中的分辨率不同)。

請嘗試下面的代碼。它將PDF頁面的大小設置爲與圖像文件的大小相同,然後創建該PDF頁面。 PDF頁面大小變化根據圖像大小,因此分辨率保持:)

import java.io.FileOutputStream; 
import java.io.IOException; 

import com.itextpdf.text.Document; 
import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.Image; 
import com.itextpdf.text.PageSize; 
import com.itextpdf.text.Paragraph; 
import com.itextpdf.text.Rectangle; 
import com.itextpdf.text.pdf.PdfWriter; 
import com.itextpdf.text.pdf.RandomAccessFileOrArray; 
import com.itextpdf.text.pdf.codec.TiffImage; 

public class Tiff2Pdf { 

    /** 
    * @param args 
    * @throws DocumentException 
    * @throws IOException 
    */ 
    public static void main(String[] args) throws DocumentException, 
      IOException { 

     String imgeFilename = "/home/saurabh/Downloads/image.tif"; 

     Document document = new Document(); 
     PdfWriter writer = PdfWriter.getInstance(
       document, 
       new FileOutputStream("/home/saurabh/Desktop/out" 
         + Math.random() + ".pdf")); 
     writer.setStrictImageSequence(true); 
     document.open(); 

     document.add(new Paragraph("Multipages tiff file")); 
     Image image; 
     RandomAccessFileOrArray ra = new RandomAccessFileOrArray(imgeFilename); 
     int pages = TiffImage.getNumberOfPages(ra); 
     for (int i = 1; i <= pages; i++) { 
      image = TiffImage.getTiffImage(ra, i); 
      Rectangle pageSize = new Rectangle(image.getWidth(), 
        image.getHeight()); 
      document.setPageSize(pageSize); 
      document.add(image); 
      document.newPage(); 
     } 

     document.close(); 

    } 

} 
+1

謝謝!你有沒有失去分辨率測試這段代碼?我給了它一個鏡頭,我得到的是一個PDF頁面,其中包含的圖片比它能容納的圖片更大...... – romeroqj

+0

請參閱代碼「Rectangle pageSize = new Rectangle(image.getWidth(),image.getHeight());」 。我想要做的事情基本上是獲取圖像的實際大小,然後創建一個相同大小的空白PDF頁面,以便在PDF中嵌入PDF頁面時圖像不會丟失其質量。這就是爲什麼根據我的代碼,你會得到不同大小的頁面PDF。如果你不這樣做,那麼你最終會在圖像上執行scaleToFit,這將引入圖像數據丟失(當您放大PDF頁面時可識別)。最終,我試圖避免scaleToFit調用。 – Saurabh

4

我發現,這行不順利:

document.setPageSize(pageSize); 

如果您的TIFF文件只包含一個圖像,然後你就要去使用這個,而不是更好:

RandomAccessFileOrArray ra = new RandomAccessFileOrArray(imageFilePath); 
Image image = TiffImage.getTiffImage(ra, 1); 
Rectangle pageSize = new Rectangle(image.getWidth(), image.getHeight()); 

Document document = new Document(pageSize); 
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(outputFileName)); 
writer.setStrictImageSequence(true); 
document.open(); 
document.add(image); 
document.newPage(); 

document.close(); 

這將導致恰好適合圖像尺寸的頁面大小,因此不需要縮放。

1

另一個示例未棄用直至iText 5.5,並修復了第一頁問題。我正在使用5.5.11 Itext。

import java.io.FileOutputStream; 
import java.io.RandomAccessFile; 
import java.nio.channels.FileChannel; 
import com.itextpdf.text.Document; 
import com.itextpdf.text.Image; 
import com.itextpdf.text.Rectangle; 
import com.itextpdf.text.io.FileChannelRandomAccessSource; 
import com.itextpdf.text.pdf.PdfWriter; 
import com.itextpdf.text.pdf.RandomAccessFileOrArray; 
import com.itextpdf.text.pdf.codec.TiffImage; 
public class Test1 { 
    public static void main(String[] args) throws Exception { 
     RandomAccessFile aFile = new RandomAccessFile("/myfolder/origin.tif", "r"); 
     FileChannel inChannel = aFile.getChannel(); 
     FileChannelRandomAccessSource fcra = new FileChannelRandomAccessSource(inChannel); 
     Document document = new Document(); 
     PdfWriter.getInstance(document, new FileOutputStream("/myfolder/destination.pdf")); 
     document.open();    
     RandomAccessFileOrArray rafa = new RandomAccessFileOrArray(fcra); 
     int pages = TiffImage.getNumberOfPages(rafa); 
     Image image; 
     for (int i = 1; i <= pages; i++) {    
      image = TiffImage.getTiffImage(rafa, i); 
      Rectangle pageSize = new Rectangle(image.getWidth(), image.getHeight()); 
      document.setPageSize(pageSize); 
      document.newPage(); 
      document.add(image); 
     } 
     document.close(); 
     aFile.close();    
    } 
} 
+0

我確認這是用於使圖像適合每個頁面的解決方案。謝謝! –

+0

我知道這有點遲,但是,你能寫出你用過的進口嗎?因爲使用原始和最新的iText庫(不是lowagie的),此代碼不起作用。 'TiffImage.getNumberOfPages(rafa)'必須替換爲'TiffImageData.getNumberOfPages(rafa)'和'TiffImage.getTiffImage(rafa,i)'根本行不通,因爲該方法需要一個'com.itextpdf.text.pdf .RandomAccessFileOrArray',但我們有一個'com.itextpdf.io.source.RandomAccessFileOrArray'。 – nonzaprej

+0

這是不相同的代碼,它甚至不使用iText,但ICEPdf。 – nonzaprej