一、技术选型与依赖库
核心库选择
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); // 最小尺寸验证
}
}
}
到此这篇关于基于c#实现二维码和条形码生成与打印的文章就介绍到这了,更多相关c#二维码和条形码生成与打印内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论