PDFUnit in .Net - Einige Beispiele mit C# (.Net)

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-Dokumentes gegen ein Referenz-Dokument zu vergleichen.

Die nachfolgenden Beispiele geben einen Einblick in die Benutzung von PDFUnit mit C#.

Text in einem Ausschnitt einer bestimmten Seite

[TestMethod] 
public void hasTextOnFirstPage() 
{
  String filename = "document-under-test.pdf";

  int upperLeftX  =  17;
  int upperLeftY  =  45;
  int width       =  60;
  int height      =   9; 
  PageRegion region = new PageRegion(upperLeftX, upperLeftY, width, height);

  AssertThat.document(filename)
            .restrictedTo(Constants.FIRST_PAGE)
            .restrictedTo(region)
            .hasText()
            .containing("on first")
  ;
}

Seitenausschnitte als Text vergleichen

Der folgende Test überprüft, dass das Testdokument und das Referenzdokument im angegebenen Seitenausschnitt denselben Text enthalten.

[TestMethod]
public void compareText_InClippingArea() 
{
  String documentUnderTest = "document-under-test.pdf";
  String reference = "reference.pdf";

  int upperLeftX = 0;
  int upperLeftY = 0;
  int width = 210;
  int height = 50;
  
  PageRegion headerRegion = new PageRegion(upperLeftX, upperLeftY, width, height);

  AssertThat.document(documentUnderTest)
            .and(reference)
            .restrictedTo(Constants.EVERY_PAGE)
            .restrictedTo(headerRegion)
            .haveSameText()
  ;
}
}

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 Header aller Seiten des Testdokumentes mit dem Header des Referenzdokumentes als Bild verglichen.

[TestMethod]
public void haveSameAppearanceInRegion()
{
  String documentUnderTest = "document-under-test.pdf";
  String reference = "reference.pdf";

  int upperLeftX = 0;
  int upperLeftY = 0;
  int width = 210;
  int height = 50;

  PageRegion headerRegion = new PageRegion(upperLeftX, upperLeftY, width, height);

  AssertThat.document(documentUnderTest)
            .and(reference)
            .restrictedTo(Constants.EVERY_PAGE)
            .restrictedTo(headerRegion)
            .haveSameAppearance()
  ;
}

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.

[TestMethod]
public void validateTextInQRCode()
{
  String pdfUnderTest = PATH + "qrcode/qrCode-createdByZXing.pdf";
  String expectedText = "hello, world";

  int upperLeftX = 10;
  int upperLeftY = 65;
  int width = 40;
  int height = 40;
  PageRegion pageRegion = new PageRegion(upperLeftX, upperLeftY, width, height);

  AssertThat.document(pdfUnderTest)
            .restrictedTo(Constants.FIRST_PAGE)
            .restrictedTo(pageRegion)
            .hasImage()
            .withQRCode()
            .containing(expectedText)
  ;
}

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:

[TestMethod]
public void validateIBANInZugferdData()
{
  String filename = PATH + "zugferd10/ZUGFeRD_1p0_BASIC_Einfach.pdf";
  String expectedIBAN = "DE08700901001234567890";
  XMLNode nodeIBAN = new XMLNode("ram:IBANID", expectedIBAN);

  int ibanUpperLeftX = 80;  // in millimeter
  int ibanUpperLeftY = 175;
  int ibanWidth = 60;
  int ibanHeight = 9;
  PageRegion regionIBAN = new PageRegion(ibanUpperLeftX, ibanUpperLeftY, ibanWidth, ibanHeight);


  AssertThat.document(filename)
            .hasZugferdData()
            .withNode(nodeIBAN)
  ;
  AssertThat.document(filename)
            .restrictedTo(Constants.FIRST_PAGE)
            .restrictedTo(regionIBAN)
            .hasText()
            .containing(expectedIBAN, WhitespaceProcessing.IGNORE)
  ;
}

Weitere Beispiele

Eine vollständige Beschreibung aller Testfunktionen ist im Handbuch für PDFUnit-Java zu finden. Das Handbuch für PDFUnit-.Net beschreibt zwar viele Beispiele, aber nicht alle, letztendlich um den Dokumentationsaufwand gering zu halten. Die Namen der Methoden sind in Java und C# identisch und auch sonst unterscheidet sich die Syntax zwischen C# und Java nicht.

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