2011-10-11 161 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