Мне нужно распечатать и чередовать 2 из 5 штрих-кодов (18 цифр без контрольной суммы) с помощью GDI+. Я сделал это для штрих-кода кода 128, используя код, найденный в Интернете. Сканер штрих-кода, к сожалению, не читает код 128, поэтому мне приходится прибегать к штрих-кодам ITF.

Спасибо, Кен

2
user153584 10 Авг 2009 в 12:34
Можно ли использовать файлы шрифтов? От PrecisionId доступен штрих-код 2 из 5 за 95 долларов.
 – 
Christian13467
10 Авг 2009 в 13:28

2 ответа

class I2of5
{
    private static string[] patterns =
    {
        "NNWWN",//0
        "WNNNW",//1
        "NWNNW",//2
        "WWNNN",//3
        "NNWNW",//4
        "WNWNN",//5
        "NWWNN",//6
        "NNNWW",//7
        "WNNWN",//8
        "NWNWN"//9
    };

    public I2of5()
    {

    }
    public static Image MakeBarcodeImage(string barcodeNumber)
    {
        int width = 420;
        int height = 60;

        string barcodeString = "NnNn";//start pattern
        int barcodeLength = barcodeNumber.Length;
        for(int i =0 ; i < barcodeLength; i++)
        {
            int firstNumber = int.Parse(barcodeNumber[i].ToString());
            int secondNumber = int.Parse(barcodeNumber[i + 1].ToString());

            string firstPattern = patterns[firstNumber].ToUpper();
            string secondPattern = patterns[secondNumber].ToLower();

            barcodeString += String.Format("{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}", firstPattern[0], secondPattern[0],
                firstPattern[1] , secondPattern[1] ,
                firstPattern[2] , secondPattern[2] , 
                firstPattern[3] , secondPattern[3] , 
                firstPattern[4] , secondPattern[4]);

            i++;
        }
        barcodeString +="WnN";//stop pattern

        Image barcodeImage = new System.Drawing.Bitmap(width, height);
        using (Graphics gr = Graphics.FromImage(barcodeImage))
        {

            // set to white so we don't have to fill the spaces with white
            gr.FillRectangle(Brushes.White, 0, 0, width, height);

            int cursor = 0;

            for (int codeidx = 0; codeidx < barcodeString.Length; codeidx++)
            {
                char code = barcodeString[codeidx];

                int BarWeight = 1;
                int barwidth = ((code == 'N') || (code == 'n'))?2 * BarWeight: 6 * BarWeight;

                if((code == 'N') || (code == 'W'))
                {
                    gr.FillRectangle(System.Drawing.Brushes.Black, cursor, 0, barwidth , height);
                }

                // note that we never need to draw the space, since we 
                // initialized the graphics to all white

                // advance cursor beyond this pair
                cursor += barwidth;
            }



        }
        return barcodeImage;
    }
5
Halfgaar 4 Окт 2013 в 16:27
1
Это третий фрагмент кода, который я попробовал, и он работает (остальные нет). Я проверил штрих-код с помощью верификатора качества, и он получил оценку A (из F) по всем параметрам (читаемость, декодируемость и т. д.).
 – 
Halfgaar
4 Окт 2013 в 16:55
1
При использовании этого я заметил, что это вызовет исключение, если кодируемая строка имеет длину, которая является нечетным числом. После некоторого чтения кажется, что использование ITF может работать только с четными длинами, а в некоторых местах предлагается добавить 0 для нечетных значений длины: whatbarcode.com/bar25i.htm Надеюсь, кому-то это поможет.
 – 
chrismay
2 Авг 2016 в 02:30

Я не знаю о GDI+, но вы можете сделать это с помощью iTextSharp (с открытым исходным кодом). Вот пример: http://itextsharp.sourceforge.net/examples/Chap0907.cs

И объяснение здесь: http://itextsharp.sourceforge.net/tutorial/ch09.html #штрихкод

1
grenade 10 Авг 2009 в 14:01