iText7:使用 iText 从 TIFF 多页图像创建 PDF

use*_*980 5 tiff multipage itext7

我正在尝试使用 iText 7.1.1 将 TIFF 图像转换为多页 PDF 文件。感谢那些让我开始阅读这篇文章使用 iText 从 TIFF 图像创建 PDF 的人。但是,它是 iText 5.5.x,我很难在 iText 7 中复制它。

我确实找到了TiffImageData.getNumberOfPages(raf)替换int pages = TiffImage.getNumberOfPages(rafa)

但是,我无法TiffImage.getTiffImage(rafa, i)在 iText7 中进行替换。我需要使用new Image(ImageDataFactory.createTiff(...)). 感谢任何建议。

iText 5.5.x 代码

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();            
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*gle 5

我需要使用新的图像( ImageDataFactory.createTiff(...))

是的。

你想要这个:ImageDataFactory.createTiff(bytes,recoverFromImageError,page,direct)

然后您将打开一个新的 PDF,循环浏览 TIFF 页面并:

  1. 获取 TIFF 图像大小
  2. 在 PDF 中创建与 TIFF 页面大小匹配的新页面
  3. 将 TIFF 图像添加到新的 PDF 页面

以下是 Bruno Lowagie 关于在 iText 7 中使用 TIFF 的注释:如何在导入 TIFF 文件时避免异常?

我发现您可能想要完整工作的代码。干得好:

import com.itextpdf.io.image.ImageData;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.io.image.TiffImageData;
import com.itextpdf.io.source.RandomAccessFileOrArray;
import com.itextpdf.io.source.RandomAccessSourceFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;

public class TiffToPdf {
    public static void main(String[] args) throws IOException {
        Path tiffFile = Paths.get("/myfolder/origin.tiff");
        RandomAccessFileOrArray raf = new RandomAccessFileOrArray(new RandomAccessSourceFactory().createBestSource(tiffFile.toString()));
        int tiffPages = TiffImageData.getNumberOfPages(raf);
        raf.close();
        try (PdfDocument output = new PdfDocument(new PdfWriter("/myfolder/destination.pdf"))) {
            for (int page = 1; page <= tiffPages; page++) {
                ImageData tiffImage = ImageDataFactory.createTiff(tiffFile.toUri().toURL(), true, page, true);
                Rectangle tiffPageSize = new Rectangle(tiffImage.getWidth(), tiffImage.getHeight());
                PdfPage newPage = output.addNewPage(new PageSize(tiffPageSize));
                PdfCanvas canvas = new PdfCanvas(newPage);
                canvas.addImage(tiffImage, tiffPageSize, false);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有些人可能建议您使用高级 API 来更干净地实现这一点,但这对于您的问题来说应该足够了。