Zurück |  | Weiter

## 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

Zurück | Nach oben | Weiter
3.23. QR-Code | Zum Anfang | 3.25. Seitenzahlen als Testziel