用什么来生成包含动态生成的条形码(Java)的pdf文档?

时间:2011-07-08 16:49:24

标签: java pdf pdf-generation barcode

我的要求要求生成包含任意文本和条形码的pdf文档。我有相关的question来解决pdf生成部分,但在这里我想知道如何在Java中将条形码合并到pdf中。

到目前为止,我已经找到了关于barcode4j如何使用Apache FOP做出明确解释:Instructions for the Apache FOP extension

但看起来XSL-FO不是我的要求的主要选项,因为我更喜欢使用pdf表格(使用iText或PDFBox或类似)。同样,这还不是最终的。

您是否在pdf中使用图像或字体作为条形码?除了pdf API之外还应该有什么依赖(字体,库)?

4 个答案:

答案 0 :(得分:5)

我成功地使用PDFBox和Barbecue将条形码添加到PDF。烧烤提供输出界面自己绘制条形码。我以这样的方式实现了这个接口,即drawBar()转换为对PDPageContentStream.fillRect()的调用。

向PDF添加条形码现在归结为:

Barcode barcode = BarcodeFactory.createCode128(text);
barcode.output(new PDFBoxOutput(pageContentStream, startX, startY, height));

PDFBoxOutput类如下所示:

import java.awt.Color;
import java.io.IOException;

import net.sourceforge.barbecue.output.LabelLayout;
import net.sourceforge.barbecue.output.Output;
import net.sourceforge.barbecue.output.OutputException;

import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;

public class PDFBoxOutput implements Output {

    /** The widths and heights from Barbecue are multipplied with this scalar to get the widths and heights for PDFBox. */
    public final static float SCALAR = 0.5f;

    private final PDPageContentStream stream;
    private final float startX;
    private final float startY;
    private final float height;
    private boolean toggleDrawingColor;

    PDFBoxOutput(PDPageContentStream stream, float startX, float startY, float height) {
        this.stream = stream;
        this.startX = startX;
        this.startY = startY;
        this.height = height;
    }

    @Override
    public void beginDraw() throws OutputException {}

    @Override
    public int drawBar(int x, int y, int width, int height, boolean paintWithForegroundColor) throws OutputException {
        if (paintWithForegroundColor == !toggleDrawingColor) {
            try {
                stream.setLineWidth(0.0f);
                stream.setStrokingColor(Color.BLACK);
                stream.fillRect(startX + SCALAR * x, startY - SCALAR * y, SCALAR * width, this.height);
                stream.stroke();
            } catch (IOException e) {
                throw new OutputException(e);
            }
        }
        return width;
    }

    @Override
    public int drawText(String text, LabelLayout layout) throws OutputException {
        return 0;
    }

    @Override
    public void endDraw(int width, int height) throws OutputException {}

    @Override
    public void paintBackground(int x, int y, int width, int height) {}

    @Override
    public void toggleDrawingColor() {
        toggleDrawingColor = !toggleDrawingColor;
    }

}

答案 1 :(得分:2)

为了在pdf中生成条形码,我强烈建议您使用iText。如果你使用maven,你可以添加这些依赖项,你可以开始:

    <dependency>
        <groupId>com.lowagie</groupId>
        <artifactId>itext</artifactId>
        <version>2.0.7</version>
    </dependency>
    <dependency>
        <groupId>bouncycastle</groupId>
        <artifactId>bcmail-jdk14</artifactId>
        <version>136</version>
    </dependency>
    <dependency>
        <groupId>bouncycastle</groupId>
        <artifactId>bcprov-jdk14</artifactId>
        <version>136</version>
    </dependency>

要生成条形码,只需要几行代码:

    Barcode128 code128 = new Barcode128();
    code128.setCodeType(Barcode128.CODE128);
    code128.setCode(new Long(1234559690234234);
    Chunk chunk = new Chunk(code128.createImageWithBarcode(cb, null, null),
            200, -30);
    Paragraph p = new Paragraph(chunk);

将段落添加到文档中,瞧,你去了。可以在这里找到一个很好的教程:

IText Example

答案 2 :(得分:1)

我会使用条形码图像生成器,然后将其嵌入到我转换为PDF的HTML文档中。

查看this library以将XHTML渲染为PDF。使用barcode4j将条形码渲染为图像,就像您最初计划的那样。

答案 3 :(得分:1)

如果您准备放宽使用非Java工具的PDF生成要求,您可能会发现以下内容:

  1. 使用带有条形码占位符的HTML / CSS / JS来布局页面模板。
  2. 将Barcode4J用于output SVG,然后将其放入模板中。
  3. 使用wkhtmltopdf命令行工具渲染页面。 wkhtmltopdf在引擎盖下使用WebKit,因此它可以使用HTML / CSS很好地控制PDF布局。