Flying-Saucer — хорошая библиотека для создания PDF-документов из Java-приложений. Просто сгенерируйте пакет XHTML, бросьте его в средство визуализации и позвольте ему создать нужный документ, используя iText.
Однако, когда дело доходит до штрих-кодов, Flying-Saucer не может получить доступ к встроенным функциям штрих-кодов iText (по крайней мере, я не нашел никакой документации для этого).
Тем не менее, будучи OpenSource и хорошо спроектированным, для выполнения задачи нужно создать только один подкласс: Flying-Saucer использует фабрику с именем ReplacedElementFactory, которая может заменять элементы пользовательскими объектами. Это также используется для встраивания изображений, как показывает класс ITextReplacedElementFactory. Теперь мы можем просто создать подкласс, который заменяет изображения соответствующим штрих-кодом:
<img src = ‘0123456789 ′ type =’ code128 ′ style = ‘height: 1cm’ />
Нужно просто переопределить метод createReplacedElement следующим образом (весь код можно найти здесь: BarcodeReplacedElementFactory.java (GitHub) ):
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
@Override public ReplacedElement createReplacedElement( LayoutContext c, BlockBox box, UserAgentCallback uac, int cssWidth, int cssHeight) { Element e = box.getElement(); if (e == null ) { return null ; } String nodeName = e.getNodeName(); if (nodeName.equals( "img" )) { if ( "code128" .equals(e.getAttribute( "type" ))) { try { Barcode128 code = new Barcode128(); code.setCode(e.getAttribute( "src" )); FSImage fsImage = new ITextFSImage( Image.getInstance( code.createAwtImage( Color.BLACK, Color.WHITE ), Color.WHITE )); if (cssWidth != - 1 || cssHeight != - 1 ) { fsImage.scale(cssWidth, cssHeight); } return new ITextImageElement(fsImage); } catch (Throwable e1) { return null ; } } } return super .createReplacedElement( c, box, uac, cssWidth, cssHeight); } |
Конечно, ‘type’ не является допустимым XHTML-элементом для <img />, но, как вы можете видеть в приведенном выше коде, вы можете легко заменить его типом данных или любым другим атрибутом. Летающая тарелка, кажется, все равно не заботится об этом.
Примечание. Приведенный выше код может обрабатывать только штрих-коды Code128, но его можно легко расширить для обработки EAN и т. П. (По умолчанию iText поддерживает целый набор штрих-кодов).
Чтобы заставить нашу фабрику работать, мы должны передать ее рендереру — что чертовски легко:
1
2
3
4
5
6
7
8
|
ITextRenderer renderer = new ITextRenderer(); renderer.getSharedContext().setReplacedElementFactory( new BarcodeReplacedElementFactory( renderer.getOutputDevice() )); renderer.setDocumentFromString(inputAsString); renderer.layout(); renderer.createPDF(outputAsStream); |
Ссылка: Создание штрих-кодов в PDF с помощью Flying-Saucer от нашего партнера JCG Андреаса Хауфлера в блоге Andy’s Software Engineering Corner .