将一组tiff格式的图片转化为一个pdf文件

这个Java程序将一组多页的Tiff图片转换成一个PDF文件。使用了com.lowagie.text和com.sun.media.jai.codec库来处理图像和PDF文档。程序打开一个Document对象,创建一个PdfWriter实例,然后遍历每个Tiff图片,将其解码并缩放以适应PDF页面,最后将图像添加到PDF中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.netcode.pdf;

import java.io.*;

import java.awt.image.RenderedImage;
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.util.Hashtable;

import com.lowagie.text.Document;
import com.lowagie.text.Image;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfWriter;
import com.sun.media.jai.codec.*;
import com.sun.media.jai.codecimpl.*;
import com.sun.media.jai.codec.SeekableStream;
import com.sun.media.jai.codec.FileSeekableStream;
import com.sun.media.jai.codec.ImageDecoder;
import com.sun.media.jai.codec.ImageCodec;

public class TiffToPDF {
    Document document;
    PdfContentByte cb;
   
    public TiffToPDF(String filename, String[] strImages) throws Exception {
        document = new Document();
        FileOutputStream rech = new FileOutputStream(filename);
        PdfWriter writer = PdfWriter.getInstance(document, rech);
        document.open();
        cb = writer.getDirectContent();
        for (int i = 0; i < strImages.length; ++i) {
            addImage(strImages[i]);
        }
       
        document.close();
    }
   
    public void addImage(String strImageName) throws Exception {
        System.out.println(strImageName);
        File file = new File(strImageName);
        SeekableStream stream = new FileSeekableStream(strImageName);
        TIFFDirectory dir = new TIFFDirectory(stream, 0);
        String[] names = ImageCodec.getDecoderNames(stream);
        ImageDecoder dec = ImageCodec.createImageDecoder(names[0], stream,
                null);
        int total = dec.getNumPages();
        for (int k = 0; k < total; ++k) {
            RenderedImage ri = dec.decodeAsRenderedImage(k);
            Raster ra = ri.getData();
            BufferedImage bi = new BufferedImage(ri.getColorModel(), Raster
                    .createWritableRaster(ri.getSampleModel(), ra
                            .getDataBuffer(), null), false, new Hashtable());
            Image img = Image.getInstance(bi, null, true);

            long h = 0;
            long w = 0;
            long IFDOffset = dir.getIFDOffset();
            while (IFDOffset != 0L) {
                dir = new TIFFDirectory(stream, IFDOffset, 0);
                IFDOffset = dir.getNextIFDOffset();
                h = dir.getFieldAsLong(TIFFImageDecoder.TIFF_IMAGE_LENGTH);
                w = dir.getFieldAsLong(TIFFImageDecoder.TIFF_IMAGE_WIDTH);
            }
            float percent = 100;
            int pos = 0;
            if (w > 895)
                percent = ((595 + 18) * 100 / w);
            if (h > 842)
                pos = (int) (842 - h * percent / 100);
            else
                pos = (int) (842 - h);
            System.out.println(percent);
            System.out.println(pos);
            img.scalePercent(percent);
            img.setAbsolutePosition(0, pos);
            System.out.println("Image: " + k);

            cb.addImage(img);
            document.newPage();
        }
        stream.close();
        file.delete();
    }
   
    public static void main(String[] args) {
        try {
            String[] temp = {"1.tiff", "2.tiff", "3.tiff"};
            TiffToPDF build = new TiffToPDF("temp.pdf", temp);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值