You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用iTextSharp将TIFF字节数组转换为PDF字节数组?解决转换异常

解决iTextSharp将TIFF字节数组转PDF时的MemoryStream报错/损坏问题

我之前也踩过iTextSharp处理TIFF转PDF的坑,你遇到的内存流报错和PDF损坏问题,大概率是这几个常见原因导致的,给你整理了修复方案和完整代码:

常见问题根源

  • 多页TIFF未正确遍历:TIFF可能包含多页,直接处理单页会导致PDF内容缺失或损坏
  • MemoryStream位置未重置:写入PDF后没把流的Position设为0,后续读取时会从流的末尾开始,拿到空数据
  • 图像资源未释放:System.Drawing.Image使用后没调用Dispose(),导致内存泄漏或流被锁定引发报错
  • iTextSharp图像加载方式错误:直接从字节数组创建Image对象可能解析异常,建议通过Stream加载

修正后的完整代码

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

public byte[] ConvertTiffToPdf(byte[] tiffBytes)
{
    using (var tiffStream = new MemoryStream(tiffBytes))
    using (var outputStream = new MemoryStream())
    {
        // 初始化PDF文档
        var document = new Document();
        PdfWriter.GetInstance(document, outputStream);
        document.Open();

        try
        {
            // 加载TIFF图像,支持多页
            using (var tiffImage = Image.FromStream(tiffStream))
            {
                int pageCount = tiffImage.GetFrameCount(FrameDimension.Page);

                for (int i = 0; i < pageCount; i++)
                {
                    tiffImage.SelectActiveFrame(FrameDimension.Page, i);

                    // 将System.Drawing.Image转换为iTextSharp的Image对象
                    using (var pageStream = new MemoryStream())
                    {
                        tiffImage.Save(pageStream, ImageFormat.Png); // 转成PNG避免TIFF解析问题
                        pageStream.Position = 0;

                        var pdfImage = iTextSharp.text.Image.GetInstance(pageStream);
                        // 适配PDF页面大小,保持比例
                        pdfImage.ScaleToFit(document.PageSize.Width - 20, document.PageSize.Height - 20);
                        pdfImage.Alignment = Element.ALIGN_CENTER;

                        document.Add(pdfImage);
                        if (i != pageCount - 1) document.NewPage(); // 最后一页无需新增空页
                    }
                }
            }
        }
        finally
        {
            document.Close();
        }

        // 重置输出流位置,确保能读取到完整的PDF字节
        outputStream.Position = 0;
        return outputStream.ToArray();
    }
}

关键修复点说明

  • using语句包裹所有流和图像:确保资源自动释放,避免内存泄漏和流锁定问题
  • 遍历TIFF所有页面:通过GetFrameCount和SelectActiveFrame处理多页TIFF,同时避免最后一页生成空页
  • 中间转PNG格式:规避iTextSharp直接解析TIFF时的兼容性问题
  • 重置MemoryStream的Position:写入完成后必须把位置设为0,否则ToArray()会返回空数组或不完整数据
  • 适配PDF页面大小:防止图像超出页面范围导致PDF显示异常

如果还是报错,可以检查:

  • TIFF字节数组是否完整(有没有传输或读取时的截断)
  • iTextSharp的版本是否过时,建议更新到最新稳定版
  • 系统是否缺少GDI+相关依赖(影响System.Drawing.Image的处理)

内容的提问来源于stack exchange,提问作者Charles Hleas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:53:11