Создаём штрих-код ITF в Delphi / Lazarus / С++ Builder

Немного теории о штрих-кодах

Сложно представить нашу жизнь без штрих-кодов особенно сейчас, когда мы их встречаем на каждом шагу. Идём в кинотеатр и ваш билет будет содержать этот “чёрно-белый рисунок из линий”, заходим в супермаркет и на каждом товаре будет информация о нём в виде штрих-кода. Можно сейчас только вообразить какие бы были очереди, если бы кассир вводил идентификаторы товаров вручную, а не с помощью сканера. К тому же, велик риск ошибиться при вводе последовательности цифр. Сегодня же мы рассмотрим малую часть из всевозможных баркодов.

ITF (Interleaved Two of Five) или же штрих-код “2 из 5 чередующихся”  - это двухполосный числовой код, по-другому код высокой плотности, который может кодировать только пары чисел (штрих-код должен иметь чётное число цифр!). Каждый такой штрих-код кодирует нечётную цифру темной линией и чётную цифру - пробелом между ними. Чтобы закодировать нечётное число цифр, вы должны дополнить самую левую (старшую) цифру нулем.

Штрих-коды могут иметь переменную длину и обычно не используют контрольную сумму, хотя в некоторых ситуациях используется символ проверки по модулю 10. Частичное сканирование возможно, так как штрих-код 2 из 5 чередующихся не является самопроверяемым, а поля данных фиксированной длины часто используются для обхода этой проблемы.

Если коротко, то:
- Можно кодировать только числа;
- Длина переменная, но должна иметь четное число цифр;
- Контрольная сумма не обязательна.

Поскольку ITF является штрих-кодом с очень высокой плотностью данных, то он имеет следующие свойства:

Сравнив длину кода на двоичном уровне с CODE 39 и Codabar, можно заметить особенность ITF, а именно его очевидно маленькую длину.

Сравниваем длину IFP c CODE 39 и Codabar

Хоть у ITF есть много преимуществ, он также имеет недостаток, заключающийся в возможном «пропуске чтения» из-за его структуры. Пропуск считывания означает, что
штрих-код, представляющий «3852», может неправильно считаться как «38» с пропуском некоторых цифр.

Недостаток ITF/ Lack of ITF

Как ITF-14, так и GTIN-14 создаются с использованием штрих-кода 2 из 5 с чередованием. Этот штрих-код используется на транспортных контейнерах и основан на коде UPC. Обычно interleaved печатают на гофрокартонных коробках, в которых содержатся товары для доставки и имеет он вот такую структуру:

Структура interleaved

Industrial был разработан Identicon Corp. и Computer Identics Corp. в 1970 году и активно использовался в промышленных приложениях, однако в настоящее время он не используется (за исключением некоторых приложений логистики). Индустриальный «2 из 5» имеет следующий вид и использует 5 полос для представления одного знака. Поскольку этот код назначает данные только столбцам, а не пробелам, то он имеет очень низкую плотность данных.

Структура industrial

Matrix 2 из 5 является более плотным членом семейства символов кода 2 из 5, который был впервые разработан в 1968 году. В основном его использовали для сортировки на складе и для фото отделки. Имя "2 из 5" происходит от того, что из пяти элементов (баров и пробелов), которые используются для кодирования каждого символа, два являются широкими, а три-узкими.

Структура matrix

Тонкая настройка штрих-кода в Delphi и Lazarus для печати

FastReport VCL позволяет использовать все три рассмотренных типа штрих-кода. Посмотрим, как их использовать.

В дизайнере FastReport VCL добавляем на отчёт компонент obCatBarcode и выбираем тип из предложенного списка:

FastReport VCL

Далее мы переходим в редактор штрих-кода:

Редактор штрих-кода

Code - область для написания числового значения штрих-кода;
Type of Bar - тип штрих-кода можно изменить сразу в редакторе не добавляя на отчёт новый компонент obCatBarcode;
CalcCheckSum- это контрольная сумма. Это свойство имеется у всех линейных штрих-кодов. Помните про “пропуск считывания”? С этим надо как-то бороться! Свойство определяет, надо ли считать контрольную сумму автоматически. Если оно отключено, контрольная сумма должна присутствовать в тексте объекта.
Zoom - задает масштабирование штрих-кода и используется только вместе со свойством "Авторазмер";
Text - это текст под штрих-кодом.
Rotation - позволяет задать поворот объекта на один из фиксированных углов – 0, 90, 180, 270 градусов.

Пример кода штриховой маркировки ITF

Проверяем корректность сгенерированного штрих-кода (благо фотоаппарат и программа для сканирования штрихкодов сейчас доступны во всех современных смартфонах).

Создаём штрих-код из кода Delphi/Lazarus

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
uses frxBarcod;
procedure TForm1.Button1Click(Sender: TObject);
var bc: TfrxBarcodeView;
begin
bc := TfrxBarcodeView(frxReport1.FindObject('BarCode1'));
{Устанавливаем тип штрихкода}
bc.BarType := bcCode_2_5_interleaved;
{Устанавливаем фиксированное значение штрихкода}
bc.Text := '123456';
{Устанавливаем вычисляемое значение штрихкода}
//bc.Expression := '<YourDatasetName."FieldName1"> + <YourDatasetName."FieldName2">';
{Устанавливаем, нужно ли подсчитывать контрольную сумму и добавлять её в конец штрихкода}
bc.CalcCheckSum := False;
{Устанавливаем масштаб, в котором будет отображаться штрихкод}
bc.Zoom := 2;
{Устанавливаем угол поворота штрихкода. Может принимать значения 0, 90, 180, 270}
bc.Rotation := 0;
{Устанавливаем, нужно ли устанавливать ширину штрихкода в зависимости от его содержимого.}
{При значении False Zoom будет принимать такое значение, чтобы ширина штрихкода оставалась фиксированной}
bc.AutoSize := True;
{Устанавливаем цвет фона штрихкода}
bc.Color := clNone;
{Устанавливаем цвет линий штрихкода}
bc.ColorBar := clBlack;
{Устанавливаем, нужно ли отображать текcт внизу штрихкода}
bc.ShowText := True;
frxReport1.ShowReport();
end;

Теперь мы знаем немного больше о ITF штрих-кодах и можем использовать их для своих отчётов-этикеток-ценников и вообще всего.