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
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.
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) ; }
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.