4.15. XFA-Daten vergleichen

XFA-Daten von zwei PDF-Dokumenten miteinander komplett zu vergleichen, ist insofern nicht sinnvoll, weil sie meistens ein Erstellungs- und Änderungsdatum enthalten. Deshalb bietet PDFUnit den Vergleich von XFA-Daten auf der Basis von XPath-Ausdrücken an.

Übersicht

Es gibt nur eine Testmethode, die aber ist sehr mächtig:

// Method for tests with XMP data

.haveSameXFAData().matchingXPath(XPathExpression)

Falls es Zweifel über die Inhalte der XFA-Daten gibt, können diese mit dem Hilfsprogramm ExtractXFAData in eine XML-Datei extrahiert werden. Siehe Kapitel 9.13: „XFA-Daten nach XML extrahieren“.

Beispiel mit verschiedenen Knoten in XFA-Daten und Namensräumen

Im folgenden Beispiel werden zwei Knoten aus den XFA-Daten mit jeweils einem XPath-Ausdruck überprüft. Das Ergebnis der XPath-Auswertung muss für beide PDF-Dokumente identisch sein.

@Test
public void haveSameXFAData_MultipleDefaultNamespaces() throws Exception {
  String filenameTest = "documentUnderTest.pdf";
  String filenameReference = "reference.pdf";
  
  String nsStringXFATemplate = "http://www.xfa.org/schema/xfa-template/2.6/";
  String nsStringXFALocale   = "http://www.xfa.org/schema/xfa-locale-set/2.7/";
  
  DefaultNamespace nsXFATemplate = new DefaultNamespace(nsStringXFATemplate);
  DefaultNamespace nsXFALocale   = new DefaultNamespace(nsStringXFALocale);
  
  String xpathSubform = "//default:subform/@name[.='movie']";
  String xpathLocale  = "//default:locale/@name[.='nl_BE']";
  
  XPathExpression exprXFATemplate = new XPathExpression(xpathSubform, nsXFATemplate);
  XPathExpression exprXFALocale   = new XPathExpression(xpathLocale, nsXFALocale);
  
  AssertThat.document(filenameTest)
            .and(filenameReference) 
            .haveSameXFAData()
            .matchingXPath(exprXFATemplate)
            .matchingXPath(exprXFALocale)
  ;
}

Beachten Sie den Umgang mit dem Default-Namensraum. Er muss mit der Klasse com.pdfunit.DefaultNamespace deklariert werden. Alle anderen Namensräume müssen nicht deklariert werden, sie werden automatisch erkannt.

Sie können mehrere XPath-Vergleiche in einem Test ausführen, sogar mit wechselnden Default-Namensräumen. Überlegen Sie sich aber, ob Sie den vorhergehenden Test nicht lieber in einzelne Tests aufteilen.

Werden zwei Dokumente verglichen, die beide keine XFA-Daten enthalten, wirft PDFUnit eine Exception. Es macht keinen Sinn, etwas zu vergleichen, das es nicht gibt. Eine ausführliche Beschreibung für das Arbeiten mit XPath in PDFUnit steht in Kapitel 13.11: „XPath-Einsatz“.

Beispiel - XPath-Ausdruck mit XPath-Funktion

Die XPath-Ausdrücke dürfen auch XPath-Funktionen enthalten:

@Test
public void haveSameXFAData() throws Exception {
  String filenameTest = "documentUnderTest.pdf";
  String filenameReference = "reference.pdf";
  
  DefaultNamespace defaultNS 
                 = new DefaultNamespace("http://www.xfa.org/schema/xfa-template/2.6/");
  XPathExpression  expression 
                 = new XPathExpression("count(//default:field) = 3", defaultNS);
                 
  AssertThat.document(filenameTest)
            .and(filenameReference) 
            .haveSameXFAData()
            .matchingXPath(expression)
  ;
}