Афина. Формирование и печать штрих-кода EAN13

К содержанию

 

Зная алгоритм построения штрих-кода в любом приложении, которое может работать с графикой можно построить изображение такого штрих-кода.
В Афине это можно реализовать следующим образом.

Вначале в отчете, в котором предполагается печатать штрих-код необходимо сформировать функцию, привязанную к листу (секции). Методика описана на предыдущей странице. В конце мы вернемся еще к этой функции, а сейчас откроем библиотеку и в один из модулей перекинем туда следующий код.

функция СтрВЧсл(строка С; число Инд) : число
переменные число Ч:=0;
начало
 
если СтрокаВЧисло(ЧастьСтроки(С, Инд, 1), Ч) то выход Ч; иначе выход -1 конец
конец

функция EANCorrection(строка num) : строка
переменные
 
число А, N, Sum:=0, Sum2, flag, Dig:=0;
начало
  N := ДлинаСтроки(num); !передаем только 12 цифр, 13-я вычисляется
 
цикл А от 1 до N делать
    Dig := СтрВЧсл(Num, А);
   
если ДелПоМод(А, 2) = 0 то Sum := Sum + Dig * 3; иначе Sum := Sum + Dig конец;
 
конец
  Sum2 := Округлить(Sum, -1);
!до ближайшего большего, кратного десяти
 
если Sum2 < Sum то Sum2 := Sum2 + 10 конец;
  Flag := Sum2 - Sum;
 
если Flag = 10 то Flag := 0; конец

 
выход num + ВСтроку(Flag); !добавление контрольной цифры (12+1=13)
конец

функция ШК13(строка Код; число X, Y, Ширина, Высота)
!X, Y координаты начала изображения от левого верхнего края листа
!Щирина - ширина основной части без первой цифры, которая добавляется слева при печати
!Высота - высота основной части изображения штрих-кода (без цифр внизу)
!Все размеры в мм

переменные
 
колонка(строка) EAN_A, EAN_B, EAN_C, Codif;
 
строка Матрица:="";
 
число А, Dig:=0, Dig2:=0, W, L, ШЦ, См, ВШ, ШирШтриха;
начало
  EAN_A := Массив('0001101',
'0011001','0010011','0111101','0100011',
                 
'0110001','0101111','0111011','0110111','0001011');
  EAN_B := Массив(
'0100111','0110011','0011011','0100001','0011101',
                 
'0111001','0000101','0010001','0001001','0010111');
  EAN_C := Массив(
'1110010','1100110','1101100','1000010','1011100',
                 
'1001110','1010000','1000100','1001000','1110100');
  Codif := Массив(
'AAAAA','ABABB','ABBAB','ABBBA','BAABB',
                 
'BBAAB','BBBAA','BABAB','BABBA','BBABA');

! подготовка штриховой матрицы (строки, составляющей штрихи [если "1" или "х"] и
! пробелы [если "0"])
! каждая цифра кодируется семью сочетаниями штрихов и пробелов, отображенных в массивах
! EAN_A, EAN_B, EAN_C

  Код := EANCorrection(Код); 
     !вычисление и добавление (в Код) контрольной цифры
  Матрица := Матрица + 'x0x';      !два левых краевых штриха более длинные ("x" вместо "1")

  Dig := СтрВЧсл(Код, 2)+1;
  Матрица := Матрица + EAN_A(Dig); !вторая слева цифра кода (всегда по EAN_A)
                                   !(первая слева цифра не кодируется)
  Dig := СтрВЧсл(Код, 1)+1;       
!поз. в Codif

 
цикл А от 3 до 7 делать          !штрихи для цифр на 3-7 позициях
    Dig2 := СтрВЧсл(Код, А)+1;
    !поз. в EAN_A и EAN_В, в завис-ти от цифры кода
   
если ЧастьСтроки(Codif(Dig), А-2, 1) = 'A' то
      Матрица := Матрица + EAN_A(Dig2);
  
 иначе
      Матрица := Матрица + EAN_B(Dig2);
  
 конец
 
конец

  Матрица := Матрица + '0x0x0';
   !центральные штрихи
 
цикл А от 8 до 13 делать
    Матрица := Матрица + EAN_C(СтрВЧсл(Код, А)+1);
!оставшиеся штрихи для цифр на 8-13 поз.
 
конец;
  Матрица := Матрица + 'x0x';
     !концевые штрихи, тоже несколько длиннее основных

!печать ш-к с помощью прямоугольников
  ШирШтриха := Ширина / 95;     
!95 общее кол-во элементов в штриховой матрице (константа)
 
цикл А от 1 до ДлинаСтроки(Матрица) делать
    L := ШирШтриха * А + X;
   
если ЧастьСтроки(Матрица, А, 1) = "1" то
      пПрямоугольник(L, Y, ШирШтриха, Высота, 0,, 0);
   
конец
   
если ЧастьСтроки(Матрица, А, 1) = "x" то
      пПрямоугольник(L, Y, ШирШтриха, Высота+2, 0,, 0);
   
конец
 
конец;

!вывод текста
  ВШ := 12;
 
если ШирШтриха < 0.4 то ВШ := 8 конец !подогнать размер, если не помещается

  пТекст(X, Y+Высота, ЧастьСтроки(Код, 1, 1),, 2,, "Arial", ВШ);

  ШЦ := (ШирШтриха*42) / 6;
!ширина, отводимая под каждую цифру (шаг)
  См := ШирШтриха*5+X; !смещение слева
 
цикл А от 0 до 5 делать
    пТекст(ШЦ*А+См, Y+Высота, ЧастьСтроки(Код, А+2, 1),, 0,, "Arial", ВШ);
 
конец;
  См := ШирШтриха*51+X;
 
цикл А от 0 до 5 делать
    пТекст(ШЦ*А+См, Y+Высота, ЧастьСтроки(Код, А+8, 1),, 0,, "Arial", ВШ);
 
конец;
конец

Вот собственно и все. Осталось написать вызов этой функции, которая и будет печатать штрих-код.
В функции отчета напишем вызов функции формирования и печати штрих-кода.

функция Лист1 !функция выполняется перед формированием листа отчета
начало
  ШК13("977181521900", 10, 10, 40, 20)
  !В строке должно быть 12 цифр (контрольная вычисляется и подставляется,
  !в этом примере контрольная цифра равна "0")
  !10, 10 - координаты (в мм) начала изображения штрих-кода от верхнего левого угла листа
  !40 - ширина (в мм) основной части изображения; 20 - высота (в мм) основной части.
конец

Возможно добавить печать кода EAN8.

 
К содержанию