3.23. QR-Code

Überblick

Ein QR-Code ist ein 2-dimensionaler Code und kann wie der 1-dimensionale Barcode getestet werden. Dazu verwendet PDFUnit ebenfalls ZXing als Parser. Informationen zu ZXing liefert die Homepage des Projektes: https://github.com/zxing/zxing.

Für die Validierung von QR-Code stehen folgende Methoden zur Verfügung:

// Entry to all QR code validations:
.hasImage().withQRCode()

// Validate text in barcode:
...withQRCode().containing(..)
...withQRCode().containing(.., WhitespaceProcessing)
...withQRCode().endingWith(..)
...withQRCode().equalsTo(..)
...withQRCode().equalsTo(.., WhitespaceProcessing)
...withQRCode().matchingRegex(..)
...withQRCode().startingWith(..)

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

// Compare with another QR code:
...withQRCode().matchingImage(..)

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

// 2D codes, supported by PDFUnit/ZXing:
AZTEC
DATA_MATRIX
QR_CODE
MAXICODE

// Stacked barcode, support by PDFUnit/ZXing:
PDF_417
RSS_14
RSS_EXPANDED

Beispiel - Text aus QR Code prüfen

Dieser QR-Code enthält Text aus dem Roman 'Moby-Dick' von Herman Melville, unter anderem den, der im folgenden Test mit containing abgefragt wird:

@Test
public void hasQRCodeWithText_MobyDick() throws Exception {
  String filename = "documentUnderTest.pdf";
  
  int leftX  =  10;
  int upperY = 175;
  int width  =  70;
  int height =  70;
  PageRegion pageRegion = new PageRegion(leftX, upperY, width, height);
  
  String expectedText = "Some years ago--never mind how long precisely";
  AssertThat.document(filename)
            .restrictedTo(FIRST_PAGE)
            .restrictedTo(pageRegion)
            .hasImage()
            .withQRCode()
            .containing(expectedText)
  ;
}

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

Der intern verwendete QR-Parser ZXing kennt viele QR-Code-Typen, dennoch nicht alle. Deshalb stellt PDFUnit noch eine externe Schnittstelle zur Verfügung, über die kundenspezifische QR-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 QR-Parser zu erhalten.

Beispiel - QR Code in Teilen eines Bildes

Das folgende Beispiel verwendet ein Image, das zwei QR Codes enthält. Damit der Test nur auf einen QR-Code zielt, muss ein Rechteck definiert werden, dessen Referenzpunkt die linke obere Ecke des Images ist. Wichtig: Werte für Bildausschnitte sind in Points angegeben, Werte für Seitenausschnitte in Millimetern.

@Test
public void hasQRCodeInRegion_MobyDick() throws Exception {
  String filename = "documentUnderTest.pdf";
  
  int leftX  =   0;
  int upperY =   0;
  int width  = 209;
  int height = 297;
  PageRegion pageRegion = new PageRegion(leftX, upperY, width, height);
  
  int imgLeftX  = 120; // pixel
  int imgUpperY =   0;
  int imgWidth  = 140;
  int imgHeight = 140;
  ImageRegion imageRegion = new ImageRegion(imgLeftX, imgUpperY, imgWidth, imgHeight);
  
  String expectedText = "Some years ago--never mind how long precisely";
  AssertThat.document(filename)
            .restrictedTo(FIRST_PAGE)
            .restrictedTo(pageRegion)
            .hasImage()
            .withQRCodeInRegion(imageRegion)
            .containing(expectedText)
  ;
}

Beispiel - QR Code mit einem Image vergleichen

Und als Letztes soll noch ein Test gezeigt werden, indem ein QR-Code Bild aus einem PDF-Dokument mit einem extern vorliegenden QR-Code verglichen wird:

@Test
public void hasQRCodeMatchingFile_OnAnyPage() throws Exception {
  String filename = "documentUnderTest.pdf";
  
  int leftX  = 10;
  int upperY = 65;
  int width  = 50;
  int height = 50;
  PageRegion pageRegion = new PageRegion(leftX, upperY, width, height);
  
  String expectedQrImage = "images/hello.qrgen.png";
  AssertThat.document(filename)
            .restrictedTo(ANY_PAGE)
            .restrictedTo(pageRegion)
            .hasImage()
            .withQRCode()
            .matchingImage(expectedQrImage)
  ;
}

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