Generate1DBarcode

From SunFlurry wiki
Jump to: navigation, search
  Generate1DBarcode (Функции штрихкодов)
Объект:Функции общего назначения
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в строку, число, неверный аргумент
Визуальность:Нет

Функция генерирует линейный штрихкод указанного типа с указанными размерами, если необходимо. Параметры генерации настраиваются с помощью дополнительных установок, если необходимо. Функция поддерживает следующие виды штрихкодов: Code 128,UPC,EAN,Code 39,ISBN,Code 93,ITF (Interleaved 2 of 5),MSI,Codabar. Результат представляется в виде картинки, которую можно использовать на форме, в электронной таблице, передавать с помощью TCP/IP или сохранять на диск в определенном формате (см. Картинка). Размер создаваемой картинки обычно не имеет большого значения для линейных штрихкодов, однако, если в штрихкоде присутствует текст, чем больше будет размер сгенерированной картинки, тем более гладким при печати будет выглядеть текст. Картинка может генерироваться в двух форматах: реальный цвет (32 бита на точку) и индексированный цвет (8 бит на точку). В первом случае картинка занимает почти в 4 раза больше памяти, при этом, при печати разницы между этим двумя форматами не будет, поэтому, для печатных форм выгоднее использовать индексированный цвет. Штрихкод оперирует понятием ширина модуля или высота модуля. В первом случае, это ширина одного штриха в точках, во втором, высота штриха в точках. Для линейного штрихкода текст обычно печатается совместно с штриховым рисунком и располагается непосредственно под последним, однако, эту опцию можно отключить.

Документация содержит онлайн демонстрацию возможностей функции в статье Генерация штрихкодов.

Синтаксис

Generate1DBarcode(<Тип штрихкода (STRING)>,<Ширина (INT)>,<Высота (INT)>,<Кодируемое сообщение (STRING)>,<Установки (STRING)>):<Результат (PICTURE)>

Аргументы

  • <Тип штрихкода (STRING)> - Строка-тип штрихкода, который необходимо сгенерировать. Поддерживаются следующие типы штрихкодов:
    • Code 128, Code128 -- Самый универсальный линейный штрихкод. Code 128 может содержать строку любого размера, поддерживает латинские буквы разных регистров, цифры, знаки, бинарную информацию.
    • EAN -- Стандартный товарный штрихкод, поддерживает только цифры, может использовать формат с 13 цифрами (EAN-13) и с 8-ю цифрами (EAN-8). Последняя цифра кода является контрольной суммой, если предлагаемые для кодирования данные содержат неверную последнюю цифру, будет вызвано исключение.
      • Для EAN-13 последняя цифра может быть рассчитана по формуле: (10-((d2+d4+d6+d8+d10+d12)*3+d1+d3+d5+d7+d9+d11) mod 10) mod 10, где d? -- цифра кода соответствующей позиции.
      • Для EAN-8 последняя цифра может быть рассчитана по формуле: (10-((d1+d3+d5+d7)*3+d2+d4+d6) mod 10) mod 10, где d? -- цифра кода соответствующей позиции.
    • UPC -- Стандартный товарный штрихкод США, являющийся совместимым с EAN-13 (EAN-13 является продолжением идеи UPC-A). Поддерживаются только цифры. Может использоваться формат с 2-мя цифрами (UPC-2, дополнение, обычно задающее номер журнала), 5-ю цифрами (UPC-5), 8-ю цифрами (UPC-E) или 12-ю цифрами (UPC-A). Функция также принимает UPC с 13-тью цифрами , когда его первая цифра равна нулю.
      • Последняя цифра UPC-A является контрольной и рассчитывается по формуле (10-((d1+d3+d5+d7+d9+d11)*3+d2+d4+d6+d8+d10) mod 10) mod 10.
      • Последняя цифра UPC-5 является контрольной и рассчитывается по формуле ((d1+d3+d5)*3+(d2+d4)*9) mod 10.
      • Первая цифра UPC-E должна быть равна 0 или 1.
    • ISBN -- Используется для нумерации книг и журналов. Совместим с EAN-13, однако, обычно имеет 10 цифр. Чтобы превратить ISBN в EAN-13, к данным ISBN обычно добавляется три цифры "978" с начала строки. Функция принимает 10-цифорное значение ISBN (при этом последняя контрольная цифра пересчитывается автоматически), либо 13-цифорное значение ISBN, трактующееся как EAN-13.
    • Code 39, Code39 -- Является ранним аналогом Code 128, при одинаковых входящих данных, создает более длинный штрихкод по сравнению с Code 128.
    • Code 93, Code93 -- Менее известная попытка улучшения Code 39. В данный момент используется крайней редко.
    • ITF, ITF-14, Interleaved 2 of 5 -- Штрихкод может быть любой длины, однако, принимает только цифры, при этом количество цифр должно быть четным числом. Преимуществом штрихкода является его компактность (сравнимая, однако, с Code 128) и встроенный механизм контроля корректности.
    • MSI -- Устаревший штрихкод любой длины, принимающий только цифры. Может содержать контрольную цифру, способ создания которой может быть разным (см. параметр CD). Созданный штрихкод гораздо менее компактен, чем ITF или Code 128.
    • Codabar, CodeABar -- Устаревший штрихкод любой длины, принимающий только цифры и символы -$:/.+ABCD. Штрихкод должен начинаться и заканчиваться на один из символов ABCDEN*T. Содержит механизм контроля корректности, поэтому не нуждается в контрольной цифре.
  • <Ширина (INT)>,<Высота (INT)> - (возможен аргумент-переменная (ByRef)) Ширина и высота картинки результата, в зависимости от этих параметров, функция работает в одном из режимов:
    • <Ширина>,<Высота> являются переменными и <Ширина> инициализирована нулем. В этом случае, функция вернет в указанных переменных минимальную ширину и высоту картинки, требуемой для генерации штрихкода, при этом сама функция не возвратит картинку. Этот режим используется для определения высоты и ширины с тем, чтобы использовать эти данные перед генерацией.
    • Если аргумент <Ширина> меньше нуля (к примеру, -1), функция произведет генерацию картинки в необходимой пропорции, с учетом коэффициента увеличения (SCALE) и вернет результат, как картинку.
    • Если аргументы <Ширина> и <Высота> больше нуля, они задают ширину и соответственно высоту результирующей картинки, при этом функция постарается разместить штрихкод в центральной части картинки. Высота картинки будет определять высоту штрихов, так как высота штриха для линейных штрихкодов может варьироваться в определенном диапазоне, однако высоту текста изменить уже сложнее. Если места на картинке с заданными размерами недостаточно, функция вызовет исключение.
  • <Кодируемое сообщение (STRING)> - Кодируемое сообщение должно представлять собой строку (ANSI или UTF-16) и может содержать только цифры или цифры, буквы и знаки, в зависимости от типа генерируемого штрихкода.
  • <Установки (STRING)> - (необязательный аргумент) Строка представляет собой набор дополнительных параметров, используемых для генерации штрихкода. Параметры записываются один за другим, разделенные запятыми. Каждый из параметром должен быть записан в виде <Имя параметра>:<Значение параметра> (к примеру, SCALE:3). Ниже дана таблица возможных параметров с описанием.
Параметр Описание
T:+ (по умолчанию), T:- Параметр задает режим печати текста под генерируемым штрихкодом (T:+), либо запрещает генерацию текста (T:-).
F:<Имя шрифта>[|<Размер шрифта>[|<Свойства шрифта>[|<Цвет шрифта>]]] Параметр задает шрифт для генерации текста. По умолчанию используется значение Consolas|||0. См. также статью Формат записи шрифтов в системе.
BC:<Цвет бумаги> Используется для задания цвета заднего фона, на котором генерируется штрихкод. Цвет задается в шестнадцатеричной 24-битной нотации. По умолчанию BC:FFFFFF -- белый цвет.
LC:<Цвет штриха> Используется для задания цвета штрихов. Цвет задается в шестнадцатеричной 24-битной нотации. По умолчанию LC:000000 -- черный цвет.
BR:<Ширина пустого окружения штрихкода (бордюра)> Ширина задается в точках (не модулях). По умолчанию зависит от типа штрихкода.
BRU:<Ширина верхнего отступа (бордюра)> Ширина задается в точках (не модулях). По умолчанию зависит от типа штрихкода.
BRD:<Ширина нижнего отступа (бордюра)> Ширина задается в точках (не модулях). По умолчанию зависит от типа штрихкода.
BRL:<Ширина левого отступа (бордюра)> Ширина задается в точках (не модулях). По умолчанию зависит от типа штрихкода.
BRR:<Ширина правого отступа (бордюра)> Ширина задается в точках (не модулях). По умолчанию зависит от типа штрихкода.
BRT:<Ширина зазора между штрихами и текстом> Ширина задается в точках (не модулях). Разрешено использование отрицательной ширины. По умолчанию составляет две ширины модуля.
SCALE:<Коэффициент масштабирования> Безразмерный коэффициент на который будут умножены все размеры (ширина и высота модуля, размер шрифта, размеры бордюров и пр.) при генерации штрихкода. По умолчанию равен единице. К примеру, если этот коэффициент будет равен двум, генерируемая картинка будет в два раза больше.
QZ:<Размер зоны тишины> "Зона тишины" это дополнительный бордюр следующий по горизонтали перед штрихами штрихкода и после них. Стандарты некоторых штрихкодов требуют присутствия подобной зоны для корректного считывания. Зона задается в ширинах модуля (не в точках) и по умолчанию составляет 10 модулей.
BH:<Высота модуля> Задает высоту модуля в точках. По умолчанию эта величина рассчитывается из размеров картинки (если таковые заданы) или ширины модуля по формулам, являющимся стандартными для каждого из штрихкодов.
BHP:<Высота модуля в процентах> Задает высоту модуля в процентах от ширины среднего кодированного символа (не одного модуля). Для разных типов штрихкодов один символ может быть кодирован разным количеством модулей. К примеру, при числе 100 высота модуля будет соответствовать ширине одного символа. Не имеет смысла использовать этот параметр одновременно с BH.
NH:<Высота меток EAN> Задает высоту удлинения начальных, конечных и средних штрихов в штрихкодах типа EAN. Высота задается в процентах и высоты текста и имеет значение 25 по умолчанию. Данная высота является декоративной и не влияет на читаемость штрихкода.
BPP:<Битов на точку> Задает режим создаваемой картинки. Может использоваться 2 значения: 8 (индексируемый цвет), 32 (реальный цвет). 8 бит на точку используется по умолчанию, так как позволяет сократить потребность в памяти в 4 раза при создании картинки. При печати картинки разницы между 8-битным и 32-битным цветом не будет, однако, при сохранении картинки на диск или использовании для внешних источников, выбор формата определяется возможностями декодирования картинки внешним источником.
WEW:<Ширина широкого модуля> Задает ширину широких модулей для штрихкодов типа Code 39, ITF и Codabar, которые наряду с узкими модулями используют также широкие. Обычно эта ширина равна 2 узким модулям, однако стандарты разрешают использовать число 3 или даже больше.
CD:<Тип контрольной цифры MSI> Задает способ подсчета контрольной цифры в штрихкоде MSI. Могут использоваться следующие значения: 0 -- не добавлять контрольную цифру перед выводом, 10 (по умолчанию) -- контрольная цифра рассчитывается способом mod 10, 11 -- контрольная цифра рассчитывается способом mod 11

Возвращаемое значение

В зависимости способа вызова функции, она возвращает либо объект, типа картинка, либо пустое значение

Примеры

Генерация EAN-13

Картинка-результат работы примера
//Пример генерирует EAN-13 и сохраняет его на диск в файл C:\file.png
аК:=Generate1DBarcode("EAN",-1,-1,"4601248015571","SCALE:5,BRT:-2,NH:50,F:Tahoma,BPP:32,BRU:2");
аК.Save("c:\file.png","png");

Генерация UPC-A с дополнительным UPC-2

Картинка-результат работы примера
//Пример генерирует UPC-A с дополнительным UPC-2, располагающимся справа от него
// Затем сохраняет результат на диск в файл C:\file.png
//Штрихкод взят с сайта http://www.barcodeisland.com/upcext.phtml
СтрПар:="SCALE:5,BRT:-2,NH:50,F:Tahoma,BPP:32,BRU:2,BHP:200";
//Генерация штрихкодов
аК:=Generate1DBarcode("UPC",-1,-1,"042100005264",СтрПар);
аК2:=Generate1DBarcode("UPC",-1,-1,"12",СтрПар);
//Создание большой картинки и добавление на нее сгенерированных ранее штрихкодов
aPic:=Picture.Create(аК.Width+аК2.Width+5,Max(аК.Height,аК2.Height),toRGB(255,255,255),32);
aPic.DrawPicture(аК,0,0,аК.Width,аК.Height);
aPic.DrawPicture(аК2,аК.Width+5,0,аК2.Width,аК2.Height);
//Сохранение результата
aPic.Save("c:\file.png","png");

Генерация Code 128

Картинка-результат работы примера
//Пример генерирует Code 128 с текстом "Code 128" и сохраняет его на диск в файл C:\file.png
аК:=Generate1DBarcode("Code 128",-1,-1,"Code 128","SCALE:5,BRT:-1,F:Tahoma,BPP:32,BRU:2");
аК.Save("c:\file.png","png");

Сравнение картинок Code 128, Code 39, Code 93, ITF, MSI и Codabar на примере генерации числа

Картинка-результат работы примера
//Пример генерирует число 1234567890 для 6 разных типов штрихкодов, при этом
//  для штрихкода типа Codabar по спецификации добавляются начальный и конечный знак (+2 знака),
//  что делает сравнение не совсем честным (однако, требование отобразить "1234567890" выполняется).
СтрПар:="SCALE:5,T:-,BRU:2";
aList:=List.Create("ITF","Code 128","Code 93","MSI","Codabar","Code 39");
bList:=List.Create();
Шир:=0;
Выс:=0;
//Подсчет требуемой высоты и ширины общей картинки, генерация картинок в цикле
For i:=1 To aList.Size() Do
  If aList.Get(i)="Codabar" Then
    аК:=Generate1DBarcode(aList.Get(i),-1,-1,"*1234567890*",СтрПар);
  Else
    аК:=Generate1DBarcode(aList.Get(i),-1,-1,"1234567890",СтрПар);
  EndIf;  
  bList.Add(аК);
  Шир:=Max(Шир,аК.Width);
  Выс:=Выс+аК.Height+10;
EndDo;
//Нахождение высоты текстовой строки
ВысТ:=Picture.TextHeight("Code 128","Tahoma|14|B");
//Создание большой картинки и добавление на нее сгенерированных ранее штрихкодов
aPic:=Picture.Create(Шир,Выс+ВысТ*aList.Size(),toRGB(255,255,255),32);
ВысТек:=0;
For i:=1 To aList.Size() Do
  аК:=bList.Get(i);
  aPic.DrawPicture(аК,0,ВысТек,аК.Width,аК.Height);
  aPic.Text(0,ВысТек+аК.Height,aList.Get(i),"Tahoma|14|B");
  ВысТек:=ВысТек+аК.Height+ВысТ+10;
EndDo;

//Сохранение результата
aPic.Save("c:\file.png","png");