GraphViz ist ein tolles Tool zum Erstellen von Grafiken. Allerdings hatte ich das Problem, ausgegebene PostScript-Graphen korrekt in PDF umzuwandeln. Hintergrund war der, dass GraphViz offenbar die BoundingBox nicht richtig setzte. Mit Hilfe eines kleinen Perl-Programms habe ich dieses Problem behoben.

Problemstellung

Ich weiß nicht, ob das auf allen Maschinen ein Problem ist, aber ich habe es unter Ubuntu 8.04 (Hardy) getestet und reproduzieren können…

Dazu habe ich ein Beispiel von der GraphViz-Seite heruntergeladen:

Nun kann man eine PS-Datei erstellen:

Ruft man diese z.B. mit evince oder ghostview auf, erscheint die Darstellung korrekt – sehr schön!

Will man nun die Datei in PDF umwandeln, geht der einfachste Weg über ps2eps – vor allem weil man hier normalerweise BoundingBoxen erhält. Das ist z.B. dann sinnvoll, wenn man das resultierende PDF in eine LaTeX-Datei mit pdflatex einbinden will. Mit Hilfe von pstopdf wird das Resultat leider in eine Seite im DIN oder Letter-Format gesetzt. Das ist nicht das, was man will…

Die folgende Befehlsfolge würde die gesamte Erstellerung normalerweise übernehmen:

Doch oh weh! Das PDF wirkt (zumindest bei mir) abgeschnitten! Eine Inspektion der PS-Datei ergibt, dass die BoundingBox auf “(atend)” gesetzt ist. ps2eps berechnet die Box, setzt sie jedoch zu klein! Offenbar ein Fehler! Folgendes Ergebnis zeigt die Problematik auf:

An erster Stelle kommt die BoundingBox und die HiResBoundingBox, die wir jedoch ignorieren… Interessanter ist die PageBoundingBox, die etwas größer geraten ist, also die BoundingBox selbt. Hier liegt eine Lösung!

Lösung

Mit Hilfe eines kleinen Perl-Programmes kann man die Ausgabe verbessern. Das Programm ist weder besonders elegant noch besonders schnell, aber es erfüllt seinen Zweck – elegantere Lösungsansätze werde ich gerne hier aufnehmen!

Das Programm erwartet eine EPS/PS-Datei von STDIN und speichert diese in einem Array, während es nach der PageBoundingBox sucht. In einer zweiten Schleife wird die Datei auf STDOUT ausgegeben, die Zeile BoundingBox jedoch mit korrekten Werten besetzt.

Man erstelle die Datei mit dem Namen correctBB.pl und mache sie per chmod +x rightBB.pl ausführbar. Nun kann man diese als Pipe in die obige Befehlsfolge einbauen:

So, jetzt klappt auch die Umwandlung ins PDF und die Grenzen der Datei sind korrekt gesetzt! Das Ganze funktioniert natürlich auch mit neato, circo und co.