У коллеги возникла необходимость - печатать QR-код с кириллицей в Win1251. Он пытался решить данную задачу использованием штатной ВК из БСП и какими-то манипуляциями с передаваемой строкой. Так ничего и не получилось - кириллица кодируется в Юникоде, прочитываются управляющие символы. Поэтому решили написать свою ВК.
Задача решена с помошью публикации ИС (все про тот же v8napi) и freeware-компоненты формирования картинки QR-кода для Delphi/Lazarus.
Интерфейс компоненты
Свойства
- Кодировка - целое число. Принимает значения:
- ENCODING_AUTO = 0;
- ENCODING_NUMERIC = 1;
- ENCODING_ALPHANUMERIC = 2;
- ENCODING_8BIT = 3;
- ENCODING_UTF8_NOBOM = 4;
- ENCODING_UTF8_BOM = 5;
- ENCODING_URL = 6;
- ENCODING_WIN1251 = 7 (предустанавлено сразу при создании ВК)
Методы
- ПолучитьКартинку(Текст, УровеньКоррекции, Масштаб). Параметры:
- Текст (Строка) - штрихкодируемый текст
- Уровень коррекции (Число) - целое от 0 до 3. Задает уровень коррекции ошибок штрихкодируемой информации. Чем больше уровень, тем больше избыточности данных в ШК из-за включения служебной информации.
- Масштаб (Число) - целочисленный множитель масштабирования при отрисовке компоненты.
Подключение
К примеру, так:
Функция ПолучитьВКQR()
СисИнфо = Новый СистемнаяИнформация;
Если СисИнфо.ТипПлатформы=ТипПлатформы.Windows_x86 Тогда
Макет = ПолучитьМакет("МакетQR");
Иначе
ВызватьИсключение("Неподдерживаемая платформа для ВК: " + СисИнфо.ТипПлатформы);
КонецЕсли;
Адрес = ПоместитьВоВременноеХранилище(Макет);
Подключено = ПодключитьВнешнююКомпоненту(Адрес, "КартинкаQRКода", ТипВнешнейКомпоненты.Native);
Если Не Подключено Тогда
ВызватьИсключение("Почему-то не подключили ВК");
КонецЕсли;
Возврат Новый("AddIn.КартинкаQRКода.QRImager");
КонецФункции
Использование
К примеру, так:
Процедура СформироватьТабДок() Экспорт
ВК = ПолучитьВКQR();
ТабДок.Очистить();
Макет = ПолучитьМакет("МакетШК");
Рисунок = Макет.Области.РисунокШК;
УстановитьКартинкуДляРисункаQR(ВК, Рисунок, Истина);
ТабДок.Вывести(Макет);
КонецПроцедуры
Процедура УстановитьКартинкуДляРисункаQR( пВнешКомпонента, пРисунок, пВызыватьИсключениеПриОшибке )
Если пВнешКомпонента <> Неопределено Тогда
Попытка
пВнешКомпонента.Кодировка = Кодировка;
пРисунок.Картинка = ПолучитьКартинкуВнутрQR(пВнешКомпонента, СтрокаДанных, УровеньКоррекции, Масштаб);
Исключение
Если пВызыватьИсключениеПриОшибке=Истина Тогда
ВызватьИсключение;
КонецЕсли;
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Функция ПолучитьКартинкуВнутрQR(пВнешКомпонента, Текст, УровеньКоррекции = 1, Масштаб = 1 )
Возврат Новый Картинка( пВнешКомпонента.ПолучитьКартинку(Текст, УровеньКоррекции, Масштаб));
КонецФункции
Целевые ОС, итоги
На текущий момент компонента скомпиллирована с помощью Lazarus 1.6.4 под платформу Win32. Сходу разобраться и скомпиллировать под Win64 не получилось. Да и это пока нам не требуется.
Поэтому остановились на достигнутом.
UPD 12.02.2019
ВК скомпилирована под Win64 и проверена на платформе 8.3.14.1565. По результатам добавил еще одну внешку в файлы публикации.
UPD 01.07.2019
Добавлена возможность формировать картинку в формате PNG.
Для этого добавил еще одно свойство:
ФорматКартинки (ImageFormat). Строка. Принимает значения "PNG" или "BMP". По умолчанию используется BMP.
По результатам добавил еще одну внешку в файлы публикации. Протестировал на 8.3.10, 32-бит.