3.5. Barcode

Überblick

PDFUnit bietet die Möglichkeit, Barcode innerhalb von PDF-Dokumenten zu validieren. Dazu wird ZXing als Parser verwendet. Detailierte Informationen zu ZXing liefert die Homepage des Projektes.

Die vom Parser ausgelesenen Texte können dann mit verschiedenen Methoden verglichen werden. Insgesamt stehen folgende Methoden zur Verfügung:

// Entry to all bar code validations:
.hasImage().withBarcode()

// Validate text in bar codes:
...withBarcode().containing(..)
...withBarcode().containing(.., WhitespaceProcessing)
...withBarcode().endingWith(..)
...withBarcode().equalsTo(..)
...withBarcode().equalsTo(.., WhitespaceProcessing)
...withBarcode().matchingRegex(..)
...withBarcode().startingWith(..)

// Validate text in bar code in image region:
...withBarcodeInRegion(imageRegion).containing(..)
...withBarcodeInRegion(imageRegion).containing(.., WhitespaceProcessing)
...withBarcodeInRegion(imageRegion).endingWith(..)
...withBarcodeInRegion(imageRegion).equalsTo(..)
...withBarcodeInRegion(imageRegion).equalsTo(.., WhitespaceProcessing)
...withBarcodeInRegion(imageRegion).matchingRegex(..)
...withBarcodeInRegion(imageRegion).startingWith(..)

// Compare with another bar code:
...withBarcode().matchingImage(..)

Die folgenden Barcode Formate werden von ZXing automatisch erkannt und können in PDFUnit-Tests verwendet werden:

// 1D bar codes, supported by PDFUnit/ZXing:
CODE_128
CODE_39
CODE_93
EAN_13
EAN_8
CODABAR
UPC_A
UPC_E
UPC_EAN_EXTENSION
ITF

Beispiel - Barcode gegen Text vergleichen

In den folgenden Beispielen werden diese zwei Barcode-Muster verwendet:

Der erste Code enthält den Text 'TESTING BARCODES WITH PDFUNIT' und der zweite Code den Text 'hello, world - 1234567890'.

@Test
public void hasBarCode_Code3of9() throws Exception {
  String filename = "documentUnderTest.pdf";
  
  int leftX  =   0;
  int upperY =  70;
  int width  = 210;
  int height =  30;
  PageRegion pageRegion = new PageRegion(leftX, upperY, width, height);
  
  AssertThat.document(filename)
            .restrictedTo(FIRST_PAGE)
            .restrictedTo(pageRegion)
            .hasImage()
            .withBarcode()
            .containing("TESTING BARCODES WITH PDFUNIT")
  ;
}
@Test
public void hasBarCode_Code128() throws Exception {
  String filename = "documentUnderTest.pdf";
  
  int leftX  =   0;
  int upperY = 105;
  int width  = 210;
  int height =  30;
  PageRegion pageRegion = new PageRegion(leftX, upperY, width, height);
  
  AssertThat.document(filename)
            .restrictedTo(FIRST_PAGE)
            .restrictedTo(pageRegion)
            .hasImage()
            .withBarcode()
            .containing("hello, world")
  ;
}

Wenn in der ausgewählten Region mehrere Bilder existieren, muss jedes Bild den erwarteten Text enhalten. Whitespaces werden vor einem Vergleich normalisiert. Die Behandlung der Whitespaces kann aber durch einen Parameter von außen vorgegeben werden.

Der intern verwendete Barcode-Parser ZXing kennt viele Barcode-Typen, dennoch nicht alle. Deshalb stellt PDFUnit noch eine externe Schnittstelle zur Verfügung, über die kundenspezifische Barcode-Parser eingebunden werden können. Die Verwendung dieser Schnittstelle wird separat dokumentiert. Schicken Sie ein kurzes Mail an info[at]pdfunit.com, um Informationen über die Einbindung eines individuellen Barcode-Parser zu erhalten.

Beispiel - Barcode gegen Image vergleichen

Ein Barcode innerhalb eines PDF-Dokumentes kann auch gegen ein anderes Barcode-Image verglichen werden:

@Test
public void hasBarCodeMatchingImage() throws Exception {
  String filename = "documentUnderTest.pdf";
  
  int leftX  =   0;
  int upperY = 105;
  int width  = 210;
  int height =  30;
  PageRegion pageRegion = new PageRegion(leftX, upperY, width, height);
  
  String expectedImageFilename = "images/barcode-128.png";
  AssertThat.document(filename)
            .restrictedTo(FIRST_PAGE)
            .restrictedTo(pageRegion)
            .hasImage()
            .withBarcode()
            .matchingImage(expectedImageFilename);
  ;
}

Wichtig: Der Dateityp des Bildes, beispielsweise PNG oder TIFF, muss zum Typ des Barcode Bildes im PDF-Dokument passen, damit ein Bildvergleich funktioniert.