Для одного проекта мне пришлось разобраться со штрихкодами (или баркодами — кому как нравится). В компании уже был реализован механизм печати документов PDF посредством FOP, мне нужно было добавить в определённый документ эти коды.
Существовало техническое ограничение, код должен быть читаем для ручного лазерного сканера Honeywell Voyager 1200g, что изначально исключило использование двумерных кодов как QR Code и DataMatrix. Кодируемые данные были алфавитно-цифрового типа. Выбор был сделан в пользу Code128, штрихкод варьированной длины, позволяющий кодировать цифровые и буквенные символы (подробней на Википедии).
При поисках генератора штрихкодов я достаточно быстро остановился на Barcode4J. Всё что нужно для использования этой бесплатной библиотеки, это указать её в Classpath и вставить XML-код в нужные места (или же вызывать программно, но в моём случае мне не потребовалось этого делать).
<fo:instream-foreign-object> <barcode:barcode xmlns:barcode="http://barcode4j.krysalis.org/ns" message="{$message}" orientation="0"> <barcode:code128> <barcode:height>8mm</barcode:height> </barcode:code128> </barcode:barcode> </fo:instream-foreign-object>
В примере создаётся штрихкод в формате Code128 высотой 8 миллиметров. Кодируется содержание XSL-переменной $message. Существует параметр modul-width, через который можно задать ширину модуля, если при печати линии сливаются так, что сканер не может различить закодированое сообщение. Для более подробнйо информации смотрите оффициальный сайт Barcode4J.

Имя домена cpa-master.com, закодированное в Code 128