Ich habe Bankkonten bei der Volksbank, und die von der Fiducia generierten elektronischen Kontoauszüge (PDF-Dateien) waren unter Linux (Debian+Ubuntu) absolut unleserlich:
Das ist 2013 schon anderen Leuten aufgefallen. 2021 war es aber immer noch so, und ich wollte das Problem endgültig lösen.
Fehlende Schriften
Unter Linux mit dem PDF-Anzeiger Evince und Atril kam es zu dem Problem - unter Android mit mupdf allerdings nicht. Das legte den Verdacht nah, daß es sich hier um einen Bug oder ein fehlendes Feature in der Software handelt.
Die Texte in den PDF-Dateien nutzen mehrere Schriftarten mit den Namen "RFont0" bis "RFont6", die allerdings nicht eingebettet sind. Einige davon sind "normale" Schriften und andere haben eine feste Breite - aber in jeder PDF-Datei ist das anders. In einer Datei ist RFont1 die Festbreitenschriftart, in der nächsten ist es RFont2. Eine feste Schriftkonfiguration ist deshalb nicht möglich.
Warum funktioniert es aber mit anderen PDF-Anzeigeprogrammen?
PDF-Details
Ich habe mir eine Kontoauszugsdatei mal mit qpdf -decrypt -qdf 2021-90003.pdf -|less genauer angeschaut:
> endobj]]>
Das ist die Schriftdefinition für einen Text, der mit fester Schriftbreite
dargestellt werden sollte.
Die
PDF-Spezifikation 1.7
listet in Abschnitt 9.8.2 Font Descriptor Flags
die Table 123 – Font flags
auf.
Das erste Bit ist FixedPitch
.
Wenn es gesetzt ist, dann hat die Schriftart eine feste Breite.
Hier bei /Flags 33 ist das erste Bit gesetzt. Das bedeutet, daß der PDF-Anzeiger auch bei einer nicht vorhandenen Schriftart wie RFont0 eine monospace-Ersatzschriftart nutzen könnte - es aber nicht tut.
Poppler
Sowohl Evince als auch Atril nutzen die Bibliothek Poppler zur Darstellung. Ich vermutete, daß dort das Problem liegen würde.
poppler stellt das Kommandozeilenprogramm pdffonts bereit, mit dem man sehen kann, welche Schriften im PDF gefordert, und vor allem welche dann wirklich auf dem System genutzt werden:
$ pdffonts -subst 2021-90003.pdf name object ID substitute font substitute font file ------------ --------- ----------------- ------------------------------------ RFont0 12 0 DejaVu Sans /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf RFont1 13 0 DejaVu Sans /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf RFont2,Bold 14 0 DejaVu Sans Bold /usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf RFont3 15 0 DejaVu Sans /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf RFont4 19 0 DejaVu Sans /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf
Hier wird für RFont0 also eine nicht-festbreitenschrift genutzt.
Die Auswahl der Schriftarten wird unter Linux generell von fontconfig gemacht. Ein Programm fragt fontconfig nach einer Schrift ("Comic Sans"), oder sagt grob was es haben möchte ("fette Serifenschrift mit kyrillischen Buchstaben"), und fontconfig gibt die passende Schriftart zurück.
poppler fragt also nicht nach einer Monospace-Font, sondern nach einer normalen - obwohl die Unterstützung für das fixed-width-Flag schon 2012 eingebaut wurde.
Ich habe also einen Bug aufgemacht und 5 Stunden später war er behoben!
poppler Version 21.11.0 hat damit keinen Fehler mehr, allerdings kam jetzt ein zweiter zum Vorschein.
fontconfig
poppler fragt fontconfig nach der Schrift RFont0 und weist gleich mit darauf hin, daß es eine Festbreitenschrift ist. fontconfig ignoriert den Hinweis aber und gibt die Standardschrift zurück:
$ fc-match RFont3:spacing=mono DejaVuSans.ttf: "DejaVu Sans" "Book"
Glücklicherweise kann man das konfigurieren:
<?xml version='1.0'?> <!DOCTYPE fontconfig SYSTEM 'fonts.dtd'> <fontconfig> <match target="pattern"> <test name="spacing"> <int>100</int> </test> <edit name="family" mode="prepend"> <string>monospace</string> </edit> </match> </fontconfig>
Ein Leser schrieb, daß er den Dateinamen auf 01-cweiske-monospace.conf ändern musste, damit das ganze funktioniert.
Jetzt noch den Cache aktualisieren und es kommt die richtige Schrift zurück:
$ fc-cache -f -v $ fc-match RFont3:spacing=mono VeraMono.ttf: "Bitstream Vera Sans Mono" "Roman"
Ich hatte mehrere Male auf der Mailingliste nach diesem Problem gefragt, wurde aber größtenteils ignoriert. Deshalb öffnete ich einen Fehlerreport und es stellte sich heraus, daß genau dieses Problem schon vor einem halben Jahr mit Version 2.13.95 gelöst worden war.
Ende gut, alles gut
Mit poppler 21.11.0 und fontconfig 2.13.95 werden die Kontoauszüge endlich korrekt angezeigt.
In Debian ist poppler 21.11.0 aktuell nur in der "experimental"-Distribution, bei Ubuntu in "jammy" (22.04 LTS).
fontconfig 2.13.95 ist aktuell weder in Debian experimental noch Ubuntu 22.04 (jammy) zu finden. Da bleibt nur das manuelle Anlegen der Konfigurationsdatei.