C#实现二维码和条形码生成与打印
一、技术选型与依赖库
核心库选择
-
ZXing.Net:开源条码处理库,支持QR Code、Code 128等格式
Install-Package ZXing.Net
-
QRCoder:纯C#实现的二维码生成库
Install-Package QRCoder
二、代码实现
2.1 二维码生成(ZXing.Net)
using ZXing;
using ZXing.Common;public class QRCodeGenerator
{public Bitmap GenerateQRCode(string content, int size = 300){var writer = new BarcodeWriter{Format = BarcodeFormat.QR_CODE,Options = new EncodingOptions{Width = size,Height = size,Margin = 1,PureBarcode = true}};// 添加纠错级别(L/M/Q/H)writer.Options.Hints.Add(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);return writer.Write(content);}
}
2.2 条形码生成(Code 128)
public class BarcodeGenerator
{public Bitmap GenerateCode128(string data){var options = new EncodingOptions{Height = 100,Width = 400,Margin = 2};using (var writer = new BarcodeWriter{Format = BarcodeFormat.CODE_128,Options = options}){return writer.Write(data);}}
}
三、图像处理与优化
3.1 图像增强
public Bitmap EnhanceImage(Bitmap source)
{using (var graphics = Graphics.FromImage(source)){graphics.SmoothingMode = SmoothingMode.AntiAlias;graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;graphics.PixelOffsetMode = PixelOffsetMode.HighQualityBilinear;// 添加边框var border = new Pen(Color.Black, 2);graphics.DrawRectangle(border, 0, 0, source.Width-1, source.Height-1);return source;}
}
3.2 图像保存
public void SaveImage(Bitmap image, string path)
{ImageCodecInfo jpegEncoder = GetEncoder(ImageFormat.Jpeg);EncoderParameters encoderParams = new EncoderParameters(1);encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 90L);image.Save(path, jpegEncoder, encoderParams);
}private ImageCodecInfo GetEncoder(ImageFormat format)
{ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();foreach (var codec in codecs){if (codec.FormatID == format.Guid)return codec;}return null;
}
四、打印实现方案
4.1 本地打印(Win32 API)
using System.Drawing.Printing;public class PrinterService
{public void PrintBitmap(Bitmap image){using (var printDoc = new PrintDocument()){printDoc.PrinterSettings.PrinterName = "Zebra ZT410"; // 指定打印机printDoc.DefaultPageSettings.PaperSize = new PaperSize("Custom", 400, 300);printDoc.PrintPage += (s, e) => {e.Graphics.DrawImage(image, 0, 0, image.Width, image.Height);};printDoc.Print();}}
}
4.2 网络打印(TCP/IP)
public class NetworkPrinter
{public void SendToPrinter(string ip, Bitmap image){using (var client = new TcpClient(ip, 9100)){using (var stream = client.GetStream()){var ms = new MemoryStream();image.Save(ms, ImageFormat.Png);stream.Write(ms.ToArray(), 0, ms.Length);}}}
}
五、高级功能实现
5.1 ZPL指令打印(斑马打印机)
public string GenerateZPL(string content)
{return $@"^XA^FO50,50^BQN,2,8^FD{content}^FS^XZ";
}// 发送指令
using (var client = new TcpClient("192.168.1.100", 9100))
{NetworkStream stream = client.GetStream();byte[] data = Encoding.ASCII.GetBytes(zplCommand);stream.Write(data, 0, data.Length);
}
5.2 批量打印管理
public class PrintQueue
{private Queue<PrintJob> _jobs = new Queue<PrintJob>();public void Enqueue(PrintJob job){_jobs.Enqueue(job);}public async Task ProcessQueueAsync(){while (_jobs.Count > 0){var job = _jobs.Dequeue();await PrintService.PrintAsync(job.Bitmap);await Task.Delay(1000); // 防卡纸间隔}}
}
参考代码 C#二维码和条形码生成 打印处理 www.youwenfan.com/contentcsj/57421.html
六、异常处理与日志
6.1 异常捕获
public void SafePrint(Action printAction)
{try{printAction();}catch (TimeoutException ex){Logger.LogError($"打印超时: {ex.Message}");RestartPrinter();}catch (IOException ex){Logger.LogError($"设备断开: {ex.Message}");}
}
6.2 日志记录
public static class Logger
{private static readonly string logPath = "print_log.txt";public static void LogError(string message){File.AppendAllText(logPath, $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} [ERROR] {message}{Environment.NewLine}");}
}
七、性能优化
-
图像缓存
private static Dictionary<string, Bitmap> _imageCache = new Dictionary<string, Bitmap>();public Bitmap GetCachedImage(string key, Func<Bitmap> generateFunc) {if (!_imageCache.ContainsKey(key)){_imageCache[key] = generateFunc();}return _imageCache[key]; }
-
异步处理
public async Task<Bitmap> GenerateAsync(string data) {return await Task.Run(() => GenerateQRCode(data)); }
-
批量生成优化
public void BatchGenerate(List<string> dataList) {Parallel.ForEach(dataList, item => {var img = GenerateQRCode(item);SaveImage(img, $"{Guid.NewGuid()}.png");}); }
八、部署建议
-
硬件要求
- 最低配置:i5-8代/8GB内存
- 推荐配置:i7-12代/16GB内存+NVIDIA显卡(GPU加速)
-
环境配置
<!-- app.config --> <configuration><system.drawing><PrinterSettings><add key="DefaultPrinter" value="Zebra ZT410"/></PrinterSettings></system.drawing> </configuration>
-
安全措施
- 打印内容加密:AES加密敏感数据
- 访问控制:IP白名单验证
public bool ValidateIP(string ip) {return allowedIPs.Contains(ip); }
九、测试用例
[TestClass]
public class PrintTests
{[TestMethod]public void TestQRCodePrint(){var generator = new QRCodeGenerator();var bitmap = generator.GenerateQRCode("https://test.com");using (var ms = new MemoryStream()){bitmap.Save(ms, ImageFormat.Png);Assert.IsTrue(ms.Length > 1024); // 最小尺寸验证}}
}