PDFUnit in Perl - Einige Beispiele

PDFUnit testet sichtbare und unsichtbare Teile eines PDF-Dokumentes. Texte einer PDF-Seite können als echter Text (kein Bild) oder als gerendertes Bild verarbeitet werden.

Weiterhin ist es möglich, viele Eigenschaften eines Test-PDF Dokumentes gegen ein Referenz-Dokument zu vergleichen.

Die nachfolgenden Beispiele geben einen kleinen Einblick in die Benutzung von PDFUnit mit Perl.

Textinhalte auf einer bestimmten Seite

lives_ok {
  my $pdfUnderTest = "$resources_dir/document-under-test.pdf";
  my $expectedText = "Chapter 3";
  my $page2        = PagesToUse->getPage(2);
  
  AssertThat->document($pdfUnderTest)
            ->restrictedTo($page2)
            ->hasText()
            ->containing($expectedText)
  ;
} "validateTextOnPageTwo";

Seitenausschnitte als Text vergleichen

Das folgende Beispiel zeigt die Verwendung von Seitenausschnitten. Der Text im Ausschnitt des Testdokumentes muss mit dem Text in dem Referenz-Dokument identisch sein.

lives_ok {
  my $pdfUnderTest = "$resources_dir/document-under-test.pdf";
  my $pdfReference = "$resources_dir/reference.pdf";
  my $pages12 = PagesToUse->getPages( [1, 2] );
    
  AssertThat->document($pdfUnderTest)
            ->and($pdfReference)
            ->restrictedTo($pages12)
            ->haveSameText()
  ;
} "comparePageBodyWithReference";

Seitenausschnitte als gerenderte Bilder vergleichen

PDFUnit kann nicht nur Text vergleichen, sondern auch Seiten oder Seitenausschnitte als Bilder (rendered page). Im nächsten Beispiel wird der Vergleich auf einen Ausschnitt der ersten Seite beschränkt.

lives_ok {
  my $pdfUnderTest = "$resources_dir/document-under-test.pdf";
  my $pdfReference = "$resources_dir/reference.pdf";
  
  my $leftX  =  80;  # in millimeter
  my $ipperY = 175;
  my $width  =  60;
  my $height =   9;
  my $region = PageRegion->new($leftX, $upperY, $width, $height);
  
  AssertThat->document($pdfUnderTest)
            ->and($pdfReference)
            ->restrictedTo(FIRST_PAGE)
            ->restrictedTo(region)
            ->haveSameAppearance()
  ;
} "haveSameAppearanceOnFirstPageInRegion";

Inhalt eines QR-Codes

QR-Codes sind immer mehr Teil von PDF-Dokumenten. Aus diesem Grund bietet PDFUnit auch Methoden zur Validierung der QR-Code Inhalte.

lives_ok {
  my $expectedText = "hello, world";
  my $page2        = PagesToUse->getPage(2);
  my $firstQRCodeRegion = _createQRCodeRegion();
    
  AssertThat->document($pdfUnderTest)
            ->restrictedTo($page2)
            ->restrictedTo($firstQRCodeRegion)
            ->hasImage()
            ->withQRCode()
            ->equalsTo($expectedText)
  ;
} "validateQRCode";

Inhalte von ZUGFeRD-Daten

Die unsichtbaren ZUGFeRD-Daten und die sichtbaren Daten eines PDF-Dokumentes sollten zusammenpassen. Für diese Anforderung gibt es in PDFUnit passende Testmethoden. Das folgende Beispiel prüft, ob die Kontonummer aus den ZUGFeRD-Daten mit der Kontonummer in einem vorgegebenen Bereich der ersten Seite des Rechnungsdokumentes übereinstimmt:

lives_ok {
  my $pdfUnderTest = "$resources_dir/document-under-test.pdf";
  my $nodeIBAN = XMLNode->new("ram:IBANID");

  my $ibanLeftX  =  80;  # in millimeter
  my $ibanUpperY = 175;
  my $ibanWidth  =  60;
  my $ibanHeight =   9;
  my $regionIBAN = PageRegion->new($ibanLeftX, $ibanUpperY, $ibanWidth, $ibanHeight);

  AssertThat->document($pdfZugferd)
            ->restrictedTo(FIRST_PAGE)
            ->restrictedTo($regionIBAN)
            ->hasText()
            ->containingZugferdData($nodeIBAN)
  ;
} "validateIBANInZugferdData";

Weitere Beispiele

Eine vollständige Beschreibung aller Testfunktionen ist im Handbuch für PDFUnit-Java zu finden. Das Handbuch für PDFUnit-Perl beschreibt zwar viele Beispiele, aber nicht alle, letztendlich um den Dokumentationsaufwand gering zu halten. Perl-Entwickler sind der Erfahrung nach clever genug, die Syntax von Java nach Perl zu übertragen. Die Namen der Methoden sind in Java und Perl identisch.

Beide Handbücher können als PDF heruntergeladen werden.