Flying-Saucer是一个不错的库,可以从Java应用程序中生成PDF文档。 只需生成一堆XHTML,然后将其放入渲染器中,然后使用iText生成所需的文档即可。
但是,当涉及条形码时,Flying-Saucer无法访问iText的内置条形码功能(至少我没有找到任何有关它的文档)。
但是,由于采用开放源代码并经过精心设计,因此只需创建一个子类即可完成此任务:Flying-Saucer依赖于名为ReplacedElementFactory的工厂,该工厂可以用自定义对象替换元素。 这也用于嵌入图像,如ITextReplacedElementFactory类所示。 现在,我们可以简单地创建一个子类,用适当的条形码替换图像:
<img src ='0123456789'type ='code128'style ='height:1cm'/>
一个人只需要像这样重写createReplacedElement方法(整个代码可以在这里找到: BarcodeReplacedElementFactory.java(GitHub) ):
@Overridepublic 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);}
当然,对于<img />,“类型”不是有效的XHTML元素,但是如您在上面的代码中所见,您可以轻松地用data-type或任何其他属性替换它。 无论如何,飞碟似乎并不在乎这一点。
注意:上面的代码只能处理Code128-Barcodes,但是可以轻松扩展以处理EAN等(默认情况下,iText支持一堆条形码)。
为了使我们的工厂正常工作,我们需要将其传递给渲染器,这很简单:
ITextRenderer renderer = new ITextRenderer();renderer.getSharedContext().setReplacedElementFactory(new BarcodeReplacedElementFactory(renderer.getOutputDevice()));renderer.setDocumentFromString(inputAsString);renderer.layout();renderer.createPDF(outputAsStream);
参考:在Andy的软件工程专栏博客中,我们的JCG合作伙伴 Andreas Haufler 用Flying-Saucer生成了PDF中的条形码 。
翻译自: https://www.javacodegeeks.com/2012/12/generating-barcodes-in-pdfs-with-flying-saucer.html