使用iText从TIFF图像创建PDF

时间:2011-10-11 04:43:38

标签: java itext

我目前正在使用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);

如果有人能够对此有所了解,我将非常感激。也许我错过了 Image 类方法的功能......

提前致谢!

3 个答案:

答案 0 :(得分: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 :(得分:6)

我发现这条线不能正常工作:

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();

这将导致页面大小完全符合图像大小,因此不需要缩放。

答案 2 :(得分: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();            
    }
}