.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
相关产品推荐
相关产品推荐

