Linux环境下Bitmap转ImageSource内存流插入PdfSharpCore PDF问题
跨平台解决DataMatrix条形码插入PDFSharpCore的问题
问题根源在于System.Drawing.Common(Bitmap所属的库)在.NET Core/.NET 5+中被标记为仅Windows平台支持,Linux环境下无法正常使用其图像转换和保存功能,同时ImageSource通常是WPF/UWP专属类型,非GUI的Linux环境也无法兼容。
以下是两种跨平台解决方案,均无需依赖Windows专属API:
方案一:使用SkiaSharp(推荐,与PDFSharpCore兼容性好)
1. 安装依赖NuGet包
SkiaSharpSkiaSharp.NativeAssets.Linux(Linux环境需额外安装)PdfSharpCore.SkiaSharp(替换PDFSharp的默认GDI+后端)
2. 修改代码
using SkiaSharp; using PdfSharpCore.Drawing; using PdfSharpCore.Pdf; // 初始化PDFSharp的Skia后端(全局只需初始化一次) PdfSharpCore.GlobalSettings.FontResolver = new PdfSharpCore.Fonts.SkiaFontResolver(); // 生成DataMatrix条形码Bitmap var barcodeEncoder = new DmtxImageEncoder(); var barcode = barcodeEncoder.EncodeImage(generateBarcodeResponse.BarcodeData); // 将System.Drawing.Bitmap转换为跨平台的SKBitmap using var skBitmap = SKBitmap.FromImage(SKImage.FromBitmap(barcode)); // 将条形码保存为PNG格式的内存流(PNG更适合条形码的清晰显示) using var barcodeStream = new MemoryStream(); skBitmap.Encode(barcodeStream, SKEncodedImageFormat.Png, 100); barcodeStream.Position = 0; // 直接从流加载为PDFSharp可用的XImage var xImg = XImage.FromStream(() => barcodeStream); // 示例:将条形码绘制到PDF页面 var document = new PdfDocument(); var page = document.AddPage(); using var gfx = XGraphics.FromPdfPage(page); gfx.DrawImage(xImg, 50, 50, 150, 150); // 调整位置和尺寸 // 保存PDF document.Save("output.pdf");
方案二:使用ImageSharp
1. 安装依赖NuGet包
SixLabors.ImageSharpPdfSharpCore.SkiaSharp
2. 修改代码
using SixLabors.ImageSharp; using SixLabors.ImageSharp.Formats.Png; using PdfSharpCore.Drawing; using PdfSharpCore.Pdf; // 初始化PDFSharp的Skia后端 PdfSharpCore.GlobalSettings.FontResolver = new PdfSharpCore.Fonts.SkiaFontResolver(); // 生成条形码Bitmap var barcodeEncoder = new DmtxImageEncoder(); var barcode = barcodeEncoder.EncodeImage(generateBarcodeResponse.BarcodeData); // 转换为ImageSharp的Image对象 using var image = Image.Load(barcode); // 保存为PNG流 using var barcodeStream = new MemoryStream(); image.Save(barcodeStream, new PngEncoder()); barcodeStream.Position = 0; // 加载为XImage并绘制到PDF var xImg = XImage.FromStream(() => barcodeStream); var document = new PdfDocument(); var page = document.AddPage(); using var gfx = XGraphics.FromPdfPage(page); gfx.DrawImage(xImg, 50, 50, 150, 150); document.Save("output.pdf");
关键注意事项
- 避免使用
ImageSource和System.Drawing的图像转换API,改用跨平台库处理图像流 - 必须安装
PdfSharpCore.SkiaSharp,否则PDFSharp在Linux下无法正常渲染图像和字体 - 条形码优先使用PNG格式保存,避免JPEG的压缩失真影响扫码识别
内容的提问来源于stack exchange,提问作者Robb Sadler
相关产品推荐
相关产品推荐

