You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForm使用Zen.Barcode生成条码打印异常问题求助

C# WinForm 使用 Zen.Barcode 生成条码后打印异常问题

在C# WinForm项目中使用Zen.Barcode框架生成条码,条码在PictureBox中显示正常,但使用Zebra ZD410/ZD421打印机打印后效果异常。

生成条码代码

Code128BarcodeDraw codigoDeBarra = BarcodeDrawFactory.Code128WithChecksum;
codigo = equipo.Codigo1;
categoria = equipo.Categoria1;
imagenCodigo = codigoDeBarra.Draw(codigo, 20);

打印逻辑代码

private void imprimir(object sender, PrintPageEventArgs e)
{
    //chkImprimir.CheckState == CheckState.Checked
    if (chkTest.CheckState == CheckState.Checked)
    {
        FrmEquipos frmequipos = new FrmEquipos();
        frmequipos.txtCodigo.Text = codigo;
        frmequipos.Show();

    }
    else
    {
       
        Font font = new Font("Arial", 13, FontStyle.Bold, GraphicsUnit.Point);
        Font font1 = new Font("Arial", 5, FontStyle.Bold, GraphicsUnit.Point);
        Font font2 = new Font("Arial", 8, FontStyle.Bold, GraphicsUnit.Point);
        int width = 200;
        int height = 280;
        int x = 70;

        e.Graphics.DrawString("cca", font, Brushes.Black, new RectangleF(x + 5, 6, width, height));
        e.Graphics.DrawImage(imagenCodigo, new PointF(x, 25));
        //e.Graphics.DrawString(textoConAsteriscos, customFont, Brushes.Black, new PointF(x, yPosCodigoBarras));
        e.Graphics.DrawString(codigo, font2, Brushes.Black, new RectangleF(x, 48, width, height));
        e.Graphics.DrawString(categoria, font1, Brushes.Black, new RectangleF(x + 45, 50, width, height));
    }
}

打印触发代码

private void btnImprimir_Click(object sender, EventArgs e)
{
    int cantidadimprimir = (int)txtCantidadImprimir.Value;

    printDocument1 = new PrintDocument();
    PrinterSettings ps = new PrinterSettings();
    printDocument1.PrinterSettings = ps;
    printDocument1.PrintPage += imprimir;
    printDocument1.PrinterSettings.Copies = (short)(int)cantidadimprimir;
    printDocument1.Print();

    LimpiarCampos();
}

问题现象

  • PictureBox显示效果:条码清晰完整,符合预期
  • 打印效果:条码线条变形、模糊,无法正常识别

解决方案

  1. 适配打印机DPI调整图形设置
    Zebra热敏打印机为固定DPI设备,WinForm默认屏幕DPI会导致缩放失真,在打印方法开头添加以下代码:

    e.Graphics.PageUnit = GraphicsUnit.Millimeter;
    e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
    e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
    
  2. 生成匹配打印机DPI的条码图像
    根据打印机实际DPI(ZD410常见203/300DPI)计算条码高度,避免固定像素值:

    int printerDpi = 203; // 替换为你的打印机DPI
    int barcodeHeight = (int)(0.5 * printerDpi); // 0.5英寸高度
    imagenCodigo = codigoDeBarra.Draw(codigo, barcodeHeight);
    
  3. 优化PrintDocument初始化逻辑
    避免每次打印新建实例,确保指定目标打印机:

    // 在btnImprimir_Click中指定打印机
    printDocument1.PrinterSettings.PrinterName = "Zebra ZD410"; // 替换为实际打印机名称
    
  4. 使用Zebra专用SDK打印
    通用GDI打印对热敏打印机支持有限,推荐使用Zebra Link-OS SDK直接发送ZPL指令,示例:

    // 生成ZPL指令
    string zpl = $"^XA^FO50,50^BCN,100,Y,N^FD{codigo}^FS^XZ";
    // 通过SDK发送指令到打印机(需引用Zebra SDK)
    

内容的提问来源于stack exchange,提问作者Claudio A. Ferreira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 18:26:17