Generate2DBarcode

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

Функция генерирует двумерный символ указанного типа с указанными размерами, если необходимо. Параметры генерации настраиваются с помощью дополнительных установок, если необходимо. Функция поддерживает следующие виды символов: PDF 417, Aztec Code, QR Code, Data Matrix, MaxiCode. Результат представляется в виде картинки, которую можно использовать на форме, в электронной таблице, передавать с помощью TCP/IP или сохранять на диск в определенном формате (см. Картинка). Размер создаваемой картинки обычно не имеет большого значения для двумерных символов, однако, при печати маленьких картинок края модулей могут выглядеть размытыми после увеличения, что может сказаться на читаемости символа, поэтому, желательно указывать масштабирование в пределах 5. Картинка может генерироваться в двух форматах: реальный цвет (32 бита на точку) и индексированный цвет (8 бит на точку). В первом случае картинка занимает почти в 4 раза больше памяти, при этом, при печати разницы между этим двумя форматами не будет, поэтому, для печатных форм выгоднее использовать индексированный цвет. Функция оперирует понятием ширина модуля или высота модуля: модулем в двумерных символах чаще всего является квадрат, ширина и высота модуля при этом будут одинаковыми и будут совпадать с длиной стороны квадрата в точках. Для символов текст обычно не печатается совместно с рисунком, поэтому опция T не будет влиять на результат. В отличие от линейных штрихкодов, двумерные символы могут содержать международный текст, однако, большинство оборудования не смогут прочитать символы, в данных которых содержатся международные символы (если необходимо закодировать строку с кириллицей, предпочтительнее использовать режим ECI с номером 3 (UTF-8)).

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

Синтаксис

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

Аргументы

  • <Тип символа (STRING)> - Строка-тип символа, который необходимо сгенерировать. Поддерживаются следующие типы символов:
    • PDF 417, PDF417 -- Один из первых двумерных символов, который по-прежнему активно используется. При одинаковых данных картинка символа занимает больше места, чем у таких символов, как QR или Aztec, однако, для чтения символа достаточно более простого оборудования, так как он может читаться линейным сканером построчно, тогда как остальные символы требуют разбора всей картинки, что, кроме того, медленнее. Функция поддерживает три типа PDF417: стандартный, компактный и микро-символ.
    • Aztec Code, Aztec -- Вместительный символ, используется реже QR или Data Matrix. Функция поддерживает три типа символов Aztec Code: полноформатный, компактный и символы Aztec rune, использующиеся для кодирования чисел с 0 до 255. Сложность подбора наиболее компактного способа размещения информации может замедлить создание больших символов, для таких случаев существует режим ускоряющий кодирование за счет небольшого увеличения количества полезной информации в символе.
    • QR Code, QR -- Наиболее популярный двумерный символ, функция поддерживает: стандартный QR Code, и микро QR Code.
    • Data Matrix, DataMatrix -- Популярный вместительный двумерный символ, форма модулей может отличаться от квадратной, поэтому, символ может быть нарисован, к примеру, нанесением гравировки точками на металлические поверхности. Функция поддерживает последний стандарт ECC200 (устаревшие типы DataMatrix невозможно создать с помощью этой функции).
    • Maxi Code, MaxiCode -- (планируется к реализации)
  • <Ширина (INT)>,<Высота (INT)> - (возможен аргумент-переменная (ByRef)) Ширина и высота картинки результата, в зависимости от этих параметров, функция работает в одном из режимов:
    • <Ширина>,<Высота> являются переменными и <Ширина> инициализирована нулем. В этом случае, функция вернет в указанных переменных минимальную ширину и высоту картинки, требуемой для генерации штрихкода, при этом сама функция не возвратит картинку. Этот режим используется для определения высоты и ширины с тем, чтобы использовать эти данные перед генерацией.
    • Если аргумент <Ширина> меньше нуля (к примеру, -1), функция произведет генерацию картинки в необходимой пропорции, с учетом коэффициента увеличения (SCALE) и вернет результат, как картинку.
    • Если аргументы <Ширина> и <Высота> больше нуля, они задают ширину и соответственно высоту результирующей картинки, при этом функция постарается разместить символ в центральной части картинки. Если места на картинке с заданными размерами недостаточно, функция вызовет исключение.
  • <Кодируемое сообщение (STRING)> - Кодируемое сообщение должно представлять собой строку (ANSI или UTF-16) и может содержать цифры, буквы, знаки, международные символы и бинарную информацию, в зависимости от типа генерируемого символа.
  • <Установки (STRING)> - (необязательный аргумент) Строка представляет собой набор дополнительных параметров, используемых для генерации символа. Параметры записываются один за другим, разделенные запятыми. Каждый из параметром должен быть записан в виде <Имя параметра>:<Значение параметра> (к примеру, SCALE:3). Ниже дана таблица возможных параметров с описанием.
Параметр Описание
BC:<Цвет бумаги> Используется для задания цвета заднего фона, на котором генерируется символ. Цвет задается в шестнадцатеричной 24-битной нотации. По умолчанию BC:FFFFFF -- белый цвет.
LC:<Цвет модуля> Используется для задания цвета модулей. Цвет задается в шестнадцатеричной 24-битной нотации. По умолчанию LC:000000 -- черный цвет.
BR:<Ширина пустого окружения символа (бордюра)> Ширина задается в точках (не модулях). По умолчанию зависит от типа символа.
BRU:<Ширина верхнего отступа (бордюра)> Ширина задается в точках (не модулях). По умолчанию зависит от типа символа.
BRD:<Ширина нижнего отступа (бордюра)> Ширина задается в точках (не модулях). По умолчанию зависит от типа символа.
BRL:<Ширина левого отступа (бордюра)> Ширина задается в точках (не модулях). По умолчанию зависит от типа символа.
BRR:<Ширина правого отступа (бордюра)> Ширина задается в точках (не модулях). По умолчанию зависит от типа символа.
SCALE:<Коэффициент масштабирования> Безразмерный коэффициент на который будут умножены все размеры (ширина и высота модуля, размеры бордюров и пр.) при генерации символа. По умолчанию равен единице. К примеру, если этот коэффициент будет равен двум, генерируемая картинка будет в два раза больше.
QZ:<Размер зоны тишины> "Зона тишины" это дополнительный бордюр следующий по горизонтали перед штрихами PDF417 и после них. Стандарт PDF417 требует присутствия подобной зоны для корректного считывания. Зона задается в ширинах модуля (не в точках) и по умолчанию зависит от типа PDF417 (составляет 1 или 2 модуля).
BPP:<Битов на точку> Задает режим создаваемой картинки. Может использоваться 2 значения: 8 (индексируемый цвет), 32 (реальный цвет). 8 бит на точку используется по умолчанию, так как позволяет сократить потребность в памяти в 4 раза при создании картинки. При печати картинки разницы между 8-битным и 32-битным цветом не будет, однако, при сохранении картинки на диск или использовании для внешних источников, выбор формата определяется возможностями декодирования картинки внешним источником.
ERR:<Уровень коррекции ошибок> Задает уровень коррекции ошибок, чем больше этот уровень, тем более поврежденные символы будут корректно расшифрованы. Уровень зависит от типа символа, доступны следующие значения:
  • Aztec: 0..95 (процентов ошибок может быть игнорировано при чтении символа), по умолчанию 23. Для символов Aztec rune этот параметр будет игнорирован.
  • PDF417: -1,0..8 (уровень коррекции ошибок), по умолчанию -1: рекомендованный уровень подбирается исходя из объема данных.
  • QR: -1 (авто),0 (7%),1 (15%), 2(25%), 3 (30%) (уровень коррекции ошибок), по умолчанию -1: рекомендованный уровень подбирается исходя из объема данных.
STYPE:<Подтип символа> Задает подтип символа, зависит от типа символа. Доступны следующие значения:
  • Aztec: 0 (по умолчанию) -- автоматический выбор между 1 и 2 в зависимости от объема данных, 1 -- компактный символ, 2 -- полноформатный символ, 3 -- символ Aztec rune.
  • PDF417: 0 (по умолчанию) -- стандартный символ, 1 -- компактный символ, 2 -- микро символ (Micro PDF417).
  • QR: 0 (по умолчанию) -- стандартный символ, 1 -- микро символ (MicroQR).
CACCUR:<Алгоритм кодирования> Задает алгоритм кодирования данных. Для некоторых символов кодирование данных на основе рекурсии дает потенциально меньший по размеру символ, однако, может быть гораздо более медленным для большого объема данных, более быстрое кодирование может быть предпочтительно в таких случаях. Доступны следующие значения:
  • Aztec: 0 (по умолчанию) -- медленное, более аккуратное кодирование, 1 -- быстрое, менее аккуратное кодирование. Медленное кодирование может быть до 10 раз медленнее, чем быстрое, однако может уменьшить размер кодированной информации для размещении на символе до 10% в некоторых случаях.
SVER:<Номер версии символа> Задает внутренний номер версии символа. Обычно нет необходимости использовать этот параметр, так как функция автоматически подбирает номер версии в зависимости от объема данных. В редких случаях, когда символы должны выглядеть одинаковыми по размеру при кодировании разных данных, параметр может стать полезным. Если при указании версии данные не вмещаются в символ, будет вызвано исключение. Доступны следующие значения:
  • Aztec: 0 (по умолчанию) -- автоматический подбор версии, 1..32 -- задает версию символа для полноформатных символов, 1..3 -- версия для компактных символов.
  • Micro PDF417: 0 (по умолчанию) -- автоматический подбор версии, 1..34 -- задает версию символа (последовательно: 1x11, 1x14, 1x17, 1x20, 1x24, 1x28, 2x8, 2x11, 2x14, 2x17, 2x20, 2x23, 2x26, 3x6, 3x8, 3x10, 3x12, 3x15, 3x20, 3x26, 3x32, 3x38, 3x44, 4x4, 4x6, 4x8, 4x10, 4x12, 4x15, 4x20, 4x26, 4x32, 4x38, 4x44).
  • QR: 0 (по умолчанию) -- автоматический подбор версии, 1..40 -- задает версию символа.
  • Data Matrix: 0 (по умолчанию) -- автоматический подбор версии, при автоматическом поиске версии не будут использованы прямоугольные символы (версия больше 24), 1..30 -- задает версию символа (последовательно: 10x10, 12x12, 14x14, 16x16, 18x18, 20x20, 22x22, 24x24, 26x26, 32x32, 36x36, 40x40, 44x44, 48x48, 52x52, 64x64, 72x72, 80x80, 88x88, 96x96, 104x104, 120x120, 132x132, 144x144, 18x8 (версия 25), 32x8 (версия 26), 26x12 (версия 27), 36x12 (версия 28), 36x16 (версия 29), 48x16 (версия 30)).
READERINIT:<Флаг инициализации считывающего устройства> Внедряет в данные символа специальный флаг "Флаг инициализации считывающего устройства", использующийся считывателями для изменения их внутренних режимов. Работа флага зависит типа от устройства считывания. Поддерживается всеми символами, если не указано обратного. Для символов Aztec флаг доступен только для символов версии 1 (в компактном символе) и для версий 1..23 (в полноформатном символе)
LH:<Высота одного модуля в ширинах модуля> Используется в символах PDF417 для указания размера одного модуля по вертикали в размерах ширины одного модуля. Для обычных символов PDF417 по умолчанию это значение равно 3 или 4 в зависимости от уровня коррекции ошибок, для микро PDF417 символов, по умолчанию это значение равно 2.
LN:<Количество строк в символе> Задает количество строк в символах, оперирующих этим понятием. Доступны следующие значения:
  • PDF417: Если для кодирования данных достаточно меньшее количество строк, чем указано, остатки строк будут заполнены пустыми данными (filler), если указанного количества строк недостаточно для кодирования символа, будет вызвано исключение. По умолчанию 0 (автоматический подбор). В зависимости от подтипа символа, доступны:
    • Стандартный и компактный символы: 3..90
    • Микро PDF417: 4..44
CN:<Количество столбцов в символе> Задает количество столбцов в символах, оперирующих этим понятием. Доступны следующие значения:
  • PDF417: По умолчанию 0 (автоматический подбор). Нужно иметь в виду, что это число будет определять столбцы с данными, однако, в символе также присутствуют обязательные столбцы ориентации и границы. Поэтому для стандартных символов будет выведено на 2 столбца больше, чем указано, компактного символа -- на один столбец больше, для микро PDF417 будут присутствовать только дополнительные границы. В зависимости от подтипа символа, доступны:
    • Стандартный и компактный символы: 1..30.
    • Микро PDF417: 1..4
ECIMODE:<Режим ECI> Задает режим кодирования международных символов с кодами >255. При выключенном режиме, таких символы не могут быть закодированы (кроме QR, где есть особый режим Кандзи, позволяющий кодировать некоторые Японские иероглифы и кириллицу внутренним образом (без ECI). Важно также понимать, что только очень малая часть устройств считывания способна декодировать информацию с международными символами. Доступны следующие значения:
  • 0 (по умолчанию) -- режим ECI отключен, кодирование международных символов будет запрещено
  • 1 -- режим ECI будет использовать только таблицы символов ISO8859-?. Символы вне этих таблиц будут вызывать исключение.
  • 2 -- режим ECI будет использовать таблицу UCS-2 (ECI 25) (большинство символов Unicode вмещается в эту таблицу).
  • 3 -- режим ECI будет использовать таблицу UTF-8 (ECI 26) (все символы Unicode вмещаются в эту таблицу).
  • 4 -- (планируется к реализации) режим ECI будет использовать все доступные таблицы, кроме ECI 25 и ECI 26.
KANJI:<Режим Кандзи> Включает или выключает режим кандзи при формировании символа QR. По умолчанию, режим включен (KANJI:1). Режим позволяет кодировать многие Японские иероглифы и кириллицу без использования режимов ECI. Опция позволяет выключить режим, если ECI предпочтительнее при формировании символов QR.
MASKVER:<Форсирование версии маски> Параметр задает внутренний номер маски, которая будет использована для символа QR. Параметр может принимать значения: 0 (автоматический режим),1..8 (номер маски) для стандартного символа и 0 (автоматический режим),1..4 (номер маски) для символа микро символа. Параметр является отладочным, и его использование не рекомендовано.
SAPPEND:<Режим структурного соединения> Помечает текущий генерируемый символ, как один из цепочки символов, вместе составляющих единое сообщение (данные). Для создания такой цепочки, чаще всего необходимо найти контрольную сумму всего сообщения, после чего разделить его на требуемое количество частей и создать для каждой из частей свой символ. Чтение цепочек поддерживает очень малым количеством устройств считывания. В зависимости от типа символа, доступны следующие значения параметра:
  • Aztec: (планируется к реализации)
  • PDF417: (планируется к реализации)
  • QR: <Порядковый номер символа>.<Количество символов в цепочке>.<Контрольная сумма всего сообщения> (к примеру, "2.5.43"). Для вычисления контрольной суммы всего сообщения используется функция CountBarcodeCRC с параметром "QRSACRC". Максимальное количество символов в цепочке равно 16.
  • Data Matrix: <Порядковый номер символа>.<Количество символов в цепочке>.<Код цепочки символов> (к примеру, "2.5.77"). Максимальное количество символов в цепочке равно 16. Код цепочки символов является произвольным числом в диапазоне 0..64515, служит для отделения цепочек друг от друга, если пользователь случайно считает символ из другой цепочки.
RESTENC:<Запретить режимы кодирования> Используется для символов Data Matrix, в котором доступно 6 режимов кодирования информации (ASCII,ASCII-256,C40,Text,X12,EDIFACT). Если известно, что информация не будет удачно кодироваться в одном или нескольких режимах, можно ограничить количество используемых режимов для небольшого ускорения процесса создания символа. Параметр представляет битовую маску. Если параметр равен нулю (по умолчанию) все режимы кодирования будут доступны. Рекомендуется оставлять значение параметра равным нулю. Более подробную информацию по режимам ищите в документации по символам Data Matrix. Маска параметра:
  • Бит 0: Запретить использование режима кодирования C40.
  • Бит 1: Запретить использование режима кодирования Text.
  • Бит 2: Запретить использование режима кодирования X12.
  • Бит 3: Запретить использование режима кодирования EDIFACT.
  • Бит 4: Запретить использование режима кодирования ASCII-256.
FORCEENC:<Форсировать режим кодирования> Используется для символов Data Matrix. Позволяет принуждать использование определенного режима кодирования информации, что может привести к неэкономичному кодированию информации, однако, иногда требуется при чтении символа определенными устройствами. Если параметр равен нулю (по умолчанию) определенный режим не будет активизирован. Рекомендуется оставлять значение параметра равным нулю. При ненулевом значении параметра FORCEENC, параметр RESTENC не будет рассмотрен. Возможные значения параметра:
  • 0 (по умолчанию): Не принуждать использование определенного режима.
  • 1: Использовать только режим C40
  • 2: Использовать только режим Text
  • 3: Использовать только режим X12 (если символы данных не поддерживаются режимом, функция вызовет исключение)
  • 4: Использовать только режим EDIFACT (если символы данных не поддерживаются режимом, функция вызовет исключение)
  • 5: Использовать только режим ASCII-256
  • 6: Использовать только режим ASCII

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

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

Примеры

Сравнение PDF417, компактного PDF417 и микро PDF417

Картинка-результат работы примера
//Пример генерирует символы PDF 417, Compact PDF 417 и Micro PDF 417 для строки "PDF417 simple test",
//  располагая их друг над другом для сравнения. Количество строк и размеры модуля выбраны для всех символов
//  одинаковыми для удобства сравнения.
тСтр:="PDF417 simple test";
//Генерация символов
аК:=Generate2DBarcode("PDF417",-1,-1,тСтр,"SCALE:5,BPP:32,STYPE:0,LN:6,LH:2");
аК2:=Generate2DBarcode("PDF417",-1,-1,тСтр,"SCALE:5,BPP:32,STYPE:1,LN:6,LH:2");
аК3:=Generate2DBarcode("PDF417",-1,-1,тСтр,"SCALE:5,BPP:32,STYPE:2,LN:6,LH:2");
//Нахождения ширины текста для увеличения ширины картинки
Шир:=Picture.TextWidth("Standard PDF 417","Tahoma|14|B");
//Создание большой картинки и добавление на нее сгенерированных ранее символов и текста
aPic:=Picture.Create(Max(аК.Width,аК2.Width,аК3.Width)+Шир+20,аК.Height+аК2.Height+аК3.Height+40,toRGB(255,255,255),32);
aPic.DrawPicture(аК,0,0,аК.Width,аК.Height);
aPic.Text(аК.Width+10,20,"Standard PDF 417","Tahoma|14|B");
aPic.DrawPicture(аК2,0,аК.Height+20,аК2.Width,аК2.Height);
aPic.Text(аК2.Width+10,аК.Height+20+20,"Compact PDF 417","Tahoma|14|B");
aPic.DrawPicture(аК3,0,аК.Height+аК2.Height+40,аК3.Width,аК3.Height);
aPic.Text(аК3.Width+10,аК.Height+аК2.Height+40+20,"Micro PDF 417","Tahoma|14|B");
//Сохранение результата
aPic.Save("c:\file.png","png");

Генерация Aztec и создание сообщения в Aztec rune

Картинка-результат работы примера
//Пример генерирует символ Aztec для строки "Hello Aztec",
//  после чего создает серию символов Aztec rune, соответствующую указанному сообщению
//Важно понимать, что символы Aztec rune не связаны между собой и не будут читаться, как единое сообщение
тСтр:="Hello Aztec";
//Генерация символов
аК:=Generate2DBarcode("Aztec",-1,-1,тСтр,"SCALE:5,BPP:32,STYPE:0");
aList:=List.Create();
Шир:=0;
Выс:=0;
For i:=1 To Length(тСтр) Do
  аК2:=Generate2DBarcode("Aztec",-1,-1,Asc(Mid(тСтр,i,1)),"SCALE:5,BPP:32,STYPE:3");
  aList.Add(аК2);
  Шир:=Шир+аК2.Width+10;
  Выс:=аК2.Height;
EndDo;
Шир2:=Picture.TextWidth(тСтр,"Tahoma|14|B");
Выс2:=Picture.TextHeight(тСтр,"Tahoma|14|B");
//Создание большой картинки и добавление на нее сгенерированных ранее символов
aPic:=Picture.Create(Max(аК.Width+10+Шир2+10,Шир),аК.Height+Выс+20+Выс2+20,toRGB(255,255,255),32);
aPic.DrawPicture(аК,0,0,аК.Width,аК.Height);
aPic.Text(аК.Width+10,5,тСтр,"Tahoma|14|B");
Смещ:=0;
For i:=1 To aList.Size() Do
  аК2:=aList.Get(i);
  aPic.DrawPicture(аК2,Смещ,аК.Height+20,аК2.Width,аК2.Height);
  Буква:=Mid(тСтр,i,1);
  aPic.Text(Смещ+(аК2.Width-Picture.TextWidth(Буква,"Tahoma|14|B")) div 2,аК.Height+20+аК2.Height+10,Буква,"Tahoma|14|B");
  Смещ:=Смещ+аК2.Width+10;
EndDo;
//Сохранение результата
aPic.Save("c:\file.png","png");

Генерация символа QR с кириллицей в сообщении способом Kanji и с помощью режима ECI

Картинка-результат работы примера
//Пример генерирует два символа QR для строки "Проверка генерации кириллицы в символах QR, Кандзи против ECI",
//Несмотря на то, что символ с ECI имеет меньший размер (хотя зачастую размеры будут одинаковыми),
//  только малое количество устройств считывания поддерживает ECI.
тСтр:="Проверка генерации кириллицы в символах QR, Кандзи против ECI";
//Генерация символов
аК:=Generate2DBarcode("QR",-1,-1,тСтр,"SCALE:5,BPP:32,STYPE:0,ERR:0,BR:1");
аК2:=Generate2DBarcode("QR",-1,-1,тСтр,"SCALE:5,BPP:32,STYPE:0,KANJI:0,ECIMODE:1,ERR:0,BR:1");
//Нахождения ширины текста для увеличения ширины картинки
Шир:=Picture.TextWidth("QR с поддержкой Кандзи","Tahoma|14|B");
//Создание большой картинки и добавление на нее сгенерированных ранее символов
aPic:=Picture.Create(Max(аК.Width,аК2.Width)+Шир+20,аК.Height+аК2.Height+20,toRGB(255,255,255),32);
aPic.DrawPicture(аК,0,0,аК.Width,аК.Height);
aPic.Text(аК.Width+10,20,"QR с поддержкой Кандзи","Tahoma|14|B");
aPic.DrawPicture(аК2,0,аК.Height+20,аК2.Width,аК2.Height);
aPic.Text(аК2.Width+10,аК.Height+20+20,"QR с ECI/ISO-8859","Tahoma|14|B");
//Сохранение результата
aPic.Save("c:\file.png","png");

Пример генерации символа DataMatrix

Картинка-результат работы примера
//Пример генерирует два символа DataMatrix разной формы для строки "Generating Data Matrix: square vs. rectangular" 
//  с указанием версии символа при генерации
тСтр:="Generating Data Matrix: square vs. rectangular";
//Генерация символов
аК:=Generate2DBarcode("Data Matrix",-1,-1,тСтр,"SCALE:5,BPP:32,SVER:8");
аК2:=Generate2DBarcode("Data Matrix",-1,-1,тСтр,"SCALE:5,BPP:32,SVER:30");
//Создание большой картинки и добавление на нее сгенерированных ранее символов
aPic:=Picture.Create(Max(аК.Width,аК2.Width),аК.Height+аК2.Height+20,toRGB(255,255,255),32);
aPic.DrawPicture(аК,0,0,аК.Width,аК.Height);
aPic.DrawPicture(аК2,0,аК.Height+20,аК2.Width,аК2.Height);
//Сохранение результата
aPic.Save("c:\file.png","png");