如何将条形码添加至FlowDocument以实现打印?
解决FlowDocument中插入BarcodeLib生成的条形码图片问题
你遇到的核心问题是BarcodeLib生成的SKImage无法直接加入FlowDocument——因为FlowDocument只接受WPF原生的文档元素或UI控件。解决思路是先把SKImage转换成WPF兼容的BitmapSource,再封装成合适的容器添加到文档中。
步骤1:实现SKImage到BitmapSource的转换
写一个辅助方法,将SkiaSharp的图片转成WPF可识别的位图源:
using System.IO; using SkiaSharp; using System.Windows.Media.Imaging; BitmapSource ConvertSKImageToBitmapSource(SKImage skImage) { using var imageStream = new MemoryStream(); // 将SKImage编码为PNG流 skImage.Encode(SKEncodedImageFormat.Png, 100).SaveTo(imageStream); imageStream.Seek(0, SeekOrigin.Begin); var bitmapImage = new BitmapImage(); bitmapImage.BeginInit(); bitmapImage.CacheOption = BitmapCacheOption.OnLoad; // 确保流关闭后图片仍可用 bitmapImage.StreamSource = imageStream; bitmapImage.EndInit(); bitmapImage.Freeze(); // 冻结对象,提升性能并支持跨线程访问 return bitmapImage; }
步骤2:将条形码图片加入FlowDocument
修改你的原有代码,加入转换逻辑并使用BlockUIContainer嵌入图片:
using System.Windows.Controls; using System.Windows.Documents; using System.Windows; FlowDocument fDoc = new FlowDocument(); fDoc.PagePadding = new Thickness(50); Barcode b = new Barcode(); var img = b.Encode(BarcodeStandard.Type.Ean13, serialNum, 290, 120); // 转换图片格式 var bitmapSource = ConvertSKImageToBitmapSource(img); // 创建WPF Image控件,设置尺寸和间距 var barcodeImage = new Image { Source = bitmapSource, Width = 290, Height = 120, Margin = new Thickness(0, 0, 0, 20) // 与下方文本保持间距 }; // 用BlockUIContainer将图片添加到FlowDocument的块元素中 fDoc.Blocks.Add(new BlockUIContainer(barcodeImage) { HorizontalAlignment = HorizontalAlignment.Center // 可选:让条形码居中显示 }); // 添加原有文本段落 Paragraph p = new Paragraph(); p.FontSize = 12; p.Inlines.Add(labelText); fDoc.Blocks.Add(p);
额外说明
- 如果需要将条形码和文本放在同一行,可替换
BlockUIContainer为InlineUIContainer,并将其加入Paragraph的Inlines集合中。 - 确保项目已引用
SkiaSharp和SkiaSharp.WpfNuGet包,否则可能出现类型找不到的问题。
内容的提问来源于stack exchange,提问作者Kc491
相关产品推荐
相关产品推荐

