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(..)
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) ; }
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) ; }
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