读取多页Tiff图像,并在Java中写入pdf

读取多页Tiff图像,并在Java中写入pdf,java,image,pdf,pdfbox,tiff,Java,Image,Pdf,Pdfbox,Tiff,我正在尝试使用PDFBox将多页tiff转换为pdf,但没有成功。我不能在公司中使用apache imaging commons,因为它不是一个稳定的版本 问题:无法读取多tiff并写入pdf 到目前为止的工作解决方案:只有第一页被写入并保存为pdf。此外,当tiff是单个页面时,它也可以工作 代码如下: PDDocument doc = new PDDocument(); log.info("Read Image"); log.info("Process Image

我正在尝试使用PDFBox将多页tiff转换为pdf,但没有成功。我不能在公司中使用apache imaging commons,因为它不是一个稳定的版本

问题:无法读取多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);

            }
        }
    }
PDDocument doc=新的PDDocument();
log.info(“读取图像”);
日志信息(“处理图像部件”);
//获取页数
int pages=0;
try(ImageInputStream ImageInputStream=ImageIO.createImageInputStream(新文件(“src/main/resources/output/testpdf.tiff”)){
if(imageInputStream!=null&&imageInputStream.length()!=0){
迭代器迭代器IO=ImageIO.getImageReaders(imageInputStream);
if(iteratorIO!=null&&iteratorIO.hasNext()){
ImageReader=iteratorIO.next();
reader.setInput(imageInputStream);
pages=reader.getNumImages(true);
log.info(“tiff中的页数为”+页);
}
}
}
//需要不同页面的阅读器吗

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

for(int i=0;i您可以使用
CCITTFactory.createFromFile(PDDocument document,File File File,int number)
它适用于大多数二进制tiff文件。如果该文件不起作用(因为tiff文件是平铺的或彩色的),则将各个页面读取到BuffereImage对象中(请参阅)然后使用无损工厂.createFromImage(PDDocument文档,BuffereImage图像)
生成结果。

试试这个,你需要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();
}

}
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.util.Iterator;
导入javax.imageio.imageio;
导入javax.imageio.ImageReader;
导入javax.imageio.stream.ImageInputStream;
导入org.apache.pdfbox.pdmodel.PDDocument;
导入org.apache.pdfbox.pdmodel.PDPage;
导入org.apache.pdfbox.pdmodel.PDPageContentStream;
导入org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
导入org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
导入com.sun.media.jai.codec.FileSeekableStream;
导入com.sun.media.jai.codec.ImageCodec;
导入com.sun.media.jai.codec.ImageDecoder;
导入com.sun.media.jai.codec.SeekableStream;
导入com.sun.media.jai.codec.TIFFDecodeParam;
公共类财务报表{
公共静态void main(字符串args[])引发IOException
{
PDDocument文档=新PDDocument();
File File=new File(“C:/nn.tif”);//输入Tiff文件路径
ImageInputStream isb=ImageIO.createImageInputStream(文件);
迭代器迭代器=ImageIO.getImageReaders(isb);
if(iterator==null | |!iterator.hasNext())
{
抛出新IOException(“ImageIO不支持图像文件格式:”);
}
ImageReader=(ImageReader)迭代器。下一步();
迭代器=null;
reader.setInput(isb);
int nbPages=reader.getNumImages(true);
系统输出打印项次(nbPages);

对于(int p=0;p参考此代码,它将提高速度,但仍然很慢,然后需要使用itext

public static byte[] convertTiffToPdf(File tiffFile) throws IOException {

    ByteArrayOutputStream outStream  = null;
    PDDocument document = null;
    ImageInputStream imgInputStream = null;
    try {

        outStream = new ByteArrayOutputStream();

        document = new PDDocument();
        PDRectangle pageSize = PDRectangle.LETTER;

        int noOfPages = 0;

        imgInputStream = ImageIO.createImageInputStream(tiffFile);

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

        noOfPages = reader.getNumImages(true);
        
        
        for (int i = 0; i < noOfPages; i++) {
            PDPageContentStream content = null;
            try {
            BufferedImage bufferedImage = reader.read(i);

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

            // PDImageXObject imgObject = LosslessFactory.createFromImage(document, bufferedImage); //Commented for PR 1028
            PDImageXObject imgObject = CCITTFactory.createFromFile(document, tiffFile, i); //PR 1028 
            
            //PDImageXObject imgObject = JPEGFactory.createFromImage(document, bufferedImage);

            content = new PDPageContentStream(document, page);
            content.drawImage(imgObject, 0, 0, pageSize.getWidth(), pageSize.getHeight());
            
            
            } catch(Exception e) {
                e.printStackTrace();
            } finally {
                content.close();
            }
        }

        document.save(outStream);
        byte[] fileBytes = outStream.toByteArray();

        return fileBytes;
    } finally {
        if (document != null) {
            document.close();
        }
        if (imgInputStream != null) {
            imgInputStream.close();
        }
        if (outStream != null) {
            outStream.close();
        }
    }
}
public static byte[]convertTiffToPdf(文件tiffFile)引发IOException{
ByteArrayOutputStream超出流=空;
PDDocument文件=null;
ImageInputStream imgInputStream=null;
试一试{
扩展流=新的ByteArrayOutputStream();
文档=新的PDDocument();
PDRectangle pageSize=PDRectangle.LETTER;
int noOfPages=0;
imgInputStream=ImageIO.createImageInputStream(TIFF文件);
迭代器迭代器=ImageIO.getImageReaders(imgInputStream);
if(iterator==null | |!iterator.hasNext()){
抛出新IOException(“ImageIO不支持图像文件格式:”);
}
ImageReader=(ImageReader)迭代器。下一步();
迭代器=null;
reader.setInput(imgInputStream);
noOfPages=reader.getNumImages(true);
对于(int i=0;i
请尝试
CCITTFactory.createFromFile(PDDocument document,File File File,int number)
您当前所做的(压缩为jpeg)是一个坏主意,因为这种压缩是有损的。这主要适用于照片,而不是文本扫描。请使用CCITTFactory,或者将tiff图像读入缓冲区图像(请参阅)然后使用无损工厂。@TilmanHausher使用CCITTFactory.createFromFile(PDDocument文档、文件文件、整数)帮助阻止程序。谢谢您在这里使用com.sun.media