编辑
2025-09-30
C#
00

目录

什么是ZXing.Net
开始一个项目
使用ZXing.Net.Bindings.ImageSharp.V2
这个类用比较简单ZXing.Net.Bindings.Windows.Compatibility
调用打印机

什么是ZXing.Net

ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口。而ZXing.Net是ZXing的端口之一。

开始一个项目

nuget安装SqlSugarCore

这里还需要做一个配制文件,用于保存一个配制信息,如数据库等等

安装Microsoft.Extensions.Configuration,用于读取配制文件,这是一个接口

安装Microsoft.Extensions.Configuration.Json

image.png

Config.json

JSON
{ "ConnectionString": "Server=127.0.0.1;Database=bzscada;Max Pool Size=50;Min Pool Size=5;Uid=sa;Pwd=123" // 库连接字符串 }

Conifg.cs配制保存类

C#
public class Config { public static string connectionString { get; set; } = ""; }

我们在窗口启动时加载配制

C#
static void Main() { ConfigurationBuilder builder = new ConfigurationBuilder(); builder.AddJsonFile("config.json", true, true); IConfigurationRoot root = builder.Build(); Config.connectionString = root["ConnectionString"] ?? ""; // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); Application.Run(new FrmMain()); }

Repository.cs一个仓库类,用于数据库操作

C#
public class Repository<T>:SimpleClient<T> where T : class,new() { public Repository(ISqlSugarClient context) : base(context) { base.Context = new SqlSugarClient(new ConnectionConfig { ConnectionString=Config.connectionString, DbType=DbType.SqlServer, IsAutoCloseConnection=true }); } }

实体类wms_inventory

C#
public class wms_inventory { [SqlSugar.SugarColumn(IsPrimaryKey =true)] public Guid id { get; set; } public string asn_no { get; set; } public string part_no { get; set; } public int qty { get; set; } public string box_no{get;set;} public string rack_no { get; set; } }

服务类inventoryService

C#
public class inventoryService : Repository<wms_inventory> { public inventoryService() { } public async Task<List<wms_inventory>> Get() { return await base.AsQueryable().Take(100).ToListAsync(); } }

列表

C#
List<ListViewItem> CacheSource = new List<ListViewItem>();
C#
public void Init() { lsvMain.Columns.Add("asn_no"); lsvMain.Columns.Add("part_no"); lsvMain.Columns.Add("qty"); lsvMain.Columns.Add("box_no"); lsvMain.Columns.Add("rack_no"); }
C#
private void LoadItems() { lsvMain.Items.Clear(); lsvMain.GridLines = true; lsvMain.FullRowSelect = true; lsvMain.View = View.Details; lsvMain.Scrollable = true; lsvMain.MultiSelect = false; lsvMain.HeaderStyle = ColumnHeaderStyle.Clickable; lsvMain.Visible = true; lsvMain.VirtualListSize = CacheSource.Count; lsvMain.VirtualMode = true; lsvMain.RetrieveVirtualItem += LsvMain_RetrieveVirtualItem; //虚模式加载 }
C#
private void LsvMain_RetrieveVirtualItem(object? sender, RetrieveVirtualItemEventArgs e) { if (this.CacheSource == null || this.CacheSource.Count == 0) { return; } e.Item = this.CacheSource[e.ItemIndex]; if (e.ItemIndex == this.CacheSource.Count) { this.CacheSource = null; } }
C#
private async void btnLoad_Click(object sender, EventArgs e) { inventoryService inventory = new inventoryService(); var lst = await inventory.Get(); foreach (var item in lst) { ListViewItem it = new ListViewItem(); it.Text = item.asn_no; it.SubItems.Add(item.part_no); it.SubItems.Add(item.qty.ToString()); it.SubItems.Add(item.box_no); it.SubItems.Add(item.rack_no); CacheSource.Add(it); } LoadItems(); }

使用ZXing.Net.Bindings.ImageSharp.V2

lsvMain_ItemSelectionChanged 事件

C#
private List<ListViewItem> FindSelectedAll() { List<ListViewItem> r = new List<ListViewItem>(); foreach (int item in lsvMain.SelectedIndices) { r.Add(CacheSource[item]); } return r; }
C#
List<ListViewItem> selected = FindSelectedAll(); string codeType = "QR_CODE"; BarcodeFormat codeformat = (BarcodeFormat)Enum.Parse(typeof(BarcodeFormat), codeType); ZXing.BarcodeWriter<Rgba32> writer = new ZXing.BarcodeWriter<Rgba32>(); QrCodeEncodingOptions qr = new QrCodeEncodingOptions() { CharacterSet = "UTF-8", ErrorCorrection = ZXing.QrCode.Internal.ErrorCorrectionLevel.H, Height = picPartNo.Width, Width = picPartNo.Height, Margin = 0//默认应该是1 }; writer.Options = qr; writer.Format = codeformat; var image = writer.WriteAsImageSharp<Rgba32>(selected[0].SubItems[1].Text); var ms = new MemoryStream(); await image.SaveAsync(ms, new PngEncoder()); System.Drawing.Image img = System.Drawing.Image.FromStream(ms); picPartNo.Image= img;

这个类用比较简单ZXing.Net.Bindings.Windows.Compatibility

C#
List<ListViewItem> selected = FindSelectedAll(); BarcodeWriter writer = new BarcodeWriter(); writer.Options = new ZXing.Common.EncodingOptions { Width = picPartNo.Width, Height = picPartNo.Height, Margin = 0, }; writer.Format = BarcodeFormat.QR_CODE; Bitmap bitmap = writer.WriteAsBitmap(selected[0].SubItems[1].Text); picPartNo.Image = bitmap;

code128码条

C#
writer.Options = new ZXing.Common.EncodingOptions { Width = picQty.Width, Height = picQty.Height, Margin = 0, }; writer.Format = BarcodeFormat.CODE_128; Bitmap bitmap2 = writer.WriteAsBitmap(selected[0].SubItems[2].Text); picQty.Image = bitmap2;

image.png

条码读取

C#
BarcodeReader barcodeReader = new BarcodeReader(); OpenFileDialog dialog=new OpenFileDialog(); if (dialog.ShowDialog() == DialogResult.OK) { System.Drawing.Image img = Bitmap.FromFile(dialog.FileName); var ret= barcodeReader.Decode((Bitmap)img); MessageBox.Show(ret.Text); }

将条码保存到图片

C#
private void picQty_Click(object sender, EventArgs e) { SaveFileDialog saveFile = new SaveFileDialog(); if (saveFile.ShowDialog() == DialogResult.OK) { picQty.Image.Save(saveFile.FileName); } }

在条码基础上重画

C#
Graphics g = picCode.CreateGraphics(); g.Clear(Color.White); g.DrawImage(bitmap1, 0, 0); g.DrawString(selected[0].SubItems[1].Text, new Font("宋体", 14) , new SolidBrush(Color.Red), new PointF(0, bitmap1.Height) ); Font f = new Font("宋体", 36); string measureString = selected[0].SubItems[2].Text; SizeF stringSize = new SizeF(); stringSize =g.MeasureString(measureString, f); g.DrawString(selected[0].SubItems[2].Text, f , new SolidBrush(Color.Blue), new PointF(bitmap1.Width , (bitmap1.Height- stringSize.Height)/ 2) );

image.png

C#
private async void lsvMain_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) { List<ListViewItem> selected = FindSelectedAll(); string codeType = "QR_CODE"; BarcodeFormat codeFormat = (BarcodeFormat)Enum.Parse(typeof(BarcodeFormat), codeType); //GDI+ ZXing.BarcodeWriter<Rgba32> writer = new BarcodeWriter<Rgba32>(); QrCodeEncodingOptions qr = new QrCodeEncodingOptions() { CharacterSet = "UTF-8", ErrorCorrection = ZXing.QrCode.Internal.ErrorCorrectionLevel.H, Height = pic1.Height, Width = pic1.Width, Margin = 0 }; writer.Options = qr; writer.Format = codeFormat; var image = writer .WriteAsImageSharp<Rgba32>(selected[0].SubItems[1].Text); var ms = new MemoryStream(); await image.SaveAsync(ms, new PngEncoder()); var pubimg = Image.FromStream(ms); pic1.Image = pubimg; BarcodeWriter writer1 = new BarcodeWriter(); writer.Options = new ZXing.Common.EncodingOptions { Width = pic2.Width, Height = pic2.Height, Margin = 0, }; writer.Format = BarcodeFormat.CODE_128; Bitmap bitmap2 = writer.WriteAsBitmap(selected[0].SubItems[2].Text); pic2.Image = bitmap2; Bitmap bitmap3 = new Bitmap(pictureBox1.Width, pictureBox1.Height); Graphics g = Graphics.FromImage(bitmap3); g.Clear(Color.White); g.DrawImage(pubimg, 0, 0); g.DrawString(selected[0].SubItems[1].Text , new Font("宋体", 14) , new SolidBrush(Color.Red) , new PointF(0, pubimg.Height)); Font f = new Font("宋体", 36); string measureString = selected[0].SubItems[2].Text; SizeF stringSize = new SizeF(); stringSize = g.MeasureString(measureString, f); g.DrawString(selected[0].SubItems[2].Text, f , new SolidBrush(Color.Blue), new PointF(pubimg.Width , (pubimg.Height - stringSize.Height) / 2) ); pictureBox1.Image = bitmap3; }

调用打印机

C#
private void btnPrint_Click(object sender, EventArgs e) { PrintDocument document = new PrintDocument(); document.DefaultPageSettings.PrinterSettings .PrinterName = "Microsoft Print to PDF"; PaperSize psz = new PaperSize(); psz.RawKind = 0;// Printing.PaperKind.Custom此枚举的值是0 psz.Width = 350; psz.Height = 350; document.DefaultPageSettings.PaperSize = psz; //设置纸张大小 document.PrintPage += Document_PrintPage; document.Print(); } private void Document_PrintPage(object sender, PrintPageEventArgs e) { e.Graphics.DrawImage(pictureBox1.Image,new Point(0,0)); }

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!