分享C#生成 Code39(extend)条形码 code128条形码 代码实例

C#生成Code39(extend)条形码实例

Code39是条形码的一种。由于编制简单、能够对任意长度的数据进行编码、支持设备广泛等特性而被广泛采用。

    能够对任意长度的数据进行编码。其局限在于印刷品的长度和条码阅读器的识别范围。
    支持设备广泛。目前几乎所有的条形码阅读设备都能阅读Code39码,打印机也是同样情况。
    编制简单。简单的开发技术就能快速生成相应的编码图像。
    一般Code39码由5条线和分开它们的4条缝隙共9个元素构成。线和缝隙有宽窄之分,而且无论线还是缝隙仅有3个比其他的元素要宽一定比例。39码因此得名

Code39条形码规则
  1、 每五条线表示一个字符;
  2、 粗线表示1,细线表示0;
  3、 线条间的间隙宽的表示1,窄的表示0;
  4、 五条线加上它们之间的四条间隙就是九位二进制编码,而且这九位中必定有三位是1,所以称为39码;
  5、 条形码的首尾各一个 * 标识开始和结束。
 
Code 39只接受如下43个有效输入字符:
  1、26个大写字母(A - Z),
  2、十个数字(0 - 9),
  3、连接号(-),句号(.),空格,美圆符号($),斜扛(/),加号(+)以及百分号(%)。
   4、其余的输入将被忽略。
  5、code39通常情况下不需要校验码。但是对於精确度要求高的应用,需要在code39条形码後面增加一个校验码。
 
条形码的生成网上也有很多库文件,做的特别好的都是商业授权。一维码二维码在.net开源项目中的生成读取比较知名的有:Zxing.net(http://zxingnet.codeplex.com/)、BarcodeLib等
但有些时候开源软件所实现的并不满足当下的需求,所以还要做一些其他尝试。效果如下图:
 
代码分享:

/// <summary>
/// Code39一维码生成类
/// </summary>
public class CSharpCode39
{
    #region 数据码
    private byte[,] c39_bp = new byte[,] { 
        { 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x31, 0x30, 0x30 }, { 0x31, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31 }, { 0x32, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31 }, { 0x33, 0x31, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30 }, { 0x34, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x31 }, { 0x35, 0x31, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30 }, { 0x36, 0x30, 0x30, 0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30 }, { 0x37, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x31 }, { 0x38, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30 }, { 0x39, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30 }, { 0x41, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31 }, { 0x42, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31 }, { 0x43, 0x31, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30 }, { 0x44, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x31 }, { 0x45, 0x31, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30 }, { 70, 0x30, 0x30, 0x31, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30 }, 
        { 0x47, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x31 }, { 0x48, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30 }, { 0x49, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30 }, { 0x4a, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x30, 0x30 }, { 0x4b, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31 }, { 0x4c, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31 }, { 0x4d, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30 }, { 0x4e, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x31 }, { 0x4f, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30 }, { 80, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30 }, { 0x51, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31 }, { 0x52, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30 }, { 0x53, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30 }, { 0x54, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31, 0x31, 0x30 }, { 0x55, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31 }, { 0x56, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31 }, 
        { 0x57, 0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30 }, { 0x58, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31 }, { 0x59, 0x31, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30 }, { 90, 0x30, 0x31, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30 }, { 0x2d, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31 }, { 0x2e, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30 }, { 0x20, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30 }, { 0x2a, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30 }, { 0x24, 0x30, 0x31, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30 }, { 0x2f, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30 }, { 0x2b, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30 }, { 0x25, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x31, 0x30 }
     };
    //code39合法字符集 [0-9A-Z+-*/%. ] 共43个
    private byte[] c39_cw = new byte[] { 
        0x30, 0x31, 50, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 70, 
        0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 80, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 
        0x57, 0x58, 0x59, 90, 0x2d, 0x2e, 0x20, 0x24, 0x2f, 0x2b, 0x25
     };
    private byte[,] c39_ex = new byte[,] { 
        { 1, 0x24, 0x41 }, { 2, 0x24, 0x42 }, { 3, 0x24, 0x43 }, { 4, 0x24, 0x44 }, { 5, 0x24, 0x45 }, { 6, 0x24, 70 }, { 7, 0x24, 0x47 }, { 8, 0x24, 0x48 }, { 9, 0x24, 0x49 }, { 10, 0x24, 0x4a }, { 11, 0x24, 0x4b }, { 12, 0x24, 0x4c }, { 13, 0x24, 0x4d }, { 14, 0x24, 0x4e }, { 15, 0x24, 0x4f }, { 0x10, 0x24, 80 }, 
        { 0x11, 0x24, 0x51 }, { 0x12, 0x24, 0x52 }, { 0x13, 0x24, 0x53 }, { 20, 0x24, 0x54 }, { 0x15, 0x24, 0x55 }, { 0x16, 0x24, 0x56 }, { 0x17, 0x24, 0x57 }, { 0x18, 0x24, 0x58 }, { 0x19, 0x24, 0x59 }, { 0x1a, 0x24, 90 }, { 0x1b, 0x25, 0x41 }, { 0x1c, 0x25, 0x42 }, { 0x1d, 0x25, 0x43 }, { 30, 0x25, 0x44 }, { 0x1f, 0x25, 0x45 }, { 0x3b, 0x25, 70 }, 
        { 60, 0x25, 0x47 }, { 0x3d, 0x25, 0x48 }, { 0x3e, 0x25, 0x49 }, { 0x3f, 0x25, 0x4a }, { 0x5b, 0x25, 0x4b }, { 0x5c, 0x25, 0x4c }, { 0x5d, 0x25, 0x4d }, { 0x5e, 0x25, 0x4e }, { 0x5f, 0x25, 0x4f }, { 0x7b, 0x25, 80 }, { 0x7c, 0x25, 0x51 }, { 0x7d, 0x25, 0x52 }, { 0x7e, 0x25, 0x53 }, { 0x7f, 0x25, 0x54 }, { 0, 0x25, 0x55 }, { 0x40, 0x25, 0x56 }, 
        { 0x60, 0x25, 0x57 }, { 0x21, 0x2f, 0x41 }, { 0x22, 0x2f, 0x42 }, { 0x23, 0x2f, 0x43 }, { 0x26, 0x2f, 70 }, { 0x27, 0x2f, 0x47 }, { 40, 0x2f, 0x48 }, { 0x29, 0x2f, 0x49 }, { 0x2a, 0x2f, 0x4a }, { 0x2c, 0x2f, 0x4c }, { 0x3a, 0x2f, 90 }, { 0x61, 0x2b, 0x41 }, { 0x62, 0x2b, 0x42 }, { 0x63, 0x2b, 0x43 }, { 100, 0x2b, 0x44 }, { 0x65, 0x2b, 0x45 }, 
        { 0x66, 0x2b, 70 }, { 0x67, 0x2b, 0x47 }, { 0x68, 0x2b, 0x48 }, { 0x69, 0x2b, 0x49 }, { 0x6a, 0x2b, 0x4a }, { 0x6b, 0x2b, 0x4b }, { 0x6c, 0x2b, 0x4c }, { 0x6d, 0x2b, 0x4d }, { 110, 0x2b, 0x4e }, { 0x6f, 0x2b, 0x4f }, { 0x70, 0x2b, 80 }, { 0x71, 0x2b, 0x51 }, { 0x72, 0x2b, 0x52 }, { 0x73, 0x2b, 0x53 }, { 0x74, 0x2b, 0x54 }, { 0x75, 0x2b, 0x55 }, 
        { 0x76, 0x2b, 0x56 }, { 0x77, 0x2b, 0x57 }, { 120, 0x2b, 0x58 }, { 0x79, 0x2b, 0x59 }, { 0x7a, 0x2b, 90 }
     };
    #endregion
    #region 字段和属性
    private bool _checksum;
    private string _dataToEncode;
    private bool _humanReadable;
    private string _humanReadableFont;
    private float _humanReadableSize;
    private float _marginX;
    private float _marginY;
    private float _moduleHeight;
    private float _moduleWidth;
    private float _ratio;
    private float _reduction;
    private Color _codeBarColor = Color.Black;
    private bool _isDisplayCheckCode;
    private string _checkData;
    private bool _isDisplayStartStopSign;
    /// <summary>
    /// 是否检查效验
    /// </summary>
    public bool Checksum
    {
        get
        {
            return _checksum;
        }
        set
        {
            _checksum = value;
        }
    }
    /// <summary>
    /// 要进行编码的数据
    /// </summary>
    public string DataToEncode
    {
        get
        {
            return _dataToEncode;
        }
        set
        {
            _dataToEncode = value;
        }
    }
    /// <summary>
    /// 是否显示文本内容
    /// </summary>
    public bool HumanReadable
    {
        get
        {
            return _humanReadable;
        }
        set
        {
            _humanReadable = value;
        }
    }
    /// <summary>
    /// 用于显示文本内容的字体
    /// </summary>
    public string HumanReadableFont
    {
        get
        {
            return _humanReadableFont;
        }
        set
        {
            _humanReadableFont = value;
        }
    }
    /// <summary>
    /// 用于显示文本内容文字的代大小 
    /// </summary>
    public float HumanReadableSize
    {
        get
        {
            return _humanReadableSize;
        }
        set
        {
            _humanReadableSize = value;
        }
    }
    /// <summary>
    /// 水平方向边距
    /// 水平方向建议尽量留白
    /// 如果没有留白同时模块宽度较小可能会造成无法识别
    /// </summary>
    public float MarginX
    {
        get
        {
            return _marginX;
        }
        set
        {
            _marginX = value;
        }
    }
    /// <summary>
    /// 垂直方向边距
    /// </summary>
    public float MarginY
    {
        get
        {
            return _marginY;
        }
        set
        {
            _marginY = value;
        }
    }
    /// <summary>
    /// 模块高度(mm)
    /// </summary>
    public float ModuleHeight
    {
        get
        {
            return _moduleHeight;
        }
        set
        {
            _moduleHeight = value;
        }
    }
    /// <summary>
    /// 模块宽度(mm)
    /// 模块宽度不应低于0.2646f
    /// 模块宽度过低会造成数据丢失因而读不出数据或者会误读
    /// </summary>
    public float ModuleWidth
    {
        get
        {
            return _moduleWidth;
        }
        set
        {
            _moduleWidth = value;
        }
    }
    /// <summary>
    /// 放大比率 
    /// </summary>
    public float Ratio
    {
        get
        {
            return _ratio;
        }
        set
        {
            _ratio = value;
        }
    }
    /// <summary>
    /// 缩小
    /// </summary>
    public float Reduction
    {
        get
        {
            return _reduction;
        }
        set
        {
            _reduction = value;
        }
    }
    /// <summary>
    /// 设置条形码的颜色
    /// </summary>
    public Color CodeBarColor
    {
        get
        {
            return _codeBarColor;
        }
        set
        {
            _codeBarColor = value;
        }
    }
    /// <summary>
    /// 是否显示效验码
    /// 此属性要在Checksum属性为true的情况下有用
    /// </summary>
    public bool IsDisplayCheckCode
    {
        get { return this._isDisplayCheckCode; }
        set { this._isDisplayCheckCode = value; }
    }
    /// <summary>
    /// 供人识别是否显示起止符
    /// </summary>
    public bool IsDisplayStartStopSign
    {
        get { return this._isDisplayStartStopSign; }
        set { this._isDisplayStartStopSign = value; }
    }
    #endregion
    /// <summary>
    /// 默认构造函数
    /// 初始化
    /// </summary>
    public CSharpCode39()
    {
        this.initData();
        
    }
    public CSharpCode39(string dataToEncode)
    {
        this.initData();
        this._dataToEncode = dataToEncode;
    }
    /// <summary>
    /// 默认构造函数
    /// 初始化数据
    /// </summary>
    private void initData()
    {
        this._humanReadableFont = "Arial";
        this._humanReadableSize = 10f;
        this._codeBarColor = Color.Black;
        this._moduleHeight = 15f;//模块高度毫米
        this._moduleWidth = 0.35f;//模块宽度毫米
        this._ratio = 3f;
        this._marginX =2;
        this._marginY =2;
        this._checksum = true;
        this._isDisplayCheckCode = false;
        this._isDisplayStartStopSign = false;
    }
    private char[] _bitpattern_c39(string rawdata, ref int finalLength)
    {
        //0x27  39  
        //0x50  80
        if ((rawdata.Length == 0) || (rawdata.Length > 0x50 /*0x27*/))
        {
            return null;
        }
        for (int i = 0; i < rawdata.Length; i++)
        {
            if ((rawdata[i] == '\0') || (rawdata[i] > '\x007f'))
            {
                return null;
            }
        }
        byte[] data = processTilde(rawdata);
        if (data.Length == 0)
        {
            return null;
        }
        byte[] buffer2 = this.processExtended(data);
        if ((buffer2.Length == 0) || (buffer2.Length > /*40*/80))
        {
            return null;
        }
        finalLength = this._checksum ? ((buffer2.Length + 2) + 1) : (buffer2.Length + 2);
        return this.getPattern_c39(buffer2);
    }
    /// <summary>
    /// 计算效验值
    /// </summary>
    /// <param name="data"></param>
    /// <param name="len"></param>
    /// <returns></returns>
    private byte _checksum_c39(byte[] data, int len)
    {
        //0x2b 43
        //字符值的总和除以合法字符集的个数43 取余数   余数在合法字符数组中对应的数值就是效验值
        int num2 = 0;
        for (int i = 1; i < len; i++)
        {
            num2 += this.valueFromCharacter(data[i]);
        }
        return this.c39_cw[num2 % 0x2b];
    }
    private char[] Code39_bitpattern(string dataToEncode)
    {
        int finalLength = 0;
        return this._bitpattern_c39(dataToEncode, ref finalLength);
    }
    /// <summary>
    /// 获得Code39条码图片
    /// </summary>
    /// <param name="resolution">DPI</param>
    /// <returns></returns>
    public Bitmap getBitmapImage(float resolution)
    {
       return Code39_createCode(resolution);
    }
   
    private Bitmap Code39_createCode(float resolution)
    {
        int num6;
        int finalLength = 0;
        char[] chArray = this._bitpattern_c39(DataToEncode, ref finalLength);
        if (chArray == null)
        {
            return null;
        }
        float fontsize = this._humanReadable ? (0.3527778f * this._humanReadableSize) : 0f;
        // float num3 = (7f * ModuleWidth) + ((3f * Ratio) * ModuleWidth);
        float num3 = (7f * this._moduleWidth) + ((3f * this._ratio) * this._moduleWidth);
        float width = (finalLength * num3) + (2f * this._marginX);
        float height = (this._moduleHeight + (2f * this._marginY)) + fontsize;
        width *= resolution / 25.4f;
        height *= resolution / 25.4f;
        Bitmap image = new Bitmap((int)width, (int)height, PixelFormat.Format32bppPArgb);
        image.SetResolution(resolution, resolution);
        //image.SetResolution(300, 300);
        Graphics g = Graphics.FromImage(image);
        g.Clear(Color.White);
        g.PageUnit = GraphicsUnit.Millimeter; //以毫米为度量单位
        g.FillRectangle(new SolidBrush(Color.White), new Rectangle(0, 0, /*(int)width*/image.Width, /*(int)height*/image.Height));
        //new Pen(Color.Black, 2f);
        //new SolidBrush(Color.White);
        SolidBrush brush = new SolidBrush(Color.Black);
        if (resolution < 300f)
        {
            //g.TextRenderingHint = TextRenderingHint.AntiAlias;
            //g.SmoothingMode = SmoothingMode.AntiAlias;
            g.CompositingQuality = CompositingQuality.HighQuality;
            //g.SmoothingMode = SmoothingMode.HighQuality;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
        }
        float num7 = 0f;
        for (num6 = 0; num6 < chArray.Length; num6++)
        {
            if (chArray[num6] == '0')
            {
                if ((num6 & 1) != 1)
                {
                    RectangleF rect = new RectangleF(MarginX + num7, MarginY, ModuleWidth, ModuleHeight);
                    MakeBar(g, rect, Reduction);
                }
                num7 += 1f * ModuleWidth;
            }
            else
            {
                if ((num6 & 1) != 1)
                {
                    RectangleF ef2 = new RectangleF(MarginX + num7, MarginY, Ratio * ModuleWidth, ModuleHeight);
                    MakeBar(g, ef2, Reduction);
                }
                num7 += Ratio * ModuleWidth;
            }
        }
        #region  供人识别内容
        if (this._humanReadable)
        {
            #region 保留
            /*byte[] buffer2 = processTilde(this._dataToEncode);
            int index = 0;
            List<byte> arr = new List<byte>();
            for (num6 = 0; num6 < buffer2.Length; num6++)
            {
                //0x20 32      0x7e  126
                if ((buffer2[num6] >= 0x20) && (buffer2[num6] <= 0x7e))
                {
                    arr.Add(buffer2[num6]);
                }
            }
            byte[] bytes = new byte[arr.Count];
            for (int i = 0; i < arr.Count; i++)
            {
                bytes[i] = arr[i];
            }
            index = arr.Count;
            
            //string text = new ASCIIEncoding().GetString(bytes, 0, index);
             */ 
            #endregion
            string text = this._dataToEncode;
            if (this._isDisplayCheckCode&&!string.IsNullOrEmpty(this._checkData)) {
                text += this._checkData;
            }
            if (this._isDisplayStartStopSign)
            {
                text = "*" + text + "*";
            }
            Font font = new Font(this._humanReadableFont, this._humanReadableSize);
            //g.DrawString(text, font, brush, new PointF(MarginX, MarginY + ModuleHeight));
            //新增字符串格式
            var drawFormat = new StringFormat { Alignment = StringAlignment.Center };
            float inpix = image.Width / resolution;//根据DPi求出 英寸数
            float widthmm = inpix * 25.4f;   //有每英寸像素求出毫米
            //g.DrawString(text, font, Brushes.Black, width / 2, height - 14, drawFormat);
            g.DrawString(text, font, /*Brushes.Black*/brush, new PointF(/*MarginX*/(int)(widthmm / 2), MarginY + ModuleHeight + 1), drawFormat);
        }
        #endregion
        return image;
    }
    /// <summary>
    /// 进行图形填充
    /// </summary>
    /// <param name="g"></param>
    /// <param name="rect"></param>
    /// <param name="reduction"></param>
    private void MakeBar(Graphics g, RectangleF rect, float reduction)
    {
        MakeBar(g, rect, reduction,this._codeBarColor);
    }
    /// <summary>
    /// 进行图形填充
    /// </summary>
    /// <param name="g"></param>
    /// <param name="rect"></param>
    /// <param name="reduction"></param>
    /// <param name="brushColor"></param>
    private void MakeBar(Graphics g, RectangleF rect, float reduction, Color brushColor)
    {
        float num = rect.Width * (reduction / 200f);
        float num2 = rect.Width - (rect.Width * (reduction / 200f));
        RectangleF ef = new RectangleF
        {
            X = rect.X + num,
            Y = rect.Y,
            Width = num2,
            Height = rect.Height
        };
        SolidBrush brush = new SolidBrush(brushColor);
        g.FillRectangle(brush, ef);
    }
    private char[] getPattern_c39(byte[] data)
    {   //0x2a  42为*
        //int num = 0x27;
        int num = 80;
        byte[] buffer = new byte[num + 1];
        buffer[0] = 0x2a;
        int index = 1;
        for (int i = 0; i < data.Length; i++)
        {
            buffer[index] = data[i];
            index++;
        }
        if (Checksum)
        {
            buffer[index] = this._checksum_c39(buffer, index);
            if (_isDisplayCheckCode)
            {
                this._checkData = ((char)buffer[index]).ToString();
            }
            index++;
        }
        buffer[index] = 0x2a;
        index++;
        char[] chArray = new char[index * 10];
        int num5 = 0;
        for (int j = 0; j < index; j++)
        {
            byte c = buffer[j];
            int num9 = this.indexFromCharacter(c);
            for (int k = 0; k < 9; k++)
            {
                chArray[num5] = (char)this.c39_bp[num9, k + 1];
                num5++;
            }
            chArray[num5] = '0';
            num5++;
        }
        return chArray;
    }
    private int indexFromCharacter(byte c)
    {
        //0x2c==44
        for (int i = 0; i < 0x2c; i++)
        {
            if (this.c39_bp[i, 0] == c)
            {
                return i;
            }
        }
        return -1;
    }
    private byte[] processExtended(byte[] data)
    {
        //0x25  38
        //0x4F  79 0x4E 78
        //int num = 0x4F;
        int num = data.Length - 1;
        byte[] sourceArray = new byte[num + 1];
        int index = 0;
        for (int i = 0; i < data.Length; i++)
        {
            byte c = data[i];
            if (this.valueFromCharacter(c) != -1)
            {
                sourceArray[index] = c;
                index++;
            }
            else
            {
                byte num5 = 0;
                byte num6 = 0;
                if (this.valuesFromExtended(c, ref num5, ref num6))
                {
                    sourceArray[index] = num5;
                    sourceArray[index + 1] = num6;
                    index += 2;
                }
            }
        }
        byte[] destinationArray = new byte[index];
        Array.Copy(sourceArray, destinationArray, index);
        return destinationArray;
    }
    /// <summary>
    /// 返回指定字符在code39合法字符数组中对应的索引
    /// </summary>
    /// <param name="c"></param>
    /// <returns></returns>
    private int valueFromCharacter(byte c)
    {
        //c39_cw为数组,保存的为合法的字符集信息[0-9A-Z+-*/%. ] 共43个
        //如果存在这个字符就返回c39_cw对应的索引
        for (int i = 0; i < /*0x2b*/this.c39_cw.Length; i++)
        {
            if (this.c39_cw[i] == c)
            {
                return i;
            }
        }
        return -1;
    }
    /// <summary>
    /// 判断字符集是否存在Extended
    /// </summary>
    /// <param name="c"></param>
    /// <param name="v1"></param>
    /// <param name="v2"></param>
    /// <returns></returns>
    private bool valuesFromExtended(byte c, ref byte v1, ref byte v2)
    {
        //0x55  85
        for (int i = 0; i < 0x55; i++)
        {
            if (this.c39_ex[i, 0] == c)
            {
                v1 = this.c39_ex[i, 1];
                v2 = this.c39_ex[i, 2];
                return true;
            }
        }
        return false;
    }
    private byte[] processTilde(string rawdata)
    {
        byte[] sourceArray = new byte[rawdata.Length];
        int index = 0;
        for (int i = 0; i < rawdata.Length; i++)
        {
            if (rawdata[i] != '~')
            {
                sourceArray[index] = (byte)rawdata[i];
                index++;
            }
            else if ((i + 3) < rawdata.Length)
            {
                string str = new string(new char[] { rawdata[i + 1], rawdata[i + 2], rawdata[i + 3] });
                int num3 = Convert.ToInt32(str, 10);
                if ((num3 > 0) && (num3 <= 0xff))
                {
                    sourceArray[index] = (byte)num3;
                    index++;
                }
                if (num3 == 0x3e7)
                {
                    sourceArray[index] = 0x86;
                    index++;
                }
                i += 3;
            }
            else
            {
                sourceArray[index] = (byte)rawdata[i];
                index++;
            }
        }
        byte[] destinationArray = new byte[index];
        Array.Copy(sourceArray, destinationArray, index);
        return destinationArray;
    }
}

这个方法是根据DPI以及数据模块的高宽来确定条码的实际高宽。模块的宽度以毫米(mm)来算。类中的getBitmapImage方法的一个参数getBitmapImage为DPI。安卓用户安装平时常用的扫码软件即可做识别测试。就识别率来说还是可以的,扫描枪绝对是可以扫的出的。同时使用过MessagingToolkit.Barcode进行解码测试,万张无一误读。
 
 
C#生成code128条形码实例

CODE128条形码是广泛应用在企业内部管理、生产流程、物流控制系统方面的条码码制,由于其优良的特性在管理信息系统的设计中被广泛使用,CODE128码是应用最广泛的条码码制之一。

CODE128条形码是1981年引入的一种高密度条码,CODE128 码可表示从 ASCII 0 到ASCII 127 共128个字符,故称128码。其中包含了数字、字母和符号字符。

using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
 
namespace Code
{
    class BarCode
    {
        public class Code128
        {
            private DataTable m_Code128 = new DataTable();
            private uint m_Height = 40;
            /// <summary>
            /// 高度
            /// </summary>
            public uint Height { get { return m_Height; } set { m_Height = value; } }
            private Font m_ValueFont = null;
            /// <summary>
            /// 是否显示可见号码  如果为NULL不显示号码
            /// </summary>
            public Font ValueFont { get { return m_ValueFont; } set { m_ValueFont = value; } }
            private byte m_Magnify = 0;
            /// <summary>
            /// 放大倍数
            /// </summary>
            public byte Magnify { get { return m_Magnify; } set { m_Magnify = value; } }
            /// <summary>
            /// 条码类别
            /// </summary>
            public enum Encode
            {
                Code128A,
                Code128B,
                Code128C,
                EAN128
            }
            public Code128()
            {
                m_Code128.Columns.Add("ID");
                m_Code128.Columns.Add("Code128A");
                m_Code128.Columns.Add("Code128B");
                m_Code128.Columns.Add("Code128C");
                m_Code128.Columns.Add("BandCode");
                m_Code128.CaseSensitive = true;
                #region 数据表
                m_Code128.Rows.Add("0", " ", " ", "00", "212222");
                m_Code128.Rows.Add("1", "!", "!", "01", "222122");
                m_Code128.Rows.Add("2", "\"", "\"", "02", "222221");
                m_Code128.Rows.Add("3", "#", "#", "03", "121223");
                m_Code128.Rows.Add("4", "$", "$", "04", "121322");
                m_Code128.Rows.Add("5", "%", "%", "05", "131222");
                m_Code128.Rows.Add("6", "&", "&", "06", "122213");
                m_Code128.Rows.Add("7", "'", "'", "07", "122312");
                m_Code128.Rows.Add("8", "(", "(", "08", "132212");
                m_Code128.Rows.Add("9", ")", ")", "09", "221213");
                m_Code128.Rows.Add("10", "*", "*", "10", "221312");
                m_Code128.Rows.Add("11", "+", "+", "11", "231212");
                m_Code128.Rows.Add("12", ",", ",", "12", "112232");
                m_Code128.Rows.Add("13", "-", "-", "13", "122132");
                m_Code128.Rows.Add("14", ".", ".", "14", "122231");
                m_Code128.Rows.Add("15", "/", "/", "15", "113222");
                m_Code128.Rows.Add("16", "0", "0", "16", "123122");
                m_Code128.Rows.Add("17", "1", "1", "17", "123221");
                m_Code128.Rows.Add("18", "2", "2", "18", "223211");
                m_Code128.Rows.Add("19", "3", "3", "19", "221132");
                m_Code128.Rows.Add("20", "4", "4", "20", "221231");
                m_Code128.Rows.Add("21", "5", "5", "21", "213212");
                m_Code128.Rows.Add("22", "6", "6", "22", "223112");
                m_Code128.Rows.Add("23", "7", "7", "23", "312131");
                m_Code128.Rows.Add("24", "8", "8", "24", "311222");
                m_Code128.Rows.Add("25", "9", "9", "25", "321122");
                m_Code128.Rows.Add("26", ":", ":", "26", "321221");
                m_Code128.Rows.Add("27", ";", ";", "27", "312212");
                m_Code128.Rows.Add("28", "<", "<", "28", "322112");
                m_Code128.Rows.Add("29", "=", "=", "29", "322211");
                m_Code128.Rows.Add("30", ">", ">", "30", "212123");
                m_Code128.Rows.Add("31", "?", "?", "31", "212321");
                m_Code128.Rows.Add("32", "@", "@", "32", "232121");
                m_Code128.Rows.Add("33", "A", "A", "33", "111323");
                m_Code128.Rows.Add("34", "B", "B", "34", "131123");
                m_Code128.Rows.Add("35", "C", "C", "35", "131321");
                m_Code128.Rows.Add("36", "D", "D", "36", "112313");
                m_Code128.Rows.Add("37", "E", "E", "37", "132113");
                m_Code128.Rows.Add("38", "F", "F", "38", "132311");
                m_Code128.Rows.Add("39", "G", "G", "39", "211313");
                m_Code128.Rows.Add("40", "H", "H", "40", "231113");
                m_Code128.Rows.Add("41", "I", "I", "41", "231311");
                m_Code128.Rows.Add("42", "J", "J", "42", "112133");
                m_Code128.Rows.Add("43", "K", "K", "43", "112331");
                m_Code128.Rows.Add("44", "L", "L", "44", "132131");
                m_Code128.Rows.Add("45", "M", "M", "45", "113123");
                m_Code128.Rows.Add("46", "N", "N", "46", "113321");
                m_Code128.Rows.Add("47", "O", "O", "47", "133121");
                m_Code128.Rows.Add("48", "P", "P", "48", "313121");
                m_Code128.Rows.Add("49", "Q", "Q", "49", "211331");
                m_Code128.Rows.Add("50", "R", "R", "50", "231131");
                m_Code128.Rows.Add("51", "S", "S", "51", "213113");
                m_Code128.Rows.Add("52", "T", "T", "52", "213311");
                m_Code128.Rows.Add("53", "U", "U", "53", "213131");
                m_Code128.Rows.Add("54", "V", "V", "54", "311123");
                m_Code128.Rows.Add("55", "W", "W", "55", "311321");
                m_Code128.Rows.Add("56", "X", "X", "56", "331121");
                m_Code128.Rows.Add("57", "Y", "Y", "57", "312113");
                m_Code128.Rows.Add("58", "Z", "Z", "58", "312311");
                m_Code128.Rows.Add("59", "[", "[", "59", "332111");
                m_Code128.Rows.Add("60", "\\", "\\", "60", "314111");
                m_Code128.Rows.Add("61", "]", "]", "61", "221411");
                m_Code128.Rows.Add("62", "^", "^", "62", "431111");
                m_Code128.Rows.Add("63", "_", "_", "63", "111224");
                m_Code128.Rows.Add("64", "NUL", "`", "64", "111422");
                m_Code128.Rows.Add("65", "SOH", "a", "65", "121124");
                m_Code128.Rows.Add("66", "STX", "b", "66", "121421");
                m_Code128.Rows.Add("67", "ETX", "c", "67", "141122");
                m_Code128.Rows.Add("68", "EOT", "d", "68", "141221");
                m_Code128.Rows.Add("69", "ENQ", "e", "69", "112214");
                m_Code128.Rows.Add("70", "ACK", "f", "70", "112412");
                m_Code128.Rows.Add("71", "BEL", "g", "71", "122114");
                m_Code128.Rows.Add("72", "BS", "h", "72", "122411");
                m_Code128.Rows.Add("73", "HT", "i", "73", "142112");
                m_Code128.Rows.Add("74", "LF", "j", "74", "142211");
                m_Code128.Rows.Add("75", "VT", "k", "75", "241211");
                m_Code128.Rows.Add("76", "FF", "I", "76", "221114");
                m_Code128.Rows.Add("77", "CR", "m", "77", "413111");
                m_Code128.Rows.Add("78", "SO", "n", "78", "241112");
                m_Code128.Rows.Add("79", "SI", "o", "79", "134111");
                m_Code128.Rows.Add("80", "DLE", "p", "80", "111242");
                m_Code128.Rows.Add("81", "DC1", "q", "81", "121142");
                m_Code128.Rows.Add("82", "DC2", "r", "82", "121241");
                m_Code128.Rows.Add("83", "DC3", "s", "83", "114212");
                m_Code128.Rows.Add("84", "DC4", "t", "84", "124112");
                m_Code128.Rows.Add("85", "NAK", "u", "85", "124211");
                m_Code128.Rows.Add("86", "SYN", "v", "86", "411212");
                m_Code128.Rows.Add("87", "ETB", "w", "87", "421112");
                m_Code128.Rows.Add("88", "CAN", "x", "88", "421211");
                m_Code128.Rows.Add("89", "EM", "y", "89", "212141");
                m_Code128.Rows.Add("90", "SUB", "z", "90", "214121");
                m_Code128.Rows.Add("91", "ESC", "{", "91", "412121");
                m_Code128.Rows.Add("92", "FS", "|", "92", "111143");
                m_Code128.Rows.Add("93", "GS", "}", "93", "111341");
                m_Code128.Rows.Add("94", "RS", "~", "94", "131141");
                m_Code128.Rows.Add("95", "US", "DEL", "95", "114113");
                m_Code128.Rows.Add("96", "FNC3", "FNC3", "96", "114311");
                m_Code128.Rows.Add("97", "FNC2", "FNC2", "97", "411113");
                m_Code128.Rows.Add("98", "SHIFT", "SHIFT", "98", "411311");
                m_Code128.Rows.Add("99", "CODEC", "CODEC", "99", "113141");
                m_Code128.Rows.Add("100", "CODEB", "FNC4", "CODEB", "114131");
                m_Code128.Rows.Add("101", "FNC4", "CODEA", "CODEA", "311141");
                m_Code128.Rows.Add("102", "FNC1", "FNC1", "FNC1", "411131");
                m_Code128.Rows.Add("103", "StartA", "StartA", "StartA", "211412");
                m_Code128.Rows.Add("104", "StartB", "StartB", "StartB", "211214");
                m_Code128.Rows.Add("105", "StartC", "StartC", "StartC", "211232");
                m_Code128.Rows.Add("106", "Stop", "Stop", "Stop", "2331112");
                #endregion
            }
            /// <summary>
            /// 获取128图形
            /// </summary>
            /// <param name="p_Text">文字</param>
            /// <param name="p_Code">编码</param>      
            /// <returns>图形</returns>
            public Bitmap GetCodeImage(string p_Text, Encode p_Code)
            {
                string _ViewText = p_Text;
                string _Text = "";
                IList<int> _TextNumb = new List<int>();
                int _Examine = 0;  //首位
                switch (p_Code)
                {
                    case Encode.Code128C:
                        _Examine = 105;
                        if (!((p_Text.Length & 1) == 0)) throw new Exception("128C长度必须是偶数");
                        while (p_Text.Length != 0)
                        {
                            int _Temp = 0;
                            try
                            {
                                int _CodeNumb128 = Int32.Parse(p_Text.Substring(0, 2));
                            }
                            catch
                            {
                                throw new Exception("128C必须是数字!");
                            }
                            _Text += GetValue(p_Code, p_Text.Substring(0, 2), ref _Temp);
                            _TextNumb.Add(_Temp);
                            p_Text = p_Text.Remove(0, 2);
                        }
                        break;
                    case Encode.EAN128:
                        _Examine = 105;
                        if (!((p_Text.Length & 1) == 0)) throw new Exception("EAN128长度必须是偶数");
                        _TextNumb.Add(102);
                        _Text += "411131";
                        while (p_Text.Length != 0)
                        {
                            int _Temp = 0;
                            try
                            {
                                int _CodeNumb128 = Int32.Parse(p_Text.Substring(0, 2));
                            }
                            catch
                            {
                                throw new Exception("128C必须是数字!");
                            }
                            _Text += GetValue(Encode.Code128C, p_Text.Substring(0, 2), ref _Temp);
                            _TextNumb.Add(_Temp);
                            p_Text = p_Text.Remove(0, 2);
                        }
                        break;
                    default:
                        if (p_Code == Encode.Code128A)
                        {
                            _Examine = 103;
                        }
                        else
                        {
                            _Examine = 104;
                        }
 
                        while (p_Text.Length != 0)
                        {
                            int _Temp = 0;
                            string _ValueCode = GetValue(p_Code, p_Text.Substring(0, 1), ref _Temp);
                            if (_ValueCode.Length == 0) throw new Exception("无效的字符集!" + p_Text.Substring(0, 1).ToString());
                            _Text += _ValueCode;
                            _TextNumb.Add(_Temp);
                            p_Text = p_Text.Remove(0, 1);
                        }
                        break;
                }
                if (_TextNumb.Count == 0) throw new Exception("错误的编码,无数据");
                _Text = _Text.Insert(0, GetValue(_Examine)); //获取开始位
 
                for (int i = 0; i != _TextNumb.Count; i++)
                {
                    _Examine += _TextNumb[i] * (i + 1);
                }
                _Examine = _Examine % 103;           //获得严效位
                _Text += GetValue(_Examine);  //获取严效位
                _Text += "2331112"; //结束位
                Bitmap _CodeImage = GetImage(_Text);
                GetViewText(_CodeImage, _ViewText);
                return _CodeImage;
            }
            /// <summary>
            /// 获取目标对应的数据
            /// </summary>
            /// <param name="p_Code">编码</param>
            /// <param name="p_Value">数值 A b  30</param>
            /// <param name="p_SetID">返回编号</param>
            /// <returns>编码</returns>
            private string GetValue(Encode p_Code, string p_Value, ref int p_SetID)
            {
                if (m_Code128 == null) return "";
                DataRow[] _Row = m_Code128.Select(p_Code.ToString() + "='" + p_Value + "'");
                if (_Row.Length != 1) throw new Exception("错误的编码" + p_Value.ToString());
                p_SetID = Int32.Parse(_Row[0]["ID"].ToString());
                return _Row[0]["BandCode"].ToString();
            }
            /// <summary>
            /// 根据编号获得条纹
            /// </summary>
            /// <param name="p_CodeId"></param>
            /// <returns></returns>
            private string GetValue(int p_CodeId)
            {
                DataRow[] _Row = m_Code128.Select("ID='" + p_CodeId.ToString() + "'");
                if (_Row.Length != 1) throw new Exception("验效位的编码错误" + p_CodeId.ToString());
                return _Row[0]["BandCode"].ToString();
            }
            /// <summary>
            /// 获得条码图形
            /// </summary>
            /// <param name="p_Text">文字</param>
            /// <returns>图形</returns>
            private Bitmap GetImage(string p_Text)
            {
                char[] _Value = p_Text.ToCharArray();
                int _Width = 0;
                for (int i = 0; i != _Value.Length; i++)
                {
                    _Width += Int32.Parse(_Value[i].ToString()) * (m_Magnify + 1);
                }
                Bitmap _CodeImage = new Bitmap(_Width, (int)m_Height);
                Graphics _Garphics = Graphics.FromImage(_CodeImage);
                //Pen _Pen;
                int _LenEx = 0;
                for (int i = 0; i != _Value.Length; i++)
                {
                    int _ValueNumb = Int32.Parse(_Value[i].ToString()) * (m_Magnify + 1);  //获取宽和放大系数
                    if (!((i & 1) == 0))
                    {
                        //_Pen = new Pen(Brushes.White, _ValueNumb);
                        _Garphics.FillRectangle(Brushes.White, new Rectangle(_LenEx, 0, _ValueNumb, (int)m_Height));
                    }
                    else
                    {
                        //_Pen = new Pen(Brushes.Black, _ValueNumb);
                        _Garphics.FillRectangle(Brushes.Black, new Rectangle(_LenEx, 0, _ValueNumb, (int)m_Height));
                    }
                    //_Garphics.(_Pen, new Point(_LenEx, 0), new Point(_LenEx, m_Height));
                    _LenEx += _ValueNumb;
                }
                _Garphics.Dispose();
                return _CodeImage;
            }
            /// <summary>
            /// 显示可见条码文字 如果小于40 不显示文字
            /// </summary>
            /// <param name="p_Bitmap">图形</param>           
            private void GetViewText(Bitmap p_Bitmap, string p_ViewText)
            {
                if (m_ValueFont == null) return;
 
                Graphics _Graphics = Graphics.FromImage(p_Bitmap);
                SizeF _DrawSize = _Graphics.MeasureString(p_ViewText, m_ValueFont);
                if (_DrawSize.Height > p_Bitmap.Height - 10 || _DrawSize.Width > p_Bitmap.Width)
                {
                    _Graphics.Dispose();
                    return;
                }
 
                int _StarY = p_Bitmap.Height - (int)_DrawSize.Height;
                _Graphics.FillRectangle(Brushes.White, new Rectangle(0, _StarY, p_Bitmap.Width, (int)_DrawSize.Height));
                _Graphics.DrawString(p_ViewText, m_ValueFont, Brushes.Black, 0, _StarY);
            }
 
            //12345678
            //(105 + (1 * 12 + 2 * 34 + 3 * 56 + 4 *78)) % 103 = 47
            //结果为starc +12 +34 +56 +78 +47 +end
 
            internal Image GetCodeImage(string p)
            {
                throw new NotImplementedException();
            }
        }
 
    }
}

调用代码为:

Code128 _Code = new Code128();
_Code.ValueFont = new Font("宋体", 20);
System.Drawing.Bitmap imgTemp = _Code.GetCodeImage("T26200-1900-123-1-0900",Code128.Encode.Code128A);
imgTemp.Save(System.AppDomain.CurrentDomain.BaseDirectory + "\\" + "BarCode.gif", System.Drawing.Imaging.ImageFormat.Gif);

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, 数据
, 编码
, 模块
, this
code
a站c值资源分享、c语言中文网vip分享、c值分享、c值资源分享、c值分享网,以便于您获取更多的相关知识。

时间: 2024-08-01 05:16:56

分享C#生成 Code39(extend)条形码 code128条形码 代码实例的相关文章

生成EAN13标准的条形码的ASP代码实例_应用技巧

复制代码 代码如下: <title>条形码生成</title><%Rem =================================================================Rem = 函数:ean13Rem = 说明:生成EAN13标准的条形码,有实例(ASP代码)Rem = 版本:1.0.0Rem = 作者:第七种直角(7th/semico)Rem = Date:2005-08-08 11:57:06Rem = QQ:11110785Rem

生成EAN13标准的条形码的ASP代码实例

复制代码 代码如下:<title>条形码生成</title><%Rem =================================================================Rem = 函数:ean13Rem = 说明:生成EAN13标准的条形码,有实例(ASP代码)Rem = 版本:1.0.0Rem = 作者:第七种直角(7th/semico)Rem = Date:2005-08-08 11:57:06Rem = QQ:11110785Rem =

asp.net(C#)生成Code39条形码实例

 这篇文章主要介绍了asp.net(C#)生成Code39条形码实例 条码枪可以扫描出.需要的朋友可以过来参考下,希望对大家有所帮助  代码如下: using System; using System.Collections; using System.ComponentModel; using System.Drawing; using System.Data;   namespace MSCL {     /// <summary>     /// 生成条码Code39     /// &

iOS8 生成二维码与条形码

iOS8 生成二维码与条形码 效果图: 源码: // // ViewController.m // CodeCreator // // Created by YouXianMing on 15/3/16. // Copyright (c) 2015年 YouXianMing. All rights reserved. // #import "ViewController.h" @interface ViewController () @property (nonatomic, stro

Python随机生成一个6位的验证码代码分享

 这篇文章主要介绍了Python随机生成一个6位的验证码代码分享,本文直接给出代码实例,需要的朋友可以参考下     1. 生成源码   代码如下: # -*- coding: utf-8 -*-   import random def generate_verification_code(): ''' 随机生成6位的验证码 ''' code_list = [] for i in range(10): # 0-9数字 code_list.append(str(i)) for i in range

php生成xml的简单代码(实例说明)

当处理基于XML应用程序时,开发者经常需要建立XML编码数据结构.例如,Web中基于用户输入的XML状态模板,服务器请求XML语句,以及基于运行时间参数的客户响应.       尽管XML数据结构的构建比较费时,但如果使用成熟的PHP DOM应用程序接口,一切都会变得简单明了.本文达内php培训老师将向你介绍PHP DOM应用程序接口的主要功能,演示如何生成一个正确的XML完整文件并将其保存到磁盘中.       创建文档类型声明     一般而言,XML声明放在文档顶部.在PHP中声明十分简单

apk-本地生成PDU伪造任意短信代码

问题描述 本地生成PDU伪造任意短信代码 能否在APK里面模拟用户手机收到一条短信,同时这条短信里面有中文和下载地址. 解决方案 [VB]短信pdu生成代码

jsp上传文件之后,针对上传文件自动生成超链接供下载,具体代码。谢谢。

问题描述 jsp上传文件之后,针对上传文件自动生成超链接供下载,具体代码.谢谢. jsp上传文件之后,针对上传文件自动生成超链接供下载,整个过程的具体代码.谢谢. 解决方案 这个代码很长,你自己做到哪一步了.上传文件后会返回一个地址,使用servlet访问路径和那个地址拼接出url放在a标签的href就行了 解决方案二: http://www.cnblogs.com/xdp-gacl/p/4200090.html 解决方案三: JSP上传文件代码

C#多个XML文件合并 然后生成一个新的XML文件代码怎么写

问题描述 读取多个xml文件然后合并生成一个新的XML文件代码怎么写大神给实际例子谢谢! 解决方案 解决方案二:没具体需求的?那我随便给你找个了啊解决方案三:本帖最后由 starfd 于 2015-11-04 12:36:49 编辑解决方案四:就是把所有的xml文件整合到一个里面解决方案五:那2楼的满足你了啊--就是读取出来然后Add给Root节点解决方案六:能发下具体代码例子吗解决方案七:2楼链接打开有具体代码--解决方案八:加我QQ远程帮我看看1587292914解决方案九:如果你的xml没