Barcode & Etiketten Software

Barcode-Lib4J – Open-Source Barcode-Bibliothek für Java

Barcode-Lib4J

BARCODE-Lib4J – Open-Source-Bibliothek für Java zum präzisen Generieren, Drucken und Speichern von 1D- und 2D-Barcodes in Vektor- (PDF, EPS, SVG) und Rastergrafiken (PNG, BMP, JPG). Praxiserprobt durch Verwendung in unseren kommerziellen Software-Produkten.

Barcodes mit Java

  • Zeichnen und Drucken von 1D- und 2D-Barcodes mittels Java2D (java.awt.Graphics2D)
  • Barcodes als PDF: Konformität zu PDF/X-1a:2001 für farbtreuen Druck in CMYK sowie zu PDF/X-3:2002 für RGB-Farben
  • Barcodes als EPS: Optionales Einbetten einer TIFF-Vorschau zur Anzeige in Grafikanwendungen ohne eigenen EPS-Interpreter; Unterstützung von CMYK- und RGB-Farbmodellen
  • Barcodes als SVG: Das SVG-Format unterstützt von sich aus nur das RGB-Farbmodell
  • Barcodes als PNG, BMP, JPG: Ohne unerwünschte Effekte wie Aliasing und andere Artefakte; Speicherung der DPI-Auflösung im Datei-Header, wodurch neben der Zielauflösung auch die Originalabmessungen der Grafik für späteren Druck erhalten bleiben
  • Hohe Präzision: Koordinaten werden in allen unterstützten Vektorformaten mit bis zu sechs Dezimalstellen gespeichert
  • Anpassung der Strichbreiten an die Druckerauflösung (wichtig für die Barcode-Qualität bei Druckauflösungen ≤ 600 dpi)
  • Strichbreitenreduktion/-korrektur (nützlich zur Berücksichtigung von Farbausbreitung bei Tintenstrahldruckern)
  • Barcodes enthalten vorgeschriebene Mindestabstände ("Ruhezonen") gemäß der jeweiligen Spezifikation
  • Gestaltbare Klartextzeile: Schriftart, -größe, Abstand und änderbarer Inhalt; optional auch eine automatische Anpassung der Schriftgröße
  • Die Klartextzeile kann wahlweise oben oder unten positioniert oder vollständig ausgeblendet werden
  • Erweiterte Einstellungen ermöglichen das Drucken mit einer benutzerdefinierten Breite der Barcode-Striche ("Modulbreite")
  • Option für transparenten Hintergrund für EPS, PDF, SVG und PNG
  • Drehen in 90-Grad-Schritten
  • Einstellbares Strichbreitenverhältnis ("Ratio") von 2:1 bis 3:1 bei Barcode-Typen, die dies unterstützen
  • Optionale Add-Ons 2 oder 5 für die Barcodes EAN-13, EAN-8, UPC-A, UPC-E, ISBN-13 und ISMN
  • Umfassende Unterstützung von GS1-128, GS1 DataMatrix, GS1 QR Code: Prüfung der Datenintegrität wie der Korrektheit von Datenbezeichnern ("Application Identifier"), Länge und Format der Nutzdaten, Prüfziffernkontrolle bzw. -berechnung bei SSCC und GTIN

Java Version und Abhängigkeiten

Java 9 oder höher wird benötigt. Die OpenPDF-Bibliothek v1.3.0 oder höher wird für den PDF-Export oder während der Kompilierung benötigt. Nach der Kompilierung kann Barcode-Lib4J ohne diese Bibliothek ausgeführt werden.

OpenPDF ist verfügbar unter:  GitHub  |  Maven Repository

Erste Schritte mit Beispielen

In den folgenden Beispielen müssen verschiedene Klassen importiert werden. Damit dies nicht in jedem Beispiel einzeln nötig ist, können Sie die folgende Import-Liste verwenden, die alle erforderlichen Klassen auf einmal berücksichtigt:

import java.awt.*;
import java.io.*;

import de.vwsoft.barcodelib4j.image.*;
import de.vwsoft.barcodelib4j.oned.*;
import de.vwsoft.barcodelib4j.twod.*;

Beispiel: 1D Barcode – Code 128 als Vektorgrafik mit RGB-Farben

Das Beispiel erzeugt eine Barcode-Grafik im SVG-Vektorformat, das nur RGB-Farben unterstützt. Um auf das CMYK-Farbmodell zu wechseln, ersetzen Sie in Schritt 5 writeSVG durch writeEPS bzw. writePDF und fügen Sie ImageCreator.COLORSPACE_CMYK als zweiten Parameter hinzu. Verwenden Sie außerdem in Schritt 3 für CompoundColor einen der für CMYK-Farben vorgesehenen Konstruktoren.

// SCHRITT 1: 'Barcode'-Instanz erzeugen und konfigurieren
Barcode barcode = Barcode.newInstance(BarcodeType.CODE128);
try {
    barcode.setContent("Abc-12345", false, false);
} catch (BarcodeException ex) {
    // Ungültigen Barcode-Inhalt behandeln
}
barcode.setFont(new Font("OCR-B", Font.PLAIN, 1));
barcode.setFontSizeAdjusted(true);
barcode.setTextOffset(-0.3);
// ... Weitere optionale Einstellungen für Prüfziffer, Add-On, Ratio,
// Textposition und -sichtbarkeit sowie andere Barcode-Eigenschaften

// SCHRITT 2: Abmessungen der Grafik in Millimetern festlegen
final double widthMM = 50.0, heightMM = 30.0;

// SCHRITT 3: 'ImageCreator'-Instanz erzeugen und konfigurieren
ImageCreator imageCreator = new ImageCreator(widthMM, heightMM);
imageCreator.setTitle("Code 128: " + barcode.getText());
imageCreator.setForeground(new CompoundColor(Color.RED));
imageCreator.setBackground(new CompoundColor(Color.YELLOW));
// ... Weitere optionale Einstellungen wie Hintergrundtransparenz,
// Rotationswinkel und zusätzliche Metadaten

// SCHRITT 4: 'Graphics2D'-Instanz abrufen, dann den Barcode an
// Position [0,0] mit den festgelegten Abmessungen zeichnen
Graphics2D g2d = imageCreator.getGraphics2D();
barcode.draw(g2d, 0.0, 0.0, widthMM, heightMM);
g2d.dispose();
// ... Die 'Graphics2D'-Instanz ist speziell für das Barcode-Zeichnen
// eingerichtet; notwendige 'RenderingHints' sind vorkonfiguriert

// SCHRITT 5: Barcode-Grafik als Vektordatei speichern
try (FileOutputStream fos = new FileOutputStream("Code 128.svg")) {
    imageCreator.writeSVG(fos);
} catch (IOException ex) {
    // Fehler beim Dateischreiben behandeln
}

Beispiel: 2D Code – QR Code als Vektorgrafik mit CMYK-Farben

Für die Verwendung von RGB-Farben anstelle von CMYK lesen Sie die Einleitung zum ersten Beispiel. Beide Farbmodelle werden von den Formaten EPS und PDF unterstützt.

// SCHRITT 1: 'TwoDCode'-Instanz erzeugen und konfigurieren
TwoDCode tdc = new TwoDCode();
tdc.setType(TwoDType.QRCODE);
tdc.setQuietZoneSize(TwoDCode.ALL_QUIET_ZONES.get(TwoDType.QRCODE));
tdc.setContent("Ich bin ein QR Code");
tdc.setCharset(null); // ISO-8859-1 wird verwendet, kein ECI wird erzeugt
// Alternativ kann ein anderer Zeichensatz als ISO-8859-1 (z.B. UTF-8)
// angegeben werden, was einen ECI-Block im QR Code einfügt

// SCHRITT 2: Typ-spezifische Einstellungen vornehmen (Methoden für QR Code
// beginnen mit setQRCode***, für DataMatrix mit setDataMatrix***, usw.)
tdc.setQRCodeVersion(TwoDCode.QRCODE_VERSION_AUTO);
tdc.setQRCodeErrCorr(1);
// Legt die niedrigste Fehlerkorrekturstufe (L) fest und weist
// die Bibliothek an, automatisch die kleinste QR Code-Version
// (= Größe des Code-Symbols) zu wählen, die den Inhalt kodieren kann

// SCHRITT 3: Prüfen, ob der Inhalt mit dem gewählten Zeichensatz
// kodiert werden kann; danach eine 'TwoDSymbol'-Instanz abrufen,
// die später auf einem 'Graphics2D' gezeichnet werden soll
TwoDSymbol symbol = null;
if (tdc.canEncode()) {
    try {
        symbol = tdc.buildSymbol();
    } catch (Exception ex) {
        // Die Exception behandeln
    }
}

// SCHRITT 4: Abmessungen der Grafik in Millimetern festlegen;
// da QR Codes immer quadratisch sind, wird das Symbol auf der Fläche
// zentriert (zur Demonstration unterscheiden sich Breite und Höhe)
final double widthMM = 50.0, heightMM = 30.0;

// SCHRITT 5: 'ImageCreator'-Instanz erzeugen und konfigurieren
ImageCreator imageCreator = new ImageCreator(widthMM, heightMM);
imageCreator.setTitle("Beispiel QR Code");
imageCreator.setForeground(new CompoundColor(70, 60, 0, 40));
imageCreator.setBackground(new CompoundColor(0, 5, 40, 0));
// ... Hier können weitere optionale Einstellungen konfiguriert werden,
// wie Hintergrundtransparenz, Rotationswinkel, zusätzliche Metadaten
// und Einstellungen für die Einbettung einer optionalen TIFF-Vorschau

// SCHRITT 6: 'Graphics2D'-Instanz abrufen, dann den Code an
// Position [0,0] mit den festgelegten Abmessungen zeichnen
Graphics2D g2d = imageCreator.getGraphics2D();
symbol.draw(g2d, 0.0, 0.0, widthMM, heightMM);
g2d.dispose();
// Hinweis: Die zurückgegebene 'Graphics2D'-Instanz ist speziell für das
// Barcode-Zeichnen eingerichtet, mit vorkonfigurierten 'RenderingHints'

// SCHRITT 7: Barcode-Grafik als Vektordatei speichern
try (FileOutputStream fos = new FileOutputStream("QR Code.eps")) {
    imageCreator.writeEPS(fos, ImageCreator.COLORSPACE_CMYK);
} catch (IOException ex) {
    // Fehler beim Dateischreiben behandeln
}

Drucken oder Exportieren von 1D- und 2D-Barcodes in Rasterformate

Beim Exportieren von Barcodes in Rasterformate (PNG, BMP, JPG) sowie bei der Ausgabe auf einem Drucker mit niedriger Auflösung ist es wichtig, die richtige Auflösung anzugeben, um die bestmögliche Qualität zu gewährleisten. Die write-Methode sollte den entsprechenden numerischen Parameter verwenden, während die draw-Methode die abgeleitete Punktgröße in Millimetern verwenden sollte. Letztere wird nach folgender Formel berechnet: 25,4 geteilt durch die Auflösung in DPI. Beispiel:

// Typische Auflösung eines Etikettendruckers
int resolutionDPI = 300;

// Punktgröße in Millimetern berechnen
double dotSizeMM = 25.4 / resolutionDPI;

// Die 'draw'- und 'write'-Methodenaufrufe anpassen
barcode.draw(g2d, 0.0, 0.0, widthMM, heightMM, dotSizeMM, 0.0, 0.0);
// ...
imageCreator.writePNG(fos, resolutionDPI, resolutionDPI);

Erstellen von GS1-Barcodes – GS1-128, GS1 DataMatrix, GS1 QR Code

Vor der Erstellung von GS1-Barcodes sollten Sie sich mit dem Konzept der GS1-Datenbezeichner ("Application Identifier") vertraut machen. Eine detaillierte Beschreibung finden Sie in den Tutorials auf dieser Website: GS1-128 und GS1 DataMatrix.

Je nach Typ des Barcodes, den Sie erstellen möchten, verwenden Sie der Einfachheit halber eines der obigen vollständigen 1D- oder 2D-Beispiele und fügen Sie die folgenden Codeabschnitte passend in den jeweiligen Java-Code ein.

Für alle drei Code-Typen wird der zu kodierende Inhalt nach demselben Schema zusammengefügt:

// Für GS1-128 verwenden Sie ImplEAN128.FNC1 als FNC1-Zeichen;
// für GS1 DataMatrix und GS1 QR Code verwenden Sie (char)29
final char fnc1 = ImplEAN128.FNC1;

// Eine GTIN und ein Mindesthaltbarkeitsdatum als Beispieldaten
final String gtinAI = "01", gtinValue = "01234567890128";
final String bestBeforeDateAI = "15", bestBeforeDateValue = "271231";

// Fügen Sie den Inhalt zusammen, indem Sie auf jedes AI+Wert-Paar
// dasselbe Muster anwenden; unnötige FNC1-Zeichen, einschließlich
// des letzten, werden von der Bibliothek automatisch entfert
String content =
        '(' + gtinAI + ')' + gtinValue + fnc1 +
        '(' + bestBeforeDateAI + ')' + bestBeforeDateValue + fnc1;
// Hinweis: die Bibliothek akzeptiert den Inhalt auch ohne Klammern;
// diese werden hier zur einfacheren Fehlersuche eingefügt

Für GS1-128 geht es weiter mit:

Barcode barcode = Barcode.newInstance(BarcodeType.EAN128);
try {
    barcode.setContent(content, false, false);
} catch (BarcodeException ex) {
    // Validierungsfehler behandeln
}

Für GS1 DataMatrix oder GS1 QR Code geht es weiter mit:

// Erstellen Sie eine 'TwoDCode'-Instanz und setzen Sie als Typ:
// TwoDType.GS1_DATAMATRIX bzw. TwoDType.GS1_QRCODE

String validated = null;
try {
  validated = new GS1Validator(content, (char)29).getContent();
} catch (BarcodeException ex) {
  // Validierungsfehler behandeln
}

if (validated != null)
  // ... setzen von 'validated' via 'setContent'-Methode

Bei ungültigem Inhalt liefert BarcodeException eine detaillierte Fehlermeldung. Diese Meldungen sind in zwei Sprachen verfügbar – Englisch und Deutsch. Die englische Fehlerbeschreibung kann stets mit getMessage() abgerufen werden, während getLocalizedMessage() die Meldung gemäß der Java-Systemsprache (Locale.getDefault()) zurückgibt.