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

5

我正在尝试使用iText 7.1.1将TIFF图像转换为多页PDF文件。感谢这篇文章Create PDF from TIFF image using iText的启发,但它是iText 5.5.x版本的,我无法在iText 7中复制它。

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

然而,我无法在iText7中替换TiffImage.getTiffImage(rafa, i)。我需要使用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();            
}
3个回答

5

我需要使用 new Image( 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);
            }
        }
    }
}

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


2

以下是使用VB.NET实现的相同功能。它将多页TIFF转换为PDF。

Imports System.IO
Imports iTextSharp.text
Imports iTextSharp.text.pdf

Sub ConvertTIFF2PDF(ByVal inFile As String, ByVal outFile As String)  

    Dim pdfDoc As PdfDocument = New PdfDocument(New PdfWriter(outFile))
    Dim doc As Document = New Document(pdfDoc)

    Dim aFile = New RandomAccessFileOrArray(New RandomAccessSourceFactory().CreateBestSource(inFile.ToString))

    Dim tiffPages = TiffImageData.GetNumberOfPages(aFile)


    Dim uri As System.Uri = New Uri(inFile)


    For i As Integer = 1 To tiffPages

        Console.WriteLine("tiffPages: " & (i) & " of " & tiffPages.ToString)

        Dim tiffImage = ImageDataFactory.CreateTiff(uri, False, i, False)
        Dim tiffPageSize = New Geom.Rectangle(tiffImage.GetWidth(), tiffImage.GetHeight())
        Dim newPage = pdfDoc.AddNewPage(New PageSize(tiffPageSize))
        Dim canvas As PdfCanvas = New PdfCanvas(newPage)
        canvas.AddImage(tiffImage, tiffPageSize, False)

    Next


    doc.Close()
    pdfDoc.Close()
    aFile.Close()

End Sub

0

这只是C#版本:

public void ConvertTIFF2PDF(string inFile, string outFile)
    {

        iTextSharp.text.Document document = new iTextSharp.text.Document(iTextSharp.text.PageSize.A4, 0, 0, 0, 0);

        iTextSharp.text.pdf.PdfWriter writer = iTextSharp.text.pdf.PdfWriter.GetInstance(document, new FileStream(outFile, FileMode.Open));

        Bitmap bm = new Bitmap(inFile);
        int total = bm.GetFrameCount(FrameDimension.Page);

        document.Open();
        iTextSharp.text.pdf.PdfContentByte cb = writer.DirectContent;
        for (int k = 0; k < total; ++k)
        {
            bm.SelectActiveFrame(FrameDimension.Page, k);
            iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(bm, ImageFormat.Bmp);

            // scale the image to fit in the page
            img.ScalePercent(72f / img.DpiX * 100);
            img.SetAbsolutePosition(0, 0);
            cb.AddImage(img);
            document.NewPage();
        }
        document.Close();

    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接