读取多页 Tiff 图像并用 Java 写入 pdf

Abh*_*raj 2 java pdf tiff image pdfbox

我正在尝试使用 PDFBox 将多页 tiff 转换为 pdf,但没有成功。我无法在公司中使用 apache 图像共享,因为它不是稳定版本。

问题:无法读取多个 tiff 并写入 pdf。

到目前为止的工作解决方案:只有第一页被写入并保存为 pdf。此外,当 tiff 是单个页面时,它也可以工作。

下面是代码:

    PDDocument doc = new PDDocument();
    log.info("Read Image");

    log.info("Process Image parts");

    //Get the number of pages
    int pages = 0;
    try(ImageInputStream imageInputStream = ImageIO.createImageInputStream(new File("src/main/resources/output/testpdf.tiff"))) {
        if (imageInputStream != null && imageInputStream.length() != 0) {
            Iterator<ImageReader> iteratorIO = ImageIO.getImageReaders(imageInputStream);
            if (iteratorIO != null && iteratorIO.hasNext()) {
                ImageReader reader = iteratorIO.next();
                reader.setInput(imageInputStream);
                pages = reader.getNumImages(true);
                log.info("Number of pages in the tiff is " + pages);

            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

//这里需要一个阅读器来查看不同的页面吗?

        for (int i=0; i<pages; i++) {

        BufferedImage bimage = ImageIO.read(file);

        PDPage page = new PDPage();
        doc.addPage(page);
        PDPageContentStream contentStream = new PDPageContentStream(doc, page);
        try {
            // the .08F can be tweaked. Go up for better quality,
            // but the size of the PDF will increase
            PDImageXObject image = JPEGFactory.createFromImage(doc, bimage, 0.08f);
            Dimension scaledDim = getScaledDimension(new Dimension(image.getWidth(), image.getHeight()),
                    new Dimension((int) page.getMediaBox().getWidth(), (int) page.getMediaBox().getHeight()));
            contentStream.drawImage(image, 1, 1, scaledDim.width, scaledDim.height);
        } finally {
            contentStream.close();
        }
    }

    doc.save("src/main/resources/output/testpdf.pdf");
    doc.close();
Run Code Online (Sandbox Code Playgroud)

我需要想出一个不是由 ImageIO 提供的阅读器吗?或者我是否需要将 tiff 多页拆分为单个页面,然后写入 pdf?

我对图像处理的工作不多,但很欣赏转换过程后 ImageIO 的质量水平!

谢谢

小智 8

试试这个,你需要 PDFBox jar 和 sun.jai.codec jar

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;

import com.sun.media.jai.codec.FileSeekableStream;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageDecoder;
import com.sun.media.jai.codec.SeekableStream;
import com.sun.media.jai.codec.TIFFDecodeParam;

public class FinalTtoP {
public static void main(String args[]) throws IOException
{
    PDDocument document=new PDDocument();
    File file = new File("C:/nn.tif"); //Enter Tiff file path

    ImageInputStream isb = ImageIO.createImageInputStream(file);


    Iterator<ImageReader> iterator = ImageIO.getImageReaders(isb);
    if (iterator == null || !iterator.hasNext()) 
    {
      throw new IOException("Image file format not supported by ImageIO: ");
    }

    ImageReader reader = (ImageReader) iterator.next();
    iterator = null;
    reader.setInput(isb);

    int nbPages = reader.getNumImages(true);


    System.out.println(nbPages);


    for(int p=0;p<nbPages;p++)
    {
      BufferedImage bufferedImage = reader.read(p);

      PDPage page = new PDPage();
      document.addPage(page);

      PDImageXObject i = LosslessFactory.createFromImage(document, bufferedImage);

      PDPageContentStream content =new PDPageContentStream(document, page);
      content.drawImage(i, 0,0 ,page.getMediaBox().getWidth(),page.getMediaBox().getHeight());

      content.close();
    }
    document.save("C:/nnnnm.pdf"); //Enter path to save your file with .pdf extension
    document.close();
}

}
Run Code Online (Sandbox Code Playgroud)