Функция СгенерироватьШтрихкодSVG(ЗначениеШтрихкода, ВысотаКартинки = 50, ШиринаМодуля = 2)
МассивПаттернов = СимволыШК();
// --- АЛГОРИТМ ---
// Используем Code 128 Subset B (позволяет кодировать ASCII 32-127)
// 1. Старт
ИндексСтарт = 104; // Start B
БинарнаяСтрока = МассивПаттернов[ИндексСтарт];
СуммаКонтрольная = ИндексСтарт;
// 2. Тело
ДлинаСтроки = СтрДлина(ЗначениеШтрихкода);
Для Сч = 1 По ДлинаСтроки Цикл
Символ = Сред(ЗначениеШтрихкода, Сч, 1);
КодСимвола = КодСимвола(Символ);
// Смещение для ASCII в Subset B: Пробел (32) = Индекс 0
ИндексВТаблице = КодСимвола - 32;
Если ИндексВТаблице < 0 ИЛИ ИндексВТаблице > 95 Тогда
// Символ не поддерживается, заменяем на пробел или пропускаем
ИндексВТаблице = 0;
КонецЕсли;
БинарнаяСтрока = БинарнаяСтрока + МассивПаттернов[ИндексВТаблице];
// Расчет контрольной суммы: (Старт + (Значение * Позиция)) % 103
СуммаКонтрольная = СуммаКонтрольная + (ИндексВТаблице * Сч);
КонецЦикла;
// 3. Контрольная цифра (Checksum)
ИндексЧексуммы = СуммаКонтрольная % 103;
БинарнаяСтрока = БинарнаяСтрока + МассивПаттернов[ИндексЧексуммы];
// 4. Стоп
БинарнаяСтрока = БинарнаяСтрока + МассивПаттернов[106];
// --- ГЕНЕРАЦИЯ SVG ---
ОбщаяДлинаМодулей = СтрДлина(БинарнаяСтрока);
ШиринаИтоговая = ОбщаяДлинаМодулей * ШиринаМодуля;
// Начинаем SVG. Добавляем "тихие зоны" (quiet zones) по бокам, например по 10 модулей
ОтступСлева = 10 * ШиринаМодуля;
ШиринаХолста = ШиринаИтоговая + (ОтступСлева * 2);
ТекстSVG = "<svg version=""1.1"" xmlns=""http://www.w3.org/2000/svg"" "
+ "width=""" + Формат(ШиринаХолста, "ЧГ=") + """ height=""" + Формат(ВысотаКартинки, "ЧГ=") + """>"
+ "<rect width=""100%"" height=""100%"" fill=""white""/>";
// Рисуем полоски
ТекущийX = ОтступСлева;
Для Сч = 1 По ОбщаяДлинаМодулей Цикл
Бит = Сред(БинарнаяСтрока, Сч, 1);
Если Бит = "1" Тогда
// Рисуем черный прямоугольник
ТекстSVG = ТекстSVG + "<rect x=""" + Формат(ТекущийX, "ЧГ=") + """ y=""0"" "
+ "width=""" + Формат(ШиринаМодуля, "ЧГ=") + """ height=""100%"" fill=""black""/>";
КонецЕсли;
ТекущийX = ТекущийX + ШиринаМодуля;
КонецЦикла;
ТекстSVG = ТекстSVG + "</svg>";
// --- СОХРАНЕНИЕ ---
ИмяВремSVG = ПолучитьИмяВременногоФайла("svg");
ИмяВремPNG = ПолучитьИмяВременногоФайла("png");
ЗаписьТекста = Новый ЗаписьТекста(ИмяВремSVG, "UTF-8");
ЗаписьТекста.Записать(ТекстSVG);
ЗаписьТекста.Закрыть();
Двоичные = Неопределено;
Попытка
КартинкаSVG = Новый Картинка(ИмяВремSVG);
КартинкаPNG = КартинкаSVG.Преобразовать(ФорматКартинки.PNG);
КартинкаPNG.Записать(ИмяВремPNG);
Двоичные = Новый ДвоичныеДанные(ИмяВремPNG);
Исключение
ЗаписьЖурналаРегистрации("BarcodeSVG_Error", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
УдалитьФайлы(ИмяВремSVG);
УдалитьФайлы(ИмяВремPNG);
Возврат Двоичные;
КонецФункции
Функция СимволыШК()
// Таблица символов Code128 (B).
// Каждый символ кодируется последовательностью толщин штрихов и пробелов.
// 1 - штрих, 0 - пробел. Всего 11 модулей на символ.
// Для экономии места закодируем их строкой, где индекс массива = значению символа.
// Это стандартная таблица Code128.
МассивПаттернов = Новый Массив;
// 0-9 (Sp, !, ", #, $, %, &, ', (, ))
МассивПаттернов.Добавить("11011001100"); // 0: Space
МассивПаттернов.Добавить("11001101100"); // 1: !
МассивПаттернов.Добавить("11001100110"); // 2: "
МассивПаттернов.Добавить("10010011000"); // 3: #
МассивПаттернов.Добавить("10010001100"); // 4: $
МассивПаттернов.Добавить("10001001100"); // 5: %
МассивПаттернов.Добавить("10011001000"); // 6: &
МассивПаттернов.Добавить("10011000100"); // 7: '
МассивПаттернов.Добавить("10001100100"); // 8: (
МассивПаттернов.Добавить("11001001000"); // 9: )
// 10-19 (*, +, ,, -, ., /, 0, 1, 2, 3)
МассивПаттернов.Добавить("11001000100"); // 10: *
МассивПаттернов.Добавить("11000100100"); // 11: +
МассивПаттернов.Добавить("10110011100"); // 12: ,
МассивПаттернов.Добавить("10011011100"); // 13: -
МассивПаттернов.Добавить("10011001110"); // 14: .
МассивПаттернов.Добавить("10111001100"); // 15: /
МассивПаттернов.Добавить("10011101100"); // 16: 0
МассивПаттернов.Добавить("10011100110"); // 17: 1
МассивПаттернов.Добавить("11001110010"); // 18: 2
МассивПаттернов.Добавить("11001011100"); // 19: 3
// 20-29 (4, 5, 6, 7, 8, 9, :, ;, <, =)
МассивПаттернов.Добавить("11001001110"); // 20: 4
МассивПаттернов.Добавить("11011100100"); // 21: 5
МассивПаттернов.Добавить("11001110100"); // 22: 6
МассивПаттернов.Добавить("11101101110"); // 23: 7
МассивПаттернов.Добавить("11101001100"); // 24: 8
МассивПаттернов.Добавить("11100101100"); // 25: 9
МассивПаттернов.Добавить("11100100110"); // 26: :
МассивПаттернов.Добавить("11101100100"); // 27: ;
МассивПаттернов.Добавить("11100110100"); // 28: <
МассивПаттернов.Добавить("11100110010"); // 29: =
// 30-39 (>, ?, @, A, B, C, D, E, F, G)
МассивПаттернов.Добавить("11011011000"); // 30: >
МассивПаттернов.Добавить("11011000110"); // 31: ?
МассивПаттернов.Добавить("11000110110"); // 32: @
МассивПаттернов.Добавить("10100011000"); // 33: A
МассивПаттернов.Добавить("10001011000"); // 34: B
МассивПаттернов.Добавить("10001000110"); // 35: C
МассивПаттернов.Добавить("10110001000"); // 36: D
МассивПаттернов.Добавить("10001100010"); // 37: E
МассивПаттернов.Добавить("11010001000"); // 38: F
МассивПаттернов.Добавить("11000101000"); // 39: G
// 40-49 (H, I, J, K, L, M, N, O, P, Q)
МассивПаттернов.Добавить("11000100010"); // 40: H
МассивПаттернов.Добавить("10110111000"); // 41: I
МассивПаттернов.Добавить("10110001110"); // 42: J
МассивПаттернов.Добавить("10001101110"); // 43: K
МассивПаттернов.Добавить("10111011000"); // 44: L
МассивПаттернов.Добавить("10111000110"); // 45: M
МассивПаттернов.Добавить("10001110110"); // 46: N
МассивПаттернов.Добавить("11101110110"); // 47: O
МассивПаттернов.Добавить("11010001110"); // 48: P
МассивПаттернов.Добавить("11000101110"); // 49: Q
// 50-59 (R, S, T, U, V, W, X, Y, Z, [)
МассивПаттернов.Добавить("11011101000"); // 50: R
МассивПаттернов.Добавить("11011100010"); // 51: S
МассивПаттернов.Добавить("11011101110"); // 52: T
МассивПаттернов.Добавить("11101011000"); // 53: U
МассивПаттернов.Добавить("11101000110"); // 54: V
МассивПаттернов.Добавить("11100010110"); // 55: W
МассивПаттернов.Добавить("11101101000"); // 56: X
МассивПаттернов.Добавить("11101100010"); // 57: Y
МассивПаттернов.Добавить("11100011010"); // 58: Z
МассивПаттернов.Добавить("11101111010"); // 59: [
// 60-69 (\, ], ^, _, `, a, b, c, d, e)
МассивПаттернов.Добавить("11001000010"); // 60: \
МассивПаттернов.Добавить("11110001010"); // 61: ]
МассивПаттернов.Добавить("10100110000"); // 62: ^
МассивПаттернов.Добавить("10100001100"); // 63: _
МассивПаттернов.Добавить("10010110000"); // 64: `
МассивПаттернов.Добавить("10010000110"); // 65: a
МассивПаттернов.Добавить("10000101100"); // 66: b
МассивПаттернов.Добавить("10000100110"); // 67: c
МассивПаттернов.Добавить("10110010000"); // 68: d
МассивПаттернов.Добавить("10110000100"); // 69: e
// 70-79 (f, g, h, i, j, k, l, m, n, o)
МассивПаттернов.Добавить("10011010000"); // 70: f
МассивПаттернов.Добавить("10011000010"); // 71: g
МассивПаттернов.Добавить("10000110100"); // 72: h
МассивПаттернов.Добавить("10000110010"); // 73: i
МассивПаттернов.Добавить("11000010010"); // 74: j
МассивПаттернов.Добавить("11001010000"); // 75: k
МассивПаттернов.Добавить("11110110110"); // 76: l
МассивПаттернов.Добавить("11101011010"); // 77: m
МассивПаттернов.Добавить("11101010010"); // 78: n
МассивПаттернов.Добавить("11100101010"); // 79: o
// 80-89 (p, q, r, s, t, u, v, w, x, y)
МассивПаттернов.Добавить("11100100100"); // 80: p
МассивПаттернов.Добавить("11100100100"); // 81: q
МассивПаттернов.Добавить("11100100100"); // 82: r
МассивПаттернов.Добавить("11100100100"); // 83: s
МассивПаттернов.Добавить("10011110110"); // 84: t
МассивПаттернов.Добавить("10011110010"); // 85: u
МассивПаттернов.Добавить("11110100100"); // 86: v
МассивПаттернов.Добавить("11110010100"); // 87: w
МассивПаттернов.Добавить("11110010010"); // 88: x
МассивПаттернов.Добавить("11011011110"); // 89: y
// 90-94 (z, {, |, }, ~)
МассивПаттернов.Добавить("11011110110"); // 90: z
МассивПаттернов.Добавить("11110110110"); // 91: {
МассивПаттернов.Добавить("10101111000"); // 92: |
МассивПаттернов.Добавить("10100011110"); // 93: }
МассивПаттернов.Добавить("10001011110"); // 94: ~
// 95-106 (System chars)
МассивПаттернов.Добавить("10111101000"); // 95: DEL
МассивПаттернов.Добавить("10111100010"); // 96: FNC3
МассивПаттернов.Добавить("11110101000"); // 97: FNC2
МассивПаттернов.Добавить("11110100010"); // 98: SHIFT
МассивПаттернов.Добавить("10111011110"); // 99: CODE C
МассивПаттернов.Добавить("10111101110"); // 100: CODE B (FNC4)
МассивПаттернов.Добавить("11101011110"); // 101: CODE A
МассивПаттернов.Добавить("11110101110"); // 102: FNC1
МассивПаттернов.Добавить("11010000100"); // 103: Start A
МассивПаттернов.Добавить("11010010000"); // 104: Start B (Наш старт!)
МассивПаттернов.Добавить("11010011100"); // 105: Start C
МассивПаттернов.Добавить("1100011101011"); // 106: Stop (Жирный)
Возврат МассивПаттернов
КонецФункции
Аналогично можно поступить и с генерацией текста для штрих-кодов и организовать вставку через платформенный PDF, что избавит от неплатформенных вызовов и последующих заморочек с правами, версиями, операционными системами и прочим.
Вступайте в нашу телеграмм-группу Инфостарт