gifts2017

QR-код

Опубликовал Андрей Данилюк (DanilaDru) в раздел Программирование - Практика программирования

Генерация qr кода с помощью api google

Для генерации использовано api от google (http://chart.apis.google.com/chart). Вот сайт, который работает с ним. После того, как вы вводите все параметры кода и нажимаете кнопку генерировать, получаем что-то вроде такой ссылки. По сути эта ссылка нам и нужна. Создав необходимый url можно скачать картинку, которая генерируется с помощью api. Почему не подключал компоненты - писалось под веб-клиент не был уверен, что на стороне сервера будет установлена компонента. 

И так в чем заключается подход:

  1. Генерируем текст, который надо прописать в qr-коде.
  2. Используя ссылку «http://chart.apis.google.com/chart?cht=qr&chs=230×230&chl=» +»Наш текст» скачиваем картинку.
  3. Размещаем картинку в нашем табличном документе.

Код реализации:

&НаСервере
Функция hex(Знач Значение)
Значение=Число(Значение);
Если
Значение<=0 Тогда
Результат="0";
Иначе
Значение=Цел(Значение);
Результат="";
Пока
Значение>0 Цикл
Результат=Сред("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",Значение%16 + 1,1)+Результат;
Значение=Цел(Значение/16) ;
КонецЦикла;
КонецЕсли;
Если
СтрДлина(Результат) < 2 Тогда

Результат = "0" + Результат;

КонецЕсли;
Возврат
"%" + Результат;
КонецФункции

&НаСервере
Функция EncodeURL(URL)
Рез = "";
Для
Сч = 1 По СтрДлина(URL) Цикл
ch = Сред(URL,Сч,1);
vch = КодСимвола(ch);

Если (
"A" <= ch ) И ( ch <= "Z") Тогда // "A".."Z"
Рез = Рез + ch;
ИначеЕсли (
"a" <= ch ) И ( ch <= "z") Тогда // "a".."z"
Рез = Рез + ch;
ИначеЕсли (
"0" <= ch ) И ( ch <= "9") Тогда // "0".."9"
Рез = Рез + ch;
ИначеЕсли (
ch = " ") ИЛИ ( ch = "+") Тогда // space
Рез = Рез + "+";
ИначеЕсли (
ch = "-" ) ИЛИ ( ch = "_") // unreserved
ИЛИ (ch = ".") ИЛИ (ch = "!")
ИЛИ (
ch = "~") ИЛИ (ch = "*")
ИЛИ (
ch = "") ИЛИ (ch = "(")
ИЛИ (
ch = ")") Тогда
Рез = Рез + ch;
ИначеЕсли (
vch <= 127) Тогда // other ASCII
Рез = Рез + hex(vch);
ИначеЕсли (
vch <= 2047) Тогда // non-ASCII <= 0x7FF
Рез = Рез + hex(192 + Цел(vch / 64));
Рез = Рез + hex(128 + (vch % 64));
Иначе
// 0x7FF < ch <= 0xFFFF
Рез = Рез + hex(224 + Цел(vch / 4096));
Рез = Рез + hex(128 + (Цел(vch / 64) % 64));
Рез = Рез + hex(128 + (vch % 64));
КонецЕсли;
КонецЦикла;

Возврат
Рез;
КонецФункции
// ()

&НаСервере
Функция СохранитьДвоичныйБуферВФайл(Буфер, ИмяФайла) Экспорт
Поток = Новый COMОбъект("ADODB.Stream");
Поток.Type = 1; //Бинарный
Поток.Mode = 3;
Поток.Open();
Поток.Write(Буфер);
Поток.SaveToFile(ИмяФайла);
Поток.Close();
КонецФункции

&НаСервере
Функция НапечататьКодСервер(ЗаказСсылка)
ТабДок = Новый ТабличныйДокумент;
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("png");
АдресНачало = "http://chart.apis.google.com/chart?cht=qr&chs=230x230&chl=";
АдресКонец = ЗаказСсылка.Номер + Символы.ПС + Заказссылка.Контрагент.Наименование;
АдресКонец = СтрЗаменить(АдресКонец, " ", "+");
АдресКонец = EncodeURL(АдресКонец);

Соединение = ПолучитьCOMОбъект("","Microsoft.XMLHTTP");
Соединение.open("GET", АдресНачало + АдресКонец,0,,);
Соединение.send(null);
СохранитьДвоичныйБуферВФайл(Соединение.responseBody, ИмяВременногоФайла);

//Печать
Макет = Документы.ЗаказПокупателя.ПолучитьМакет("МакетПечатиКода");
Область = Макет.ПолучитьОбласть("Код");
Область.Рисунки.КодРисунок.Картинка = Новый Картинка(ИмяВременногоФайла);
ТабДок.Вывести(Область);
Возврат
ТабДок;
КонецФункции

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Максим Зудин (kasper076) 10.01.11 17:03
Нашел вот тут точно такой же код, только вот опубликован он гораздо раньше.
2. Денис Яковлев (iceflash) 10.01.11 17:39
хм, на сайте данном в статье, этот материал размещен 29.12.2010 хотя на самом деле сейчас вот так не определишь точное авторство=) эти даты легко можно поменять ведь=) Так что это все на совести автора данной статьи=)
3. Андрей Данилюк (DanilaDru) 10.01.11 23:07
Спасибо за наводку на плагиат. Danila.org.ua мой ресурс и статьи на нем мои. Автору lavelin.ru уже было послано сообщение через обратную связь на сайте.

В статье на lavelin.ru есть указан мой ресурс, только почему-то не удосужились сделать полноценную ссылку с переходом на страницу от куда его у меня скопировали.
4. Андрей Данилюк (DanilaDru) 10.01.11 23:15
А. Прикол :) Вы в статье на lavelin.ru почитайте сам qr-код и увидите ссылка на какой ресурс там прописана. На всякий случай кидаю скриншот текущего состояния страницы на сайте lavelin.ru
Прикрепленные файлы:
5. Евгений - (zenechka) 11.01.11 02:47
to DanilaDru.
Позволю привести определение термина, который Вы так небрежно используете.

Плагиат (от лат. plagio — похищаю), вид нарушения прав автора или изобретателя. Состоит в незаконном использовании под своим именем чужого произведения (научного, литературного, музыкального) или изобретения, рационализаторского предложения (полностью или частично) без указания источника заимствования.

Если уж прикрепляете, скриншот, то будьте последовательны, не обрезайте ссылку на Ваш сайт, которая была указана под статьей.

Тот факт, что ссылка на Ваш сайт была опубликована не активной (в виде текста) не отбирает Ваше авторство и уж тем более не присваивает его мне. Вы обратились, я сделал ссылку активной.

Если Вы имеете что-то против копирования Ваших статей, сообщите, я удалю их со своего сайта.
6. Андрей Данилюк (DanilaDru) 11.01.11 08:40
Спасибо за исправление статей. Я был последовательным и ситуацию про ссылку на ресурс я описал в своем первом посте.

Спасибо за размещения меня в своих ссылках.
7. Герман (German) 11.01.11 13:15
Да просто можно отправить письмо и в ответ получить QR ;)
http://feedproxy.google.com/~r/tarpipe/~3/a-Gncva-2u0/&anno=2
8. Андрей Данилюк (DanilaDru) 11.01.11 19:05
German пишет:

Да просто можно отправить письмо и в ответ получить QR

http://feedproxy.google.com/~r/tarpip...u0/&anno=2


Мне надо было код сгенерировать "сейчас" на "сейчас" для печати. Ждать письмо с ответом не сильно устраивало.
9. Андрей Данилюк (DanilaDru) 28.03.11 10:50
Спасибо всем за плюсы. Во время печати под веб-клиентом столкнулся с проблемами разбрасывания картинок как угодно. По сути вопрос печати был решен с помощью использования продуктов сторонних лиц. Краткая презентация тут: http://danila.org.ua/?p=924
10. Елена (=melena=) 26.03.16 23:25
Спасибо за обработку! Все работает, но для текста кодирования длиной около 200 символов, если количество символов около 400, то код на сайте не формируется(( Если непосредственно на сайт зайти и вбить в текстовое поле, то все ОК, а из 1С не получается. Как можно решить проблему?
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа