ПоШКодим? Или как я постигал штрих-код.

Asvad

Топикстартер
10 лет на форуме
Сообщения
104
Реакции
21
Мира вам.
Намедни позвонил родственник и говорит:
- Нужно на визитки напечатать штрих-коды.
- Зайди на любой онлайн-генератор, вставь полученную картинку на визитку и печатай.
- Нужен уникальный код для каждой визитки.
- Создай лист визиток через персонализацию или DataMerge.
- Нужно 100 000 кодов. И в EAN-13.
Тут даже мой кот присвистнул. 100 тыщ кодов – 100 тыщ картинок. Комп на неделю в спячку уйдет.
- Ладно, - говорю, - что-нибудь придумаю.
Я раньше скачивал всяко разные программы-генераторы, а они все практически генерят картинку. Картинка меня не устраивает. Есть шрифты с штрихами, а следовательно на основе шрифта и генерить код символами. Такой фокус я уже проворачивал с одним клиентом. В экселе создал колонку с кодом с увеличением +1. В Indesign через DataMerge раскидал коды на лист с наклейками, применил шрифт Barcode и в печать. Сканер считывал коды и клиент ушел радостный.
Захотел применить такой же фокус и в этот раз. Но, уже с EAN13. Шрифт использовал Libre Barcode EAN13. Не читает сканер. Вспомнил про стартовые и стоповые символы – читает всяку ересь, но не код. Пришлось читать литературу про код.
Итак. Сам код 13-значный. Вернее, последовательность чисел кода (например, с инкриментом +1) состоит из 12 цифр. 13-я – контрольная сумма. Стартует полоса-пробел-полоса (биты 101) равной ширины и они же задают ширину бита. Стоповый набор полос тот же. Я вручную глифами пытался собрать код. Не получилось считать сканером. Оказывается штрих-код начинается со ВТОРОЙ цифры. Отбрасываем первую цифру и код имеет вид:
[6 цифр] [разделитель] [6 цифр].
Причем, в правой части пишем и контрольную сумму. Вычисляется как число необходимое до доведения кратному 10 суммы цифр на нечетных позициях числа и утроенной суммы нечетных позиций. Например, сумма получилась 126, то контрольная цифра - 4.
Разделитель - те же полоски, что и на старте.
Оказывается каждая цифра штрих-кода кодируется тремя разными (и хитрыми) способами: set A, set B, set C. Правые шесть цифр всегда кодируется set C - в соответствие цифрам 0-9 ставятся символы a-j из шрифта штрих-кода. Левые 6 цифр кодируется перебором 10 вариантов из set A и set B. Порядок перебора зависит от первой цифры числа кода. Штрихи set A соответствуют символам A-J, set B - символам K-T шрифта штрих-кода. Ряд чисел 0-9 нам даст стартовый штрих с соответствующей цифрой у подножия.
По сути мы (человеки) видим все 13 цифр штрих-кода, а сканер 12 (без первой цифры). Первую он вычисляет из набора вариантов перебора левых 6 цифр. А затем еще и сверяется с контрольным.
Итак, мне оставалось найти соответствие символа (ASCII) каждой цифре числа штрих-кода. Решения в экселе в большинстве своем были на VBA. Мне это не нравилось. И читая комментарии на одном из форумов нашел одно интересное решение встроенными функциями экселя.
Вставил в лист с кодами - ЗАРАБОТАЛО. Сканер читает и без ошибок!
Файл экселя с решением прилагаю. Если в третьем столбце поменяете шрифт на читаемый, то увидите набор символов ASCII для формирования рисунка штрих-кода.
Таблицы битовых кодов set-ов и варианты их перебора изложены в интернете.
Также эта формула применима и к шрифту Code EAN13, но сканер иногда на нем ошибался.
Может мои изыскания помогут кому-нибудь в массовой генерации кодов.
 

Вложения

  • ean13-excel.zip
    32.6 КБ · Просм.: 27
Последнее редактирование:

Drawer

Участник
Сообщения
2 098
Реакции
930
Даааавно тут лежит :)
 

garvey

Участник
Сообщения
165
Реакции
48
Пора вводить раздел "дизайнеоские байки". '))'
А и вправду, где таким делиться? Жене за ужином на расскажешь...
 

zollinger

Участник
Сообщения
629
Реакции
195

Drawer

Участник
Сообщения
2 098
Реакции
930
Будет кому-то интересно такое же скриптом в ID? :) Ставьте +
 

garvey

Участник
Сообщения
165
Реакции
48
Смотря какая жена, чем занимается. Может, еще и совет даст
Да, было такое!
Без имени-1.jpg
 

zollinger

Участник
Сообщения
629
Реакции
195
Поддержу
1722521971149.png
+
 

Asvad

Топикстартер
10 лет на форуме
Сообщения
104
Реакции
21
однозначно +
но, чтобы работало и на CS6
 
Последнее редактирование:

azz

alexey
15 лет на форуме
Сообщения
717
Реакции
361
есть что-то похожее тут
 

Drawer

Участник
Сообщения
2 098
Реакции
930
Последнее редактирование:

Asvad

Топикстартер
10 лет на форуме
Сообщения
104
Реакции
21
из описания:
и помечает фрейм посредством Script label присваивая ему значение EAN13

Не пометил. У меня CS6
Пометил вручную. 1000 страниц (по одной записи) обработал за пару секунд. Шустро однако.
 

Drawer

Участник
Сообщения
2 098
Реакции
930
Замените полностью функцию main
Код:
function main() {
    if (s == "0") {
        var  n = myItems.length
        while ( n-- ) {
            nItem = myItems[n];
            (nItem instanceof TextFrame) && nItem.label == "EAN13" && ean13_Frames.push ( nItem );
        }
    } else {
        while ( s-- ) {
            sItem = doc.selection[s];
            (sItem instanceof TextFrame) && ean13_Frames.push ( sItem );
        }
    };

    for (var n = 0; n < ean13_Frames.length; n++) {
        var content = ean13_Frames[n].contents.replace(" ", "");
        if (isNumeric(content)){
            if (content.length == 12) {
                content = addCheckDigit(content);
                ean13_Code[n] = ean13(content);
                ean13_Frames[n].label = "EAN13"
            } else if (ean13_Frames[n].contents.length == 13) {
                ean13_Code[n] = ean13(content);
                ean13_Frames[n].label = "EAN13"
            } else {
                ean13_Code[n] = "";
                errNumLenght.push(ean13_Frames[n]);
            }   
        } else {
            ean13_Code[n] = "";
            errNoNum.push(ean13_Frames[n]);
        }
    };
    
    var  f = ean13_Frames.length;
    while ( f-- ) {
        (ean13_Code[f] != "") && (ean13_Frames[f].contents = ean13_Code[f]) && ean13_Frames[f].parentStory.appliedFont ='Code EAN13';
    };
};
У меня тоже :)
 

Asvad

Топикстартер
10 лет на форуме
Сообщения
104
Реакции
21
Кхм...
Контрольная цифра врет.
290006708485
У Вас - 2900067084856
Должно быть - 3

upd. Кажется проблема, что вы напутали с четными и нечетными при присваивании
 
Последнее редактирование:

visitor2021

Участник
Сообщения
4
Реакции
14
Шрифт Libre Barcode EAN13
Странно, никто не прокомментировал, что не требуется никаких перекодирований и расчетов контрольной цифры. Разработчики шрифта прямо-таки болдом восклицают:

Encoding by hand is not an option

т.к. они все уже сделали для вас. Harfbuzz используется в новом Индизайне по умолчанию, да и в не совсем старых (мне взгромоздили когда-то 17-ю версию) включается скриптом
Код:
app.textPreferences.shapeIndicAndLatinWithHarbuzz = true;
(с последующим перезапуском ИД). После этого 12 цифр + знак вопроса для авто-расчета контрольной, т.е. 13 символов, волшебным образом превращаются в код EAN-13, если применяется указанный шрифт. Дальше вы уж сами смотрите (я далек от верстки), видимо можно было бы использовать греп-стиль \d{12}\?.

(А коту передайте, что PDF с 4000 страниц и 100 тыс. случайных уникальных кодов картинкой (т.е. палочками), как бы визитки 5х5 на листе А4, у меня сгенерился за 25 сек. Шрифтом -- всего в 2 раза быстрее, за 12 с. Но это программно, без индизайна. Комп старый, i5 от 2017 года.)