3.24. Schriften

Überblick

Schriften in PDF-Dokumenten sind keine einfach Sache, spielen aber spätestens dann eine Rolle, wenn eine verwendete Schriftarten nicht mehr zu den durch den PDF-Standard definierten 14 Schriften gehört. Auch für die Archivierung von PDF-Dokumenten spielen Schriften eine besondere Rolle. PDFUnit bietet unterschiedliche Testmethoden für Schriften, um verschiedene Bedürfnisse abzudecken:

// Simple tests:
.hasFont()
.hasFonts()           // identical with hasFont()
.hasNumberOfFonts(..) 

// Tests for one font:
.hasFont().withNameContaining(..) 
.hasFont().withNameNotContaining(..) 

// Tests for many fonts:
.hasFonts().ofThisTypeOnly(..)

Anzahl von Schriften

Was ist eine Schrift? Soll ein Subset einer Schrift als eigene Schrift gezählt werden? Für Softwareentwickler sind diese Fragen selten relevant, für ein Testwerkzeug schon.

In PDFUnit gelten zwei Schrift als 'gleich', wenn die für einen Test relevanten Vergleichskriterien gleiche Werte haben. Die unterstützten Vergleichskriterien werden durch Konstanten angegeben:

// Constants to identify fonts:

com.pdfunit.Constants.IDENTIFIEDBY_ALLPROPERTIES                          
com.pdfunit.Constants.IDENTIFIEDBY_BASENAME                       
com.pdfunit.Constants.IDENTIFIEDBY_EMBEDDED                       
com.pdfunit.Constants.IDENTIFIEDBY_NAME
com.pdfunit.Constants.IDENTIFIEDBY_NAME_TYPE                      
com.pdfunit.Constants.IDENTIFIEDBY_TYPE

Die folgende Liste erläutert die Vergleichskriterien für Schriften:

Konstante Beschreibung
ALLPROPERTIES Alle Eigenschaften eines Fonts gelten als identifizierend. Von zwei verwendeten Schriften, die in allen Eigenschaften gleichwertig sind, wird nur eine gezählt.
BASENAME Es werden nur die unterschiedlichen Basisschriften gezählt.
EMBEDDED Mit diesem Filter werden sämtliche Schriften erfasst, die eingebettet sind.
NAME Es werden Schriften mit unterschiedlichem Name gezählt.
NAME_TYPE Die Kombination von Name und Typ einer Schrift gelten als identifizierender Teil.
TYPE Es werden nur Schriften gezählt, die einen unterschiedlichen Typ haben.

Hier ein Beispiel, das alle möglichen Vergleichskriterien benutzt:

@Test
public void hasNumberOfFonts_Japanese() throws Exception {
  String filename = "documentUnderTest.pdf";
  
  AssertThat.document(filename)
            .hasNumberOfFonts(11, IDENTIFIEDBY_ALLPROPERTIES)
            .hasNumberOfFonts( 9, IDENTIFIEDBY_BASENAME)
            .hasNumberOfFonts( 8, IDENTIFIEDBY_EMBEDDED)
            .hasNumberOfFonts( 9, IDENTIFIEDBY_NAME)
            .hasNumberOfFonts( 9, IDENTIFIEDBY_NAME_TYPE)
            .hasNumberOfFonts( 2, IDENTIFIEDBY_TYPE)
  ;
}

Schriftnamen

Tests, die auf die Namen von Schriften zielen, sind einfach:

@Test
public void hasFont_WithNameContaining() throws Exception {
  String filename = "documentUnderTest.pdf";
  
  AssertThat.document(filename)
            .hasFont().withNameContaining("Arial")
  ;
}

Schriftnamen innerhalb eines PDF-Dokumentes enthalten gelegentlich noch ein Präfix, z.B. FGNNPL+ArialMT. Weil dieses Präfix für Tests uninteressant ist, prüft PDFUnit lediglich, ob der gesuchte Schriftname in den Schriftnamen des PDF-Dokumentes als Teilstring enthalten ist.

Die Testmethoden können verkettet werden:

@Test
public void hasFont_WithNameContaining_MultipleInvocation() throws Exception {
  String filename = "documentUnderTest.pdf";
  
  AssertThat.document(filename)
            .hasFont().withNameContaining("Arial")
            .hasFont().withNameContaining("Georgia")
            .hasFont().withNameContaining("Tahoma")
            .hasFont().withNameContaining("TimesNewRoman")
            .hasFont().withNameContaining("Verdana")
            .hasFont().withNameContaining("Verdana-BoldItalic")
  ;
}

Weil es gelegentlich interessant ist, zu wissen, dass eine bestimmte Schriftart in einem Dokument nicht enthalten ist, gibt es auch hierfür eine Testmethode:

@Test
public void hasFont_WithNameNotContaining() throws Exception {
  String filename = "documentUnderTest.pdf";
  String wrongFontnameIntended = "ComicSansMS";
  
  AssertThat.document(filename)
            .hasFont().withNameNotContaining(wrongFontnameIntended)
  ;
}

Schrifttypen

Sie können prüfen, ob alle in einem PDF-Dokument verwendeten Schrifttypen einem bestimmten Typ entsprechen:

@Test
public void hasFonts_OfThisTypeOnly_TrueType() throws Exception {
  String filename = "documentUnderTest.pdf";
  
  AssertThat.document(filename)
            .hasFonts()
            .ofThisTypeOnly(FONTTYPE_TRUETYPE)
  ;
}

Die prüfbaren Schrifttypen sind als Konstanten deklariert:

// Constants for font types:
com.pdfunit.Constants.FONTTYPE_CID
com.pdfunit.Constants.FONTTYPE_CID_TYPE0
com.pdfunit.Constants.FONTTYPE_CID_TYPE2
com.pdfunit.Constants.FONTTYPE_MMTYPE1
com.pdfunit.Constants.FONTTYPE_OPENTYPE
com.pdfunit.Constants.FONTTYPE_TRUETYPE
com.pdfunit.Constants.FONTTYPE_TYPE0
com.pdfunit.Constants.FONTTYPE_TYPE1
com.pdfunit.Constants.FONTTYPE_TYPE3