Здравствуйте, товарищи! Недавно в интернете я наткнулся на одну отличную PostScript-библиотеку, благодаря которой можно легко сгенерировать множество различных баркодов под свои нужды, более того — она позволяет управлять множеством параметров в процессе генерации, такими как шрифты, положение служебных знаков, интервалы, цвета и много другое. И имя ей — BWIPP.
BWIPP — библиотека написанная на чистом PostScript, что понятно из полного названия — «Barcode Writer in Pure PostScript». Автор этого монстра — Терри Бартон, возможно кто-то знаком c одноименным сервисом онлайн-генерации баркодов. Также у BWIPP, есть страничка на Google code, где ее можно скачать и частично ознакомиться с возможностями.
После загрузки библиотеки мы можем ознакомиться с ее содержимым, открыв файл любым текстовым редактором. По сути, библиотека состоит из двух основных блоков:
- Блок механизмов рендеринга баркодов, с описанием констант и прочих параметров;
- Блок описания самих баркодов.
В процессе генерации баркода, мы можем передавать необходимые и дополнительные параметры, которые зависят от типа баркода и механизма его рендеринга, если необходимые параметры не передать, то на стадии рендеринга все сломается или результат будет неожиданным (например, баркод без текста). Основная проблема заключается в понимании того, какие параметры необходимые и где найти дополнительные? Для этого мы обратимся к комментариям внутри библиотеки, которые начинаются с символа «%», все блоки обрамлены комментариями типа BEGIN (% —BEGIN RENDERER renlinear—) и END (% —END RENDERER renlinear—), а блоки геренации баркодов имеют еще и дополнительное описание, например, ISSN:
% --BEGIN ENCODER issn-- (Комментарий, говорящий о начале блока кода для ISSN) % --REQUIRES preamble raiseerror renlinear ean2 ean5 ean13-- (А тут, нам дают понять какие функции будут вызваны для генерации) % --DESC: ISSN (Описание) % --EXAM: 0317-8129 00 17 (Пример входных данных) % --EXOP: includetext guardwhitespace (То что нужно, те самые необходимые параметры) % --RNDR: renlinear (Ну и механизм для рендеринга, он нам тоже пригодится, дабы определить всевозможные дополнительные параметры) [...много кода...] (Вначале присутствуют параметры начинающиеся со слеша, это тоже аргументы, которые можно передавать, например, issntextsize - размер шрифта вверху баркода) % --END ENCODER issn-- (Комментарий, говорящий о завершении блока кода для ISSN)
С необходимыми параметрами разобрались, теперь найдем дополнительные. После того, как мы определили механизм рендеринга (в нашем случае — renlinear), найдем строку с комментарием «% —BEGIN RENDERER renlinear—» — блок механизма, все что после комментариев «% Default options» (константы) и «% Apply the renderer options and the user options» (переопределение констант на пользовательские значения) — дополнительные опции, их довольно много, но они не всегда нужны, их названия говорят сами за себя, здесь и настройки шрифта и цвета, рамок и много другого.
Теперь можно попробовать вручную сгенерировать баркод. Сперва сделаем копию библиотеки и в самом низу, после комментария «% —END TEMPLATE—«, допишем следующее:
%!PS-Adobe-3.0 %%BoundingBox: 0 0 595.28 841.89 % A4 % %%Creator: NoName %%EndComments 50 50 moveto (1234-5678 01 12345) (includetext guardwhitespace issntextsize=9 textsize=9 height=0.6 guardwidth=5 guardheight=6 guardrightpos=6 guardrightypos=36.5) /issn /uk.co.terryburton.bwipp findresource exec %%EndPage %%Trailer showpage %%EOF
Первые 4 строчки — описание страницы, такие как размер, имя автора и прочие, в принципе, можно их опустить. Интерес представляют следующие 2 строки (это и есть вызов функции, генерирующей наш баркод из шаблона), опишу их подробнее:
50 50 moveto — положение X и Y левого нижнего угла баркода.
(1234-5678 01 12345) — входные данные.
(includetext guardwhitespace issntextsize=9 textsize=9 height=0.6 guardwidth=5 guardheight=6 guardrightpos=6 guardrightypos=36.5) — необходимые ( includetext и guardwhitespace) и дополнительные (все остальные, оставил их для примера) параметры:
issntextsize — рамер текста сверху баркода (взят из блока кода, описывающего issn),
textsize — размер текста кода, height-высота баркода (от 0 до 1),
guard… — параметры служебного знака в ISSN (символ «>» )
/issn — имя вызываемой функции
/uk.co.terryburton.bwipp findresource exec — не совсем понимаю значение всех аргументов, но по сути это запуск (:
Последние 4 строки — завершающие строки для PostScript.
Сохраняем файл после наших изменений и все готово. Не очень хорошо «тащить» всю библиотеку за каждым баркодом, но это просто и удобно. Также я бы не советовал ее урезать, в противном случае — делать это со знанием дела, почему? Например, для генерации ISSN-кода, BWIPP использует функции генерации разных кодов (ean2, ean5, ean13) в зависимости от входных данных, что не совсем очевидно, и, если какой-то функции не будет хватать из-за того, что мы ее упразднили, то ничего не выйдет.
Надеюсь, эта информации была для вас полезна.