使用Flying-Saucer生成PDF中的条形码
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
總結
以上是生活随笔為你收集整理的使用Flying-Saucer生成PDF中的条形码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 封闭式理财忘记利率怎么算利息?
- 下一篇: 什么是活期型理财产品?