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) ):
@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);
}
当然,对于<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