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

.NET 6:替换System.Drawing为SkiaSharp实现Tiff转PDF

用SkiaSharp替代System.Drawing实现Tiff转PDF(基于PdfSharp)

所需NuGet包

  • SkiaSharp:核心SkiaSharp图形库
  • SkiaSharp.NativeAssets.xxx:对应平台的原生依赖包(如Windows平台用SkiaSharp.NativeAssets.Windows,Linux平台用SkiaSharp.NativeAssets.Linux)
  • PdfSharp(推荐.NET 7+使用PdfSharpCore以获得更好的兼容性)

等效实现代码

using SkiaSharp;
using PdfSharp.Drawing;
using PdfSharp.Pdf;
using System.IO;

// 从输入流读取Tiff并转换为PDF输出到目标流
using var multiFrameTiff = SKMultiFrameImage.FromStream(inStream);
var pdfDoc = new PdfDocument();

for (int pageIndex = 0; pageIndex < multiFrameTiff.FrameCount; pageIndex++)
{
    // 解码当前Tiff帧为Bitmap对象
    using var frameBitmap = multiFrameTiff.DecodeFrame(pageIndex);
    if (frameBitmap == null)
        continue;

    // 将SkiaSharp Bitmap编码为PNG内存流,供PdfSharp读取
    using var imageStream = new MemoryStream();
    frameBitmap.Encode(imageStream, SKEncodedImageFormat.Png, 100);
    imageStream.Seek(0, SeekOrigin.Begin);

    // 创建与图片尺寸匹配的PDF页面,将像素单位转换为PdfSharp的点单位
    var pdfPage = new PdfPage();
    pdfPage.Width = XUnit.FromPixels(frameBitmap.Width);
    pdfPage.Height = XUnit.FromPixels(frameBitmap.Height);
    pdfDoc.Pages.Add(pdfPage);

    // 将图片绘制到PDF页面
    using var xImage = XImage.FromStream(imageStream);
    using var graphics = XGraphics.FromPdfPage(pdfPage);
    graphics.DrawImage(xImage, 0, 0, pdfPage.Width, pdfPage.Height);
}

pdfDoc.Save(outStream);

关键逻辑说明

  • 多帧Tiff处理:用SKMultiFrameImage替代System.Drawing.Image,通过FrameCount获取总页数,DecodeFrame直接读取单帧内容,无需手动切换活跃帧。
  • 格式桥接:将SKBitmap编码为PNG流,让PdfSharp的XImage可以直接加载,完全脱离System.Drawing依赖。
  • 页面尺寸适配:通过XUnit.FromPixels将SkiaSharp的像素单位转换为PdfSharp的点单位,保证PDF页面与原Tiff帧尺寸一致,避免内容裁剪或空白。
  • 资源管理:全程使用using语句自动释放实现IDisposable的对象,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:20:28