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

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包

  • SkiaSharp
  • SkiaSharp.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.ImageSharp
  • PdfSharpCore.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:01:29