Volksbank-Kontoauszug unter Linux

Ich habe Bankkonten bei der Volksbank, und die von der Fiducia generierten elektronischen Kontoauszüge (PDF-Dateien) waren unter Linux (Debian+Ubuntu) absolut unleserlich:

Screenshot von Kontoauszug in Atril mit kaputter Schrift

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:

/etc/fonts/conf.d/99-cweiske-monospace.conf
<?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>

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.

Alles ganz.

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.

Written by Christian Weiske.

Comments? Please send an e-mail.