Vor ein paar Tagen wollte ich mal wieder meinen Lebenslauf auf den neusten Stand bringen (dieser ist übrigens mittlerweile online auf meinem Xing-Profil im Portfolio für Kontakte und Headhunter sichtbar). Am besten aktualisiert man den ja einmal pro Jahr um z.B. so etwas wie Projekte und Aufgaben zu aktualisieren. Ich habe mich nicht an diese Weisheit gehalten und das docx, dass meinen bisherigen tabellarischen Lebenslauf enthielt, zuletzt 2016 angepasst. Damals, als ich noch original Microsoft Office nutzte, sah es ok aus. Aber mittlerweile, mit einem der vielen anderen Office Varianten unter Linux, furchtbar. Die Tabellen sahen nicht mal mehr Ansatzweise so hübsch aus und editieren hat vieles verrückt.
Und da kam mir die Idee: Warum das ganze nicht in Markdown neu schreiben und aus dem Markdown Dokument ein pdf erzeugen? Da ich meine bisherigen Notizen schon in Markdown verfasse, war es nichts neues für mich. Ausserdem war ich einfach neugierig, ob ich einen hübschen Lebenslauf in Markdown erstellen kann.
Markdown Converter
Aber welches Programm zum konvertieren nutzen? Ein bisschen Recherche brachte mich zu pandoc. Pandoc hat seinen eigenen Markdown Dialekt, lässt sich per Extensions erweitern und kann das Markdown Dokument in alle möglichen Formate, unter anderem Text, HTML und PDF, umwandeln. Problem: Das PDF Dokument lässt sich nur mit Latex hübsch gestalten.
Da meine Latexkenntnisse eher nicht existent sind, ich aber halbwegs CSS kann, wollte ich ein hübsches HTML erstellen und das HTML in ein PDF Dokument umwandeln. Glücklicherweise gibt es dafür wkhtmltopdf. Es kann sogar aus den HTML Überschriften ein Inhaltsverzeichnis erstellen und Seitenzahlen hinzufügen. Als Basis für das HTML Styling habe ich das CSS von Christophe-Marie Duquesne genommen.
Tips
Im folgenden werde ich nicht auf Markdown selber eingehen, dazu gibt es mehr als genug Artikel, sondern welche Anpassungen und "Tricks" ich gemacht habe, um meinen Lebenslauf mit pandoc und wkhtmltopdf zu erstellen. Am Ende steht auch der Link zu einem Github Beispielrepository, der den gesamten Code und einen Beispiellebenslauf als HTML, PDF und TXT enthält.
Makefile
Erst mal das wichtigste: Die Automatisierung per Makefile. Da ich mir die Befehle nicht merken kann, liegt im Repository ein Makefile, dass mir ein HTML und TXT Dokument erstellt und das HTML in PDF umwandelt. Zusätzlich werden im PDF Seitenzahlen hinzugefügt und der Abstand Rechts und Oben im PDF definiert. Ohne diese Abstände wäre der Seitenanfang nach z.B. einem Pake Break direkt am obigen Rand der Seite und die Seitenzahlen nicht zu sehen.
.POSIX:
CSS ?= style.css
PDFLAGS = --section-divs --css $(CSS) --standalone --from markdown+yaml_metadata_block+link_attributes+definition_lists --to html5
WKFLAGS = -B 4mm -T 10mm -L 0mm -R 4mm -q -s Letter --footer-right "[page]/[toPage]" --footer-font-size 6
.PHONY: all
all: Lebenslauf.html Lebenslauf.pdf Lebenslauf.txt
Lebenslauf.html: Lebenslauf.md Lebenslauf.md style.css
pandoc $(PDFLAGS) -o Lebenslauf.html -s Lebenslauf.md
Lebenslauf.pdf: Lebenslauf.html Lebenslauf.md style.css
wkhtmltopdf $(WKFLAGS) Lebenslauf.html Lebenslauf.pdf
Lebenslauf.txt: Lebenslauf.md
pandoc --standalone --from markdown+yaml_metadata_block+smart+link_attributes --to plain -o Lebenslauf.txt -s Lebenslauf.md
.PHONY: clean
clean:
rm -f *.html *.pdf *.docx *.txt
wkhtmltopdf-static
Arch Linux bietet zwei wkhtmltopdf Pakete an: wkhtmltopdf und wkhtmltopdf-static.
Static hat zusätzliche Patches die es unter anderem erfordern, mehr per CSS zu definieren um zu garantieren, dass der Output auf jedem System gleich aussieht. Das nicht Static Paket scheint da weniger genau zu sein und Fallbacks zu verwenden wenn etwas nicht definiert ist. Dafür ist der Output aber auch nicht garantiert gleich.
Die @font-face Definitionen im CSS sind z.B. deswegen entstanden. Ohne diese war schon der Output zwischen beiden wkhtmltopdf Varianten auf dem selben System unterschiedlich.
Ausserdem bietet es zusätzliche Parameter auf der Kommandozeile um z.B. Seitenzahlen zu setzen oder den Abstand zu den Seitenrändern einzustellen.
@font-face {
font-family: DejaSans;
src: url('file:///usr/share/fonts/TTF/DejaVuSans.ttf');
}
@font-face {
font-family: DejaSans;
src: url('file:///usr/share/fonts/TTF/DejaVuSans-Bold.ttf');
font-weight: bold;
}
body {
font-family: 'DejaSans', 'sans-serif';
}
Meta Tags
Mit der pandoc Markdown Extension yaml_metadata_block können am Anfang des Markdown Dokuments Meta Tags hinzugefügt werden. Ich nutze es für die Tags title, author und date. Diese Attribute werden an passender Stelle im PDF und HTML hinzugefügt, z.B. als H1 oder Seitentitel.
---
title: Lebenslauf
author: Michael
date: 2020-03-27
---
Das Standard Pandoc HTML Template fügt die Attribute aber auch im Body unter die H1 Überschrift hinzu. Für die Stelle habe ich keine vernünftige Verwendung gefunden. Und um nicht ein eigenes Pandoc HTML Template pflegen zu müssen, dass diese Attribute an der Stelle nicht einfügt, habe ich sie einfach per CSS ausgeblendet.
/* Ugly workaround: Hide date and author attributes */
.date {
display: none;
}
.author {
display: none;
}
Bewerbungsfoto
Ohne jegliche Anpassung wird mein Passfoto in einer eigenen Zeile dargestellt, ohne sonstigen Inhalt Links und Rechts. Das sieht für mich nicht hübsch aus. Also auch hier: CSS to the rescue! Damit pandoc CSS bei Bildern verarbeiten kann, wird die Extension link_attributes benötigt. Mit folgendem Beispiel wird eine CSS Class dem Bild hinzugefügt die dafür sorgt, dass es als floating Element rechts dargestellt.
Markdown:
![](media/image1.jpeg "Avatar"){#id .callout}
CSS:
/* Place avatar image on the right side */
.callout {
float: right;
width: 230px;
}
Page Break für PDF
Mein Lebenslauf umfasst zwei Seiten und ohne definierten Page Break erstellt wkhtmltopdf einfach an der erstbesten Stelle einen. Der war bei meinem Lebenslauf natürlich nicht an der richtigen Stelle sondern mittendrin. Um wkhtmltopdf einen Page Break an einer Stelle vorzugeben, kann im Markdown Dokument eine HTML Zeile hinzugefügt werden die beim Unwandeln nach HTML übernommen wird.
<div style="page-break-before: always;"></div>
Fazit
Um den Lebenslauf so hinzubekommen habe ich einige Abende dran gearbeitet. Mein Makefile, wie auch das Markdown Dokument und CSS, sah zwischendurch sehr wild aus weil ich sehr viel ausprobiert habe um auf den jetzigen Stand zu kommen. Und ich muss sagen: Es gefällt mir sehr gut. Das Ergebnis, ohne Inhalt aber mit Beispieldokumenten, habe ich in einem Github Repository veröffentlicht. Achtet beim Editieren auf die Formatierung. Manche Leerzeichen an z.B. Zeilenenden sind Absicht um Zeilenumbrüche einzufügen.