基于C#實現(xiàn)二維碼和條形碼生成與打印
一、技術(shù)選型與依賴庫
核心庫選擇
ZXing.Net:開源條碼處理庫,支持QR Code、Code 128等格式
Install-Package ZXing.Net
QRCoder:純C#實現(xiàn)的二維碼生成庫
Install-Package QRCoder
二、代碼實現(xiàn)
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);
}
}
}
三、圖像處理與優(yōu)化
3.1 圖像增強(qiáng)
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;
}
四、打印實現(xiàn)方案
4.1 本地打?。╓in32 API)
using System.Drawing.Printing;
public class PrinterService
{
public void PrintBitmap(Bitmap image)
{
using (var printDoc = new PrintDocument())
{
printDoc.PrinterSettings.PrinterName = "Zebra ZT410"; // 指定打印機(jī)
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 網(wǎng)絡(luò)打?。═CP/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);
}
}
}
}
五、高級功能實現(xiàn)
5.1 ZPL指令打?。ò唏R打印機(jī))
public string GenerateZPL(string content)
{
return $@"
^XA
^FO50,50
^BQN,2,8
^FD{content}^FS
^XZ";
}
// 發(fā)送指令
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($"設(shè)備斷開: {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}");
}
}
七、性能優(yōu)化
圖像緩存
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));
}
批量生成優(yōu)化
public void BatchGenerate(List<string> dataList)
{
Parallel.ForEach(dataList, item =>
{
var img = GenerateQRCode(item);
SaveImage(img, $"{Guid.NewGuid()}.png");
});
}
八、部署建議
硬件要求
- 最低配置:i5-8代/8GB內(nèi)存
- 推薦配置:i7-12代/16GB內(nèi)存+NVIDIA顯卡(GPU加速)
環(huán)境配置
<!-- app.config -->
<configuration>
<system.drawing>
<PrinterSettings>
<add key="DefaultPrinter" value="Zebra ZT410"/>
</PrinterSettings>
</system.drawing>
</configuration>
安全措施
- 打印內(nèi)容加密:AES加密敏感數(shù)據(jù)
- 訪問控制: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); // 最小尺寸驗證
}
}
}
到此這篇關(guān)于基于C#實現(xiàn)二維碼和條形碼生成與打印的文章就介紹到這了,更多相關(guān)C#二維碼和條形碼生成與打印內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#數(shù)據(jù)級聯(lián)操作的法寶DataRelation詳解(操作步驟)
本文給大家介紹在C#中使用DataRelation的典型方法和典型代碼實現(xiàn),總結(jié)DataRelation的核心優(yōu)勢,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2025-11-11
C#定時器Timer實現(xiàn)精確到1-2毫秒以內(nèi)
最近在排查項目OTA的一個問題,觸發(fā)了一毫秒或者2毫秒執(zhí)行一次進(jìn)程間通信的,導(dǎo)致通信阻塞的問題,這樣就需要用到模擬觸發(fā)1ms或者2ms觸發(fā)事件,所以本文給大家介紹了C#?定時器?Timer?如何精確到?1-2?毫秒以內(nèi),需要的朋友可以參考下2024-12-12
C# IDE VS2005中的Hosting Process (vshost.exe)作用介紹
這篇文章主要介紹了C# IDE VS2005中的Hosting Process (vshost.exe)作用介紹,vshost.exe是一個宿主進(jìn)程,主要用來提高調(diào)試效率,需要的朋友可以參考下2015-01-01
使用C#將Excel轉(zhuǎn)換為Markdown表格的實現(xiàn)方法
在技術(shù)文檔寫作、開源項目維護(hù)以及數(shù)據(jù)報告生成等場景中,Markdown 表格憑借其輕量、易讀且版本控制友好的特性,成為開發(fā)者首選的數(shù)據(jù)展示格式之一,然而,大量結(jié)構(gòu)化數(shù)據(jù)往往存儲在Excel文件中,索引本文將介紹如何使用C#將Excel轉(zhuǎn)換為Markdown表格,需要的朋友可以參考下2026-05-05

