基于C#实现二维码和条形码生成与打印

 更新时间:2025年10月22日 09:29:16   作者:t19875128  
本文介绍了基于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); // 最小尺寸验证
        }
    }
}

到此这篇关于基于C#实现二维码和条形码生成与打印的文章就介绍到这了,更多相关C#二维码和条形码生成与打印内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#: 引用变量与数值变量的区别

    C#: 引用变量与数值变量的区别

    在C#中主要存在两大类型的数据:引用类型(class)和值类型(struct)。本文探讨一下C#中引用变量和数值变量的区别。
    2013-03-03
  • 基于C#一个制作图像的特写窗口

    基于C#一个制作图像的特写窗口

    许多网站都会显示一个特写窗口,其中显示放大的图像部分,以便您可以看到更多细节,本文将使用C#制作一个简单的图像的特写窗口,感兴趣的可以了解下
    2025-01-01
  • 解析C#中用Process类终止进程,执行命令的深入分析

    解析C#中用Process类终止进程,执行命令的深入分析

    本篇文章是对C#中用Process类终止进程,执行命令进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 关于C#连接SQL Server时提示用户登录失败的解决方法

    关于C#连接SQL Server时提示用户登录失败的解决方法

    在用C#开发windows端程序并连接SQL Server时有可能会遇到数据库登录失败的问题,下面小编给大家带来了C#连接SQL Server时提示用户登录失败的解决方法,感兴趣的朋友一起看看吧
    2021-11-11
  • C#端口扫描器的编写方法

    C#端口扫描器的编写方法

    这篇文章主要为大家详细介绍了C#端口扫描器的编写方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • 基于C#实现文字转语音功能

    基于C#实现文字转语音功能

    这篇文章将在C#中集成一个语音对象SpeechSynthesizer,可以根据填入的文字内容自动解析成语音并使用系统扬声器进行语音播报,感兴趣的小伙伴可以了解下
    2025-02-02
  • c# 实现位图算法(BitMap)

    c# 实现位图算法(BitMap)

    这篇文章主要介绍了c# 如何实现位图算法(BitMap),文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • C#读取多条数据记录导出到Word之图片输出改造

    C#读取多条数据记录导出到Word之图片输出改造

    这篇文章主要为大家详细介绍了C#读取多条数据记录并导出到Word标签模板中的图片输出问题,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2024-11-11
  • 在C#中新手易犯的典型缺陷

    在C#中新手易犯的典型缺陷

    这篇文章的主要内容是关于C#那些新手易犯的典型缺陷,只有对有可能犯的错误进行总结才能做得更好,需要的朋友可以参考下
    2015-07-07
  • C#实现扫雷游戏

    C#实现扫雷游戏

    这篇文章主要为大家详细介绍了C#实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06

最新评论