C#如何打印条形码EAN13码

C#实战:二维码与条形码生成技术全解析 本文全面解析了使用C#和ZXing.Net库实现二维码与条形码生成的技术细节。从开发环境搭建到高级应用场景,详细介绍了条形码格式选择、二维码纠错优化、带Logo二维码生成等实用技巧,并分享了物流标签打印系统等实际案例中的性能优化经验。 阅读详情

条形码相信大家都不陌生,但自己写程序打印条形码就不是很容易了。最近用条码字体打印了39码,觉的太长,不美观。后来,在国外网站(http://www.c-sharpcorner.com//Code/2004/March/EANBarcode.asp)上找到了EAN13码的源码,修改了其中的一些小Bug,发上来与大家共享。
附EAN13码的计算规则:
        假设将EAN的内容从右到左的顺序编号:N13、N12、N11、N10、N9、N8、N7、N6、N5、N4、N3、N2、N1,其中N1是准备要求的校验位:
1、C1=(N2+N4+N6+N8+N10+N12)*3;
2、C2=N3+N5+N7+N9+N11+N13;
3、将C1与C2相加,取其个位数,设为C3;4、校验位N1=10-C3

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;

namespace BarCodeEAN13
{ 
 /// <summary>
 /// Barcode control.
 /// </summary>
 public class wctrl_BarCode
 {

  private static string getENA13Code(string Numbers12bit)
  {
   int c1 = 0;
   int c2 = 0;

   for (int i=0; i<11;  i= i+2)
   {
    c1 += int.Parse(Numbers12bit[i].ToString());
    c2 += int.Parse(Numbers12bit[i+1].ToString());
   }

   int c3 = c1 + c2 *3;

   c3 = c3  - c3/10 *10;

   if (c3 == 0)
   {
    return Numbers12bit + 0;
   }
   else
   {
    int N = 10 - c3;

    return Numbers12bit + N;
   }
  }

  /// <summary>
  /// Paint EAN13 barcode to specified graphics into specified draw rectangle.
  /// </summary>
  /// <param name="barCode">BarCode value.</param>
  /// <param name="g">Graphics where to draw.</param>
  /// <param name="drawBounds">Draw bounds.</param>
  public static void Paint_EAN13(string Numbers12bit,Graphics g,Rectangle drawBounds)
  {
   string barCode = getENA13Code(Numbers12bit);

   char[] symbols = barCode.ToCharArray();

   //--- Validate barCode -------------------------------------------------------------------//
   if(barCode.Length != 13){    
    return;
   }
   foreach(char c in symbols){
    if(!Char.IsDigit(c)){
     return;
    }
   }

   //--- Check barcode checksum ------------------------//
   int checkSum = Convert.ToInt32(symbols[12].ToString());
   int calcSum  = 0;
   bool one_three = true;
   for(int i=0;i<12;i++){
    if(one_three){
     calcSum += (Convert.ToInt32(symbols[i].ToString()) * 1);
     one_three = false;
    }
    else{
     calcSum += (Convert.ToInt32(symbols[i].ToString()) * 3);
     one_three = true;
    }    
   }
   
   char[] calcSumChar = calcSum.ToString().ToCharArray();
   if(checkSum !=0 && checkSum != (10 - Convert.ToInt32(calcSumChar[calcSumChar.Length - 1].ToString()))){
    return;
      }   
   //--------------------------------------------------//
   //---------------------------------------------------------------------------------------//

   Font font = new Font("Microsoft Sans Serif",8);
   
   // Fill backround with white color
//   g.Clear(Color.White);

   int lineWidth = 1;
   int x = drawBounds.X;

   // Paint human readable 1 system symbol code
   g.DrawString(symbols[0].ToString(),font,new SolidBrush(Color.Black),x,drawBounds.Y + drawBounds.Height - 16);
   x += 10;

   // Paint left 'guard bars', always same '101'
   g.DrawLine(new Pen(Color.Black,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height);
   x += lineWidth;
   g.DrawLine(new Pen(Color.White,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height);
   x += lineWidth;
   g.DrawLine(new Pen(Color.Black,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height);
   x += lineWidth;

   // First number of barcode specifies how to encode each character in the left-hand
   // side of the barcode should be encoded.
   bool[] leftSideParity = new bool[6];
   switch(symbols[0])
   {
    case '0':
     leftSideParity[0] = true;  // Odd
     leftSideParity[1] = true;  // Odd
     leftSideParity[2] = true;  // Odd
     leftSideParity[3] = true;  // Odd
     leftSideParity[4] = true;  // Odd
     leftSideParity[5] = true;  // Odd
     break;
    case '1':
     leftSideParity[0] = true;  // Odd
     leftSideParity[1] = true;  // Odd
     leftSideParity[2] = false; // Even
     leftSideParity[3] = true;  // Odd
     leftSideParity[4] = false; // Even
     leftSideParity[5] = false; // Even
     break;
    case '2':
     leftSideParity[0] = true;  // Odd
     leftSideParity[1] = true;  // Odd
     leftSideParity[2] = false; // Even
     leftSideParity[3] = false; // Even
     leftSideParity[4] = true;  // Odd
     leftSideParity[5] = false; // Even
     break;
    case '3':
     leftSideParity[0] = true;  // Odd
     leftSideParity[1] = true;  // Odd
     leftSideParity[2] = false; // Even
     leftSideParity[3] = false; // Even
     leftSideParity[4] = false; // Even
     leftSideParity[5] = true;  // Odd
     break;
    case '4':
     leftSideParity[0] = true;  // Odd
     leftSideParity[1] = false; // Even
     leftSideParity[2] = true;  // Odd
     leftSideParity[3] = true;  // Odd
     leftSideParity[4] = false; // Even
     leftSideParity[5] = false; // Even
     break;
    case '5':
     leftSideParity[0] = true;  // Odd
     leftSideParity[1] = false; // Even
     leftSideParity[2] = false; // Even
     leftSideParity[3] = true;  // Odd
     leftSideParity[4] = true;  // Odd
     leftSideParity[5] = false; // Even
     break;
    case '6':
     leftSideParity[0] = true;  // Odd
     leftSideParity[1] = false; // Even
     leftSideParity[2] = false; // Even
     leftSideParity[3] = false; // Even
     leftSideParity[4] = true;  // Odd
     leftSideParity[5] = true;  // Odd
     break;
    case '7':
     leftSideParity[0] = true;  // Odd
     leftSideParity[1] = false; // Even
     leftSideParity[2] = true;  // Odd
     leftSideParity[3] = false; // Even
     leftSideParity[4] = true;  // Odd
     leftSideParity[5] = false; // Even
     break;
    case '8':
     leftSideParity[0] = true;  // Odd
     leftSideParity[1] = false; // Even
     leftSideParity[2] = true;  // Odd
     leftSideParity[3] = false; // Even
     leftSideParity[4] = false; // Even
     leftSideParity[5] = true;  // Odd
     break;
    case '9':
     leftSideParity[0] = true;  // Odd
     leftSideParity[1] = false; // Even
     leftSideParity[2] = false; // Even
     leftSideParity[3] = true;  // Odd
     leftSideParity[4] = false; // Even
     leftSideParity[5] = true;  // Odd
     break;
   }

   // second number system digit + 5 symbol manufacter code
   string lines = "";
   for(int i=0;i<6;i++){
    bool oddParity = leftSideParity[i];
    if(oddParity){
     switch(symbols[i + 1])
     {
      case '0':
       lines += "0001101";
       break;
      case '1':
       lines += "0011001";
       break;
      case '2':
       lines += "0010011";
       break;
      case '3':
       lines += "0111101";
       break;
      case '4':
       lines += "0100011";
       break;
      case '5':
       lines += "0110001";
       break;
      case '6':
       lines += "0101111";
       break;
      case '7':
       lines += "0111011";
       break;
      case '8':
       lines += "0110111";
       break;
      case '9':
       lines += "0001011";
       break;
     }
    }
    // Even parity
    else{
     switch(symbols[i + 1])
     {
      case '0':
       lines += "0100111";
       break;
      case '1':
       lines += "0110011";
       break;
      case '2':
       lines += "0011011";
       break;
      case '3':
       lines += "0100001";
       break;
      case '4':
       lines += "0011101";
       break;
      case '5':
       lines += "0111001";
       break;
      case '6':
       lines += "0000101";
       break;
      case '7':
       lines += "0010001";
       break;
      case '8':
       lines += "0001001";
       break;
      case '9':
       lines += "0010111";
       break;
     }
    }
   }

   // Paint human readable left-side 6 symbol code
   g.DrawString(barCode.Substring(1,6),font,new SolidBrush(Color.Black),x,drawBounds.Y + drawBounds.Height - 12);

   char[] xxx = lines.ToCharArray();
   for(int i=0;i<xxx.Length;i++){
    if(xxx[i] == '1'){
     g.DrawLine(new Pen(Color.Black,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height - 12);
    }
    else{
     g.DrawLine(new Pen(Color.White,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height - 12);
    }
    x += lineWidth;
   }
   
   // Paint center 'guard bars', always same '01010'
   g.DrawLine(new Pen(Color.White,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height);
   x += lineWidth;
   g.DrawLine(new Pen(Color.Black,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height);
   x += lineWidth;
   g.DrawLine(new Pen(Color.White,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height);
   x += lineWidth;
   g.DrawLine(new Pen(Color.Black,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height);
   x += lineWidth;
   g.DrawLine(new Pen(Color.White,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height);
   x += lineWidth;

   // 5 symbol product code + 1 symbol parity
   lines = "";
   for(int i=7;i<13;i++){
    switch(symbols[i])
    {
     case '0':
      lines += "1110010";
      break;
     case '1':
      lines += "1100110";
      break;
     case '2':
      lines += "1101100";
      break;
     case '3':
      lines += "1000010";
      break;
     case '4':
      lines += "1011100";
      break;
     case '5':
      lines += "1001110";
      break;
     case '6':
      lines += "1010000";
      break;
     case '7':
      lines += "1000100";
      break;
     case '8':
      lines += "1001000";
      break;
     case '9':
      lines += "1110100";
      break;
    }
   }

   // Paint human readable left-side 6 symbol code
   g.DrawString(barCode.Substring(7,6),font,new SolidBrush(Color.Black),x,drawBounds.Y + drawBounds.Height - 12);

   xxx = lines.ToCharArray();
   for(int i=0;i<xxx.Length;i++){
    if(xxx[i] == '1'){
     g.DrawLine(new Pen(Color.Black,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height - 12);
    }
    else{
     g.DrawLine(new Pen(Color.White,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height - 12);
    }
    x += lineWidth;
   }
   
   // Paint right 'guard bars', always same '101'
   g.DrawLine(new Pen(Color.Black,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height);
   x += lineWidth;
   g.DrawLine(new Pen(Color.White,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height);
   x += lineWidth;
   g.DrawLine(new Pen(Color.Black,lineWidth),x,drawBounds.Y,x,drawBounds.Y + drawBounds.Height);
  }

 }
}

 
C#条形码生成避坑指南:从Code39到EAN-13的完整示例 本文详细介绍了C#条形码生成的实战技巧,从Code39到EAN-13的完整实现方案。通过ZXing.Net库的深度配置和优化,解决工业级应用中的常见问题,提升条形码生成质量和扫描识别率。适用于零售、物流等需要高效条形码生成的场景。 阅读详情

相关推荐

C#利用zxing.net生成二维码和条形码并实现打印的功能

C#利用zxing.net生成二维码和条形码以及实现打印的功能     开篇:zxing.net是.net平台下编解条形码和二维码的工具。          下载地址:http://pan.baidu.com/s/1kTr3Vuf Step1:使用VS2010新建一个窗体程序项目: Step2:添加三个类:分别是BarCodeClass.cs、DocementBase.cs、image

ZYJUN的专栏 5万+

【C#】EAN-13条形码生成与识别

一EAN-13条形码编码规则 条码构成 条码编码原则 1检验码计算 2左侧字符编码原则 3右侧字符编码原则 二生成条形码 十进制转二进制 1 获取编码方式 2对编码表进行处理转化为三维数组的形式 绘制条形码 1 根据上一步得到的二进制数组0代表黑色1代表白色开始绘制图像 2 对输入的条码编号进行简单验证 三识别条形码 识别方法 zxingnet的使用 四源代码 五截图一、EAN-13条形码编码规则1

哈哈哈哈哈哈哈 1万+

C#实现EAN-13条形码生成器

条形码的校验码用于验证条形码的完整性。校验码通过对条形码的前12位数字进行计算得出,可以有效识别数据输入错误,从而保证条形码的有效性和准确性。校验码在EAN-13条形码的最后一位数字中体现,它是一个数字,可以是0-9之间的任何数字。当扫描条形码时,读取设备会计算校验码并将其与条形码中存储的校验码进行比对,以验证条形码是否正确。为了更具体地说明如何使用开源库,让我们来看一个具体的应用案例。假设我们选择了名为BarCodeLib的开源库来生成EAN-13条形码。

weixin_42571280的博客 764

C# 生成EAN13 BarCode

VS.NET2005 using System; using System.Collections; using System.ComponentModel; using System.Drawing; using System.Data; namespace WebServiceExcelHelper { public class EAN13 { priv

ceozhg2009的专栏 3146

C#实现条形码报表打印的完整指南

用户界面交互元素是应用程序中用户可以直接与之交互的部分,如按钮、对话框、菜单等。在报表打印功能中,我们需要特别关注那些能够简化打印流程和提供即时反馈的交互元素。PrintPreviewDialog是.NET框架提供的一个预览打印内容的对话框控件。它允许用户在实际发送到打印机之前,先查看报表打印的效果。在使用PrintPreviewDialog时,我们可以通过自定义来满足特定的需求。例如,可以通过修改控件的属性来调整打印预览的显示样式,或者添加额外的按钮来实现特定功能,如保存为PDF、发送邮件等。

weixin_42596246的博客 926

C#实现EAN-13条形码

基于C#的EAN-13条形码的算法及实现,不使用其他控件,完全由C#实现

使用C#创建EAN-13条码

演示使用C#创建EAN-13条形码。

c#生成条码 39和ean13格式

用很简单的方法39和ean13格式生成条码,语言c#

EAN-13条形码生成源码

EAN-13条形码生成的 C#源码

C# 生成条形码

C#生成条形码,目前仅支持 EAN13 与 CODE39 条形码。

C# 条形码生成

C# 条形码生成工具,目前仅支持 EAN13 和 Code39 编码格式的条形码

关于条形码绘制的资料整理 (转)

来源: http://blog.youkuaiyun.com/21aspnet/archive/2007/03/19/1534304.aspx Drawing Barcodes in Windows Part 1 - Code 39http://www.codeproject.com/bitmap/barcode1.asp Drawing Barcodes in Windows Part 2 -...

ants717007的博客 133

C#打印EAN13条码

C#打印EAN13条码,复制过来,直接就能用了

上一篇: C#里使用CopyMemory
下一篇: 通过内存映射文件实现进程间数据共享
Python
博客等级 码龄26年 1973粉丝 1567原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值