Wenn ich ein längeres Dokument im PDF-Format brauche, arbeite ich mit Apache FOP. Das Java-Programm erstellt aus Textdateien und Bildern die fertigen Druckvorlagen. Das gleiche kann auch LibreOffice, wenn man ihm HTML gibt oder LaTeX, wenn der Text in TeX geschrieben ist. Für mich war LibreOffice zu unzuverlässig und LaTeX zu nervig mit seinen gewöhnungsbedürftigen Entscheidungen. Daher entschied ich mich für FOP 1.0.
FOP verarbeitet Texte in FO. Dies ist ein sehr komplexes XML-Format, das nicht nur den Text, sondern auch das Design enthält. Bei mir erstellt xsltproc die FO-Datei, indem es einen Text in DocBook mit einem XSLT-Stylesheet verknüpft. In dem Stylesheet kann man Ränder oder auch die Schriftart einstellen. Die DocBook-Datei enthält etwa die gleichen Informationen wie eine HTML- oder TeX-Datei. Nämlich nur den Text und Referenzen auf die Bilder. Man könnte hier den Text direkt eintippen, ich entschied mich aber für einen weiteren Schritt. Den Text schreibe ich in Markdown und konvertiere ihn mit Pandoc nach DocBook. Also Markdown → DocBook → FO → PDF. Wie das installiert wird, erkläre ich hier.
Wenn im FO ein Font angegeben ist, muss FOP die Schriftart kennen. Dafür wird die Konfigurationsdatei conf/fop.xconf benötigt und mit dem Parameter -c an FOP übergeben. In der Datei kann man die Schriften konfigurieren. Da ich immer die gleichen Fonts verwenden möchte, entschied ich mich diese nicht im Stylesheet und damit FO-Dokument anzugeben, sondern die Fonts als Ersatz für die Standardangaben serif und sans-serif fest vorzugeben. Wenn FOP auf diese Weise eine Schrift vorgegeben bekommt, bettet er sie auch gleich ins PDF ein. Es ist also sichergestellt, dass später im PDF-Betrachter oder Drucker alle Zeichen verfügbar sind. Ohne eingebetteter Schriften ist dies reine Glückssache. Dies sind meine Angaben für die Serif-Schriften:
<renderers> <renderer mime="application/pdf"> <fonts> <font metrics-url="/path/to/fonts/LinLibertine_R.xml" kerning="yes" embed-url="/path/to/fonts/LinLibertine_R.ttf"> <font-triplet name="serif" style="normal" weight="normal"/> </font> <font metrics-url="/path/to/fonts/LinLibertine_RB.xml" kerning="yes" embed-url="/path/to/fonts/LinLibertine_RB.ttf"> <font-triplet name="serif" style="normal" weight="bold"/> </font> <font metrics-url="/path/to/fonts/LinLibertine_RI.xml" kerning="yes" embed-url="/path/to/fonts/LinLibertine_RI.ttf"> <font-triplet name="serif" style="italic" weight="normal"/> </font> </fonts> </renderer> </renderers>
Die Schrift muss als TTF vorliegen und benötigt zusätzlich ein „font metrics file“, das so erstellt wird: fop-ttfreader LinLibertine_R.ttf LinLibertine_R.xml