PDFUnit und JUnit - typische 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 Java.

Textinhalte auf einer bestimmten Seite

 @Test
 public void hasText_OnIndividualPages() throws Exception {
   String filename = PATH + "content/diverseContentOnMultiplePages.pdf";
   PagesToUse page2 = PagesToUse.getPage(2);
  
   AssertThat.document(filename)
             .restrictedTo(page2)
             .hasText() 
             .containing("Lorem ipsum")
   ;
 }

Textinhalte in einem Seitenausschnitt

Das folgende Beispiel prüft, ob der Adressbereich eines Schriftstücks den erwarteten Text enthält:

 // Comparing text in a part of a PDF page
 @Test
 public void hasText_OnFirstPage_InRegion() throws Exception {
   String filename = PATH + "content/diverseContentOnMultiplePages.pdf";
     
   int leftX  =  17;  // in millimeter
   int upperY =  45;
   int width  =  60;
   int height =   9; 
   PageRegion addressRegion = new PageRegion(leftX, upperY, width, height);
     
   AssertThat.document(filename)
             .restrictedTo(FIRST_PAGE)
             .restrictedTo(addressRegion)
             .hasText()                    
             .startingWith("Lorem")  
             .containing("ipsum") 
             .endingWith("est laborum.")
   ;
 }

Texte in Formularfeldern

Formulare sind häufig Teil einer Prozesskette. Deshalb sollte sichergestellt werden, dass die erzeugten Formularfelder korrekt sind. PDFUnit kann viele Eigenschaften der Felder und natürlich auch die Inhalte überprüfen.

 @Test
 public void hasField_MatchingComplete() throws Exception {
   String filename = PATH + "acrofields/letter.pdf";
   String fieldName = "customer-name";
   String expectedValue = "John";
   
   AssertThat.document(filename)
             .hasField(fieldName)
             .matchingComplete(expectedValue)
   ;
 }

Enthalten Formularfelder zuviel Text?

Ein Formularfeld kann soviel Text enthalten, dass dieser nach dem Rendern durch einen PDF-Reader nicht mehr ins Fenster passt. Eine solche Situation kann getestet werden. Das PDF-Dokument für das folgende Beispiel stellt diese Situation nach, sodass ein Testfehler erwartet wird.

 @Test(expected=PDFUnitError.class)
 public void hasFields_WithoutTextOverflow_Fieldname() throws Exception {
   String filename = PATH + "acrofields/fieldSizeAndText.pdf";
   String fieldname = "Textfield, too much text, multiline:";
 
   AssertThat.document(filename)
             .hasField(fieldname)
             .withoutTextOverflow()
   ;
 }

Gerenderte PDF-Seiten eines Test Dokumentes mit einer Vorlage vergleichen

PDFUnit kann sowohl Text, als auch eine gerenderte Seite als Bild mit einer Vorlage (PDF-Referenz) vergleichen. Das nachfolgende Beispiel zeigt einen solchen Vergleich, der zusätzlich noch auf einen Seitenausschnitt auf der ersten Seite eingeschränkt wird.

 @Test
 public void haveSameAppearance_OnFirstPage_InRegion() throws Exception {
   String filenameTest = PATH + "test/test.pdf";
   String filenameReference = PATH + "reference/reference.pdf";
   
   int leftX  =  20;  // in millimeter
   int upperY =  20;
   int width  = 180;
   int height =  40; 
   PageRegion region = new PageRegion(leftX, upperY, width, height);

   AssertThat.document(filenameTest)
             .and(filenameReference)
             .restrictedTo(FIRST_PAGE)
             .restrictedTo(region)
             .haveSameAppearance()
   ;
 }

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:

 @Test
 public void validateIBANInZugferdData() throws Exception {
   String filename = PATH + "zugferd10/ZUGFeRD_1p0_BASIC_Einfach.pdf";
  
   XMLNode nodeIBAN = new XMLNode("ram:IBANID");
   PageRegion regionIBAN = createRegionIBAN();
  
   AssertThat.document(filename)
             .restrictedTo(FIRST_PAGE)
             .restrictedTo(regionIBAN)
             .hasText()
             .containingZugferdData(nodeIBAN)
   ;
 }

Weitere Beispiele

Das aktuelle Entwicklerhandbuch enthält zu allen Testbereichen ausführliche Beispiele. Es steht online zur Verfügung und kann als PDF heruntergeladen werden.