Что использовать для создания PDF-документов, которые будут включать динамически генерируемые штрих-коды (Java)? - PullRequest
3 голосов
/ 08 июля 2011

Мои требования требуют создания PDF-документов, содержащих как произвольный текст, так и штрих-коды.Я связал вопрос , который касается части генерации PDF, но здесь я хотел бы узнать о том, как включить штрих-код в pdf в Java.

До сих пор я нашел четкое объяснениекак barcode4j делает это с Apache FOP: Инструкции для расширения Apache FOP

Но похоже, что XSL-FO не является основным вариантом для моих требований, так как я предпочитаю использовать формы PDF (используяiText или PDFBox или аналогичный).Опять же, это еще не все.

Используете ли вы изображения или шрифты для штрих-кода в формате PDF?Какие зависимости, кроме pdf API, следует ожидать (шрифты, библиотеки)?

Ответы [ 4 ]

5 голосов
/ 20 сентября 2013

Мне удалось добавить штрих-коды в PDF-файлы, используя PDFBox и Barbecue.Барбекю предлагает интерфейс вывода для рисования штрих-кодов самостоятельно.Я реализовал этот интерфейс таким образом, что 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;
    }

}
2 голосов
/ 09 августа 2011

Для создания штрих-кодов в формате 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 Пример

1 голос
/ 10 июля 2011

Если вы готовы смягчить требования к генерации PDF-файлов для использования не-Java-инструмента, вам может пригодиться следующее:

  1. Компоновка шаблонов страниц с использованием HTML / CSS / JS с заполнителями для штрих-кодов.
  2. Используйте Barcode4J для вывода SVG , а затем вставьте это в шаблон.
  3. Визуализация страницы с помощью инструмента командной строки wkhtmltopdf . wkhtmltopdf использует WebKit под капотом, что дает вам хороший контроль над макетом PDF с использованием HTML / CSS.
1 голос
/ 08 июля 2011

Я бы использовал генератор изображений штрих-кода, а затем внедрил его в документ HTML, который я преобразовал в PDF.

Проверьте эту библиотеку для рендеринга XHTML в виде PDF.Используйте barcode4j для рендеринга штрих-кодов в виде изображений, как вы изначально планировали.

...