среда, 16 марта 2016 г.

Штрихкод в C# и ASP.NET

Примеры демонстрируют создание штрихкодов различных типов (CODE 128, QR Code, Data Matrix и др.) из консольных приложений на C# и скриптов ASP.NET с помощью библиотеки StrokeScribe. Первый пример содержит простейшие действия по сохранению штрихкода в файле формата BMP. Второй пример демонстрирует работу с картинками штрихкодов через интерфейс IStream напрямую в оперативной памяти. Данный метод не создает временных файлов для хранения штрихкода и может применяться в скриптах ASP.NET и при работе с базами данных.

Штрихкод в консольных приложениях и сервисах на C#

Чтобы протестировать этот пример, создайте новый проект консольного приложения на C#. Затем выполнитеProject->Add Reference из меню Visual Studio menu:
Меню Project в Visual Studio
Перейдите во вкладку COM и выберите StrokeScribe Class. Данное действие создаст класс-оболочку (StrokeScribeClass), упрощающий вызов методов COM-объекта из c#-приложения. Здесь показана работа с диалогом Add Reference в Visual Studio 2010. В VS2012 найдите вкладку COM->Type Libraries слева диалоговой панели.
Добавление ссылки на COM-объект в проект
Скопируйте этот код в ваш проект на c#:
using STROKESCRIBECLSLib;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            StrokeScribeClass ss = new StrokeScribeClass();
            
            ss.Alphabet = enumAlphabet.CODE128B;
            ss.Text = "123ABCDEF";
            ss.FontColor = 0x000000; //0xff0000=синий, 0x00ff00=зеленый, 0x0000ff=красный
            
            int width = ss.BitmapW;
            int rc = ss.SavePicture("barcode.bmp", enumFormats.BMP, width*2, width);
            if (rc != 0)
                System.Console.Write(ss.ErrorDescription);
        }
    }
}

Запустите проект и найдите файл barcode.bmp в папке проекта - это будет картинка со штрихкодом CODE 128, кодирующим строку "123ABCDEF". Чтобы выбрать другой тип штрихкода, измените значение свойства Alphabet.
В качестве дополнительного примера модификации свойств штрихкода, мы изменим цвет модулей штрихкода. Свойство FontColor задает цвет полос (для одномерных штрихкодов) и прямоугольных модулей (для 2D-штрихкодов). Чтобы изменить цвет фона под штрихкодом, обратитесь к свойству BkgndColor. Значение цвета может быть задано в шестнадцатиричной форме: 0x000000 - черный, 0x0000ff - красный, 0xff0000 - синий, 0xffffff - белый.
Пример картинки со штрихкодом CODE 128
Несколько слов о выборе размера битовой матрицы (BMP/JPG/PNG/GIF) для сохранения штрихкода. Поскольку ширина каждого модуля (или полосы) может быть только целым числом и все модули должны иметь одинаковую ширину, метод SavePicture не может масштабировать штрихкод произвольным образом. Если при вызове метода SavePicture для ширины будет задано некоторое "неудобное" значение, то штрихкод будет отображен с полями справа и слева. Чтобы уменьшить размер ненужных полей, всегда выбирайте размеры картинки пропорциональными значениям, возвращаемым свойствами BitmapW и BitmapH. BitmapH позволяет определить требуемую высоту для 2D-штрихкода (например, QR Code или Data Matrix). Для одномерных штрихкодов (CODE 128, EAN-13) допустимо задавать любое значение высоты.
Ширина и высота растровых картинок задается в пикселах. Размеры изображений в формате WMF - в TWIP (1/1440 дюйма). Вы можете задать произвольные значения для размеров штрихкода, сохраняемого в векторном формате (WMF/EMF).

Сохранение штрихкода в оперативной памяти с помощью IStream

Пример генерации штрихкода из приложения на c# без использования файлов BMP/JPG для временного хранения изображения штрихкода. Код может быть использован в скриптах ASP.NET и в приложениях для работы с базами данных.
Чтобы протестировать данный пример, создайте проект консольного c#-приложения и добавьте ссылку на StrokeScribe Class, как описано в предыдущем примере.
using STROKESCRIBECLSLib;
using System.IO;
using CT = System.Runtime.InteropServices.ComTypes;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            StrokeScribeClass ss = new StrokeScribeClass();

            ss.Alphabet = enumAlphabet.CODE128;
            ss.Text = "123ABC567";

            int width = ss.BitmapW;
            CT.IStream istream=(CT.IStream)ss.GetPicture(enumFormats.GIF, width*2, width);
            if(ss.Error>0)
            {
                System.Console.Write(ss.ErrorDescription);
                return;
            }

            CT.STATSTG stat;
            istream.Stat(out stat, 0);

            byte[] buf = new byte[stat.cbSize];
            istream.Read(buf, (int)stat.cbSize, System.IntPtr.Zero);

            MemoryStream ms = new MemoryStream(buf);

            FileStream fs = File.OpenWrite("code128.gif");
            ms.WriteTo(fs);
            fs.Close();
        }
    }
}

Как и в предыдущем примере, код генерирует картинку со штрихкодом формата CODE 128. Картинка создается в формате GIF, что удобно для Web-приложений. Кроме того, штрихкод остается в оперативной памяти, создание временного файла не требуется.
Метод GetPicture возвращает указатель на потоковый интерфейс IStream. Чтобы получить размер созданной картинки в байтах, используется метод Stat от интерфейса IStream. Чтобы получить массив байт, составляющих изображение, вызовите метод Read. Приведенный здесь код сохраняет массив байтов в GIF-файле, а скрипт ASP.NET может передать этот массив в Response.BinaryWrite(buf), чтобы отправить изображение штрихкода в браузер (см. пример ниже).
За рекомендациями по выбору размера растрового файла обращайтесь к предыдущему примеру.

Штрихкод в C#-скриптах ASP.NET

Пример генерации штрихкода из ASP.NET-скрипта на c# и отображения результата на web-странице. Как и в предыдущем примере, для хранения картинки со штрихкодом используется интерфейс IStream, позволяющий хранить штрихкод в оперативной памяти, без использования временных файлов.
Приведенный ниже c#-скрипт создает изображение в формате GIF, содержащее штрихкод CODE 128. Данные для создания штрихкода берутся из параметра data, передаваемого через HTTP-запрос.
Вторая часть примера - код HTML-страницы, которая отображает сгенерированный штрихкод с помощью тэга<img>. Вы можете изменить данные, которые будут помещены в штрихкод, смодифицировав параметр запроса:barcode.aspx?data=123abcde. Скопируйте код скрипта в каталог inetpub\wwwroot.
Перед запуском примера Вам потребуется создать interop assembly для StrokeScribe Class. Создайте новый ASP.NET-проект или новое консольное приложение на c# и добавьте в него ссылку на StrokeScribe Class, как это показано в первом примере. После сборки проекта Вы найдете файл Interop.STROKESCRIBECLSLib.DLL вobj\Debug или obj\Release в папке проекта. Скопируйте DLL в inetpub\wwwroot\bin, чтобы библиотека могла быть загружена из IIS. Обратите также внимание на директивы @Register и @Import в приведенном ниже c#-скрипте.
//barcode.aspx - скопируйте файл в inetpub\wwwroot

<%@ Page Language="C#"  Debug="true" %>

<%@ Register Tagprefix="STROKESCRIBECLSLib" 
   Namespace="STROKESCRIBECLSLib" 
   Assembly="Interop.STROKESCRIBECLSLib, Culture=neutral"
%>
    
<%@ Import Namespace="STROKESCRIBECLSLib" %>
<%@ Import Namespace="CT=System.Runtime.InteropServices.ComTypes" %>

<%
   String data=Request.QueryString["data"];
   StrokeScribeClass ss;
   ss = new StrokeScribeClass();
   ss.Alphabet = enumAlphabet.CODE128;

   ss.Text = data;
   CT.IStream istream = 
     (CT.IStream)ss.GetPicture(enumFormats.GIF, ss.BitmapW, ss.BitmapW/3);
   if(ss.Error>0)
   {
      //при возникновении ошибки, отправьте содержимое ss.ErrorDescription в log-файл
      return;
   }

   Response.Clear();
   Response.ClearHeaders();
    
   Response.ContentType = "image/GIF";
   Response.AddHeader("Content-Disposition", "attachment; filename=barcode.gif");

   //Поскольку BinaryWrite не принимает IStream напрямую,
   //потребуется скопировать данные из iStream в промежуточный байтовый массив.
   //Далее, массив может быть передан в BinaryWrite.
   CT.STATSTG stat;
   istream.Stat(out stat, 0);

   byte[] buf = new byte[stat.cbSize];
   istream.Read(buf, (int)stat.cbSize, System.IntPtr.Zero);
 
   Response.BinaryWrite(buf);
%>
Пример HTML-кода для отображения картинки со штрихкодом. Измените параметр data=, чтобы изменить содержимое штрихкода.
<!-- default.aspx - скопируйте в папку inetpub\wwwroot --> 
<html>
  <head>
    <title>Barcode Test</title>
  </head>
  <body>
    <h1>Barcode test</h1>
    <img src="barcode.aspx?data=123abcde" style="width: 20mm; height: 10mm">
  </body>
</html>

EAN-13 в консольных приложениях на C# и скриптах ASP.NET

Чтобы создать штрихкод стандарта EAN-13, смодифицируйте значение свойства Alphabet, как показано в примере ниже. EAN-13 не имеет никаких дополнительных настроек, влияющих на генерацию штрихкода. Не рекомендуется также изменять цвет линий штрихкода, так как это приводит к уменьшению контраста и ухудшению читаемости штрихкода лазерными сканерами.
EAN-13 в консольном c#-приложении
Вы можете послать полный, 13-разрядный код EAN в свойство Text - код будет проверен на правильность контрольной суммы и в свойство Error будет записано ненулевое значение в случае возникновения ошибки.
Также Вы можете отправить первые 12 цифр кода EAN в свойство Text. Контрольный разряд будет автоматически вычислен и добавлен в штрихкод.
Скопируйте приведенный ниже фрагмент кода в пример консольного c#-приложения. Код создаст BMP-файл с картинкой штрихкода EAN-13:
ss.Alphabet = enumAlphabet.EAN13;
ss.Text = "123456789012";
int width = ss.BitmapW; //замечания по выбору размеров см. здесь
ss.SavePicture("ean-13.bmp", enumFormats.BMP, width, width/2);
Данный фрагмент кода предназначен для модификации примера с интерфейсом ISteram и примера c#-скрипта для ASP.NET.
ss.Alphabet = enumAlphabet.EAN13;
ss.Text = "123456789012";
int width = ss.BitmapW;
CT.IStream istream = 
     (CT.IStream)ss.GetPicture(enumFormats.GIF, width, width/2);
Если требуется создать компактный образ EAN-13, без чистых зон по бокам, установите ss.HBorderSize = 0.

PDF417 в консольных C#-приложениях и скриптах ASP.NET

Чтобы создать штрихкод PDF417, Вам потребуется изменить значение свойства Alphabet, как показано в примере ниже.
PDF417 создан в консольном c#-приложении
Чтобы задать желаемое количество строк или столбцов в PDF417, задайте ненулевые значения свойствамPDF417Rows и PDF417Cols. ПО умолчанию, энкодер автоматически подбирает эти настройки, чтобы обеспечит правильные соотношения размеров модулей штрихкода.
Свойство PDF417ErrLevel управляет уровнем коррекции ошибок в штрихкоде PDF417. По умолчанию энкодер самостоятельно выбирает уровень коррекции согласно рекомендациям ISO/IEC 15438.
ss.Alphabet = enumAlphabet.PDF417;
ss.Text = "1234ABCDE5678EFGHIJKLM";
ss.PDF417Rows = 5;
ss.PDF417Cols = 8;
int w = ss.BitmapW;
int h = ss.BitmapH;
ss.SavePicture("pdf417.bmp", enumFormats.BMP, w, h);
Данный фрагмент кода создает картинку с наименьшими размерами - ширина модуля составляет 1 пиксел. Чтобы создать штрихкод больших размеров, задайте одинаковые множители для w и h, чтобы сохранить пропорции в размерах модулей:
int w = ss.BitmapW;
int h = ss.BitmapH;
ss.SavePicture("pdf417.bmp", enumFormats.BMP, w*3, h*3);
Вы можете указать любые значения для w и h, большие чем указано в свойствах BitmapW и BitmapH, но учтитерекомендации по выбору размера битовой матрицы из первого примера. Если Вы хотите сохранить PDF417 в векторном формате, то допустимо указывать любые значения для ширины и высоты, но учтите, что форматы EMF/WMF не предназначены для Web-страниц.
Пример кода ниже передает картинку с PDF417 в формате GIF через потоковый интерфейс IStream. Скопируйте код в пример работы с IStream или в пример c#-скрипта для ASP.NET.
ss.Alphabet = enumAlphabet.PDF417;
ss.Text = "1234ABCDE5678EFGHIJKLM";
int w = ss.BitmapW;
int h = ss.BitmapH;
CT.IStream istream = 
     (CT.IStream)ss.GetPicture(enumFormats.GIF, w, h);

Data Matrix в консольных C#-приложениях и скриптах ASP.NET

Штрихкод Data Matrix создается, когда свойство Alphabet установлено вenumAlphabet.DATAMATRIX.
Для Data Matrix доступны следующие настройки: DataMatrixMinSize - фиксирует минимальный размер штрихкода, используемый для кодирования пользовательских данных. На рисунке справа показан штрихкод Data Matrix, для которого минимальный размер матрицы - 32x32 модуля. Хотя матрицы размерами 12x12 достаточно для хранения строки "1234ABCDE", будет использована матрица большего размера, заданного через свойство DataMatrixMinSize.
Data Matrix сгенерирован кодом на c#
Свойство ECI указывает кодовую страницу, в которой закодирован текст внутри штрихкода. Используйте это свойство, только если известно, что принимающее оборудование и программное обеспечение ECI-совместимы.
Свойство UTF8 позволяет кодировать не-ASCII символы для чтения на смартфонах.
Приведенный ниже код создает штрихкод с модулями размером 2x2 пиксела. Измените множители для w* и h* в вызове метода SavePicture, чтобы получить картинку больших или меньших размеров.
Скопируйте фрагмент кода в пример консольного приложения на c#.
ss.Alphabet = enumAlphabet.DATAMATRIX;
ss.DataMatrixMinSize = 32;
ss.ECI = 0;
ss.UTF8 = false;
ss.Text = "1234ABCDE";
int w = ss.BitmapW;
int h = ss.BitmapH;
ss.SavePicture("datamatrix.bmp", enumFormats.BMP, w*2, h*2);
Если требуется создать Data Matrix с высоким разрешением, то используйте векторный формат WMF вместо растрового BMP. Полный список поддерживаемых графических форматов приведен в документации поSavePicture.
Чтобы создать Data Matrix из c#-скрипта для ASP.NET, смодифицируйте пример для ASP.NET, как показано ниже:
ss.Alphabet = enumAlphabet.DATAMATRIX;
ss.DataMatrixMinSize = 32;
ss.Text = "1234ABCDE";
int w = ss.BitmapW;
int h = ss.BitmapH;
CT.IStream istream = (CT.IStream)ss.GetPicture(enumFormats.GIF, w, h);

QR Code в консольных C#-приложениях и скриптах ASP.NET

Штрихкод QR Code генерируется при установке свойства Alphabet = enumAlphabet.QRCODE.
Для ручного управления уровнем коррекции ошибок измените значение свойства QrECL (по умолчанию QrECL=M). Установка QrECL=H позволяет восстановить до 30% данных в случае повреждения штрихкода, но размер блока коррекции будет достигать 60 процентов от емкости матрицы.
QR Code создан в c#-приложении
Свойство QrMinVersion позволяет задать минимальную версию матрицы для кодирования пользовательских данных. На рисунке справа показан QR Code с 10ой версией матрицы.
Свойство ECI указывает кодовую страницу, в которой закодирован текст внутри штрихкода. Используйте это свойство, только если известно, что принимающее оборудование и программное обеспечение ECI-совместимы.
Если UTF8=true, то не-ASCII символы кодируются в системе UTF-8. Установите это свойство, если требуется считывание не-ASCII содержимого на смартфонах.
Метод SavePicture создает штрихкод с модулями размером 2x2 пиксела. Чтобы изменить размеры изображения, измените множители для w* и h*. Используйте формат WMF для изображений с высоким разрешением или если планируется вставка штрихкода в приложения Microsoft Office.
Смодифицируйте пример консольного приложения, как показано ниже:
ss.Alphabet = enumAlphabet.QRCODE;
ss.QrECL = enumQR_ECL.M;
ss.QrMinVersion = 10;
ss.ECI = 0;
ss.UTF8 = false;
ss.Text = "1234567890ABCdef";
int w = ss.BitmapW;
int h = ss.BitmapH;
ss.SavePicture("qr-code.bmp", enumFormats.BMP, w*2, h*2);
Чтобы сгенерировать QR Code из c#-скрипта для ASP.NET, смодифицируйте пример для ASP.NET следующим образом:
ss.Alphabet = enumAlphabet.QRCODE;
ss.QrECL = enumQR_ECL.M;
ss.ECI = 0;
ss.UTF8 = false;
ss.Text = "1234567890ABCdef";
int w = ss.BitmapW;
int h = ss.BitmapH;
CT.IStream istream = (CT.IStream)ss.GetPicture(enumFormats.GIF, w, h);

Использование StrokeScribe ActiveX с C#-формами

1. В Visual Studio перейдите в Toolbox и выполните Choose Items:
Toolbox в Visual Studio 2010
2. В диалоге Choose Toolbox Items перейдите во вкладку COM Components и выберите StrokeScribeControl.
Диалог 'Choose Toolbox Items' в Visual Studio
3. На панели Toolbox отыщите StrokeScribe Control и перетащите его на форму:
Перетаскивание ActiveX из Toolbox на форму
4. Разместите кнопку на форме:
Форма со StrokeScribe Activex и кнопкой
5. Двойным щелчком на кнопке откройте редактор кода и скопируйте следующий пример в тело функции button1_Click():
axStrokeScribe1.Alphabet = STROKESCRIBELib.enumAlphabet.CODE128B;
axStrokeScribe1.CtlText = "12345678";

Источник: здесь

Комментариев нет:

Отправить комментарий