【问题标题】:iText7: Creating PDF from TIFF multipage image using iTextiText7:使用 iText 从 TIFF 多页图像创建 PDF
【发布时间】:2018-03-21 19:19:52
【问题描述】:

我正在尝试使用 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();            
}

【问题讨论】:

    标签: tiff itext7 multipage


    【解决方案1】:

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

    是的。

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

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

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

    这是 Bruno Lowagie 关于将 TIFF 与 iText 7 结合使用的说明:How to avoid an exception when importing a TIFF file?

    我看到您可能想要完整的工作代码。给你:

    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
      

      【讨论】:

        【解决方案3】:

        这只是 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();
        
            }
        

        【讨论】:

          猜你喜欢
          • 2011-12-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-02
          • 1970-01-01
          相关资源
          最近更新 更多