staging.inyokaproject.org

Dokumente mit variablen Inhalt via Bash

Status: Ungelöst | Ubuntu-Version: Ubuntu GNOME 14.04 (Trusty Tahr)
Antworten |

Arkved

Anmeldungsdatum:
14. Oktober 2013

Beiträge: Zähle...

Guten Abend,

ich bin gerade dabei ein kleines Bash Script zu schreiben, welches automatisiert nach read Eingaben Dokumente erstellen soll, welche anschließend vernünftig dargestellt via Druckvorschau werden sollen.

Das Problem ist nun Folgendes: Wie bekomme ich es Via Bash hin, dass alle variablen Textblöcke an dem Ort und in der Schriftformatierung sind, wo sie hingehören?

Das Dokument soll immer das gleiche Layout haben, jedoch sind die Inhalte großteils Variablen. Da ich mit einem HTML Dokument als Output am besten angeben konnte, wo was hingehört, hatte ich es mit HTML versucht, doch leider scheint das nicht so ganz zu klappen, da die Druckvorschau des HTML Dokumentes per Firefox anders dargestellt wird, als die Seite an sich, die HTML Datei mittels htmldoc in .pdf zu konvertieren verschiebt alles komplett.

Das Endprodukt soll pro Dokument jeweils eine DIN-A4 Seite ausgeben, welche ich drucken könnte, am liebsten .pdf, hat irgendjemand Ideen wie ich das bewerkstelligen könnte?

MfG

mrkramps Team-Icon

Avatar von mrkramps

Anmeldungsdatum:
10. Oktober 2006

Beiträge: 5523

Eine Auszeichnungssprache wie HTML zu verwenden ist schon der richtige Ansatz. Allerdings eignet sich HTML nur sehr bedingt für die Ausgabe von Printmedien. Entweder man tut sich gleich LateX oder XeTeX an, die aber mit der Installation von TeX Live gut ein Gigabyte zusätzlichen Speicherplatz benötigen.

Oder man nimmt etwas leichteres wie bspw. rst2pdf 🇬🇧. Das verwendet als Auszeichnungsprache reStructuredText (mit einigen Erweiterungen) und erzeugt über ReportLab druckfertige PDFs. Das notwendige Paket rst2pdf (universe) kann aus den offiziellen Paketquellen installiert werden.

Nachtrag: reST verwendet zum Teil Syntaxelemente, deren Zeichenlänge abhängig von der Zeichenlänge der Eingabe sind (bspw. bei Überschriften oder Tabellen). Diese bedingten Formatierungen machen es etwas schwieriger das in einem Bash-Skript zu verwenden. Andere Auszeichnungsprachen - ich erlaube mir die Links jetzt mal nicht alle rauszusuchen - wie Markdown, Textile, AsciiDoc(tor), txt2tags gehen für die PDF-Erzeugung leider immer einen Umweg über LaTeX oder einen noch weiteren Weg. Da man aber aus allen HTML rauskriegt, könnte man noch wkhtmlpdf (universe) 🇬🇧 damit ausprobieren, das eigentlich ganz gute Ergebnisse erzielen soll.

Oder man nimmt sich irgendeine Auszeichnungssprache, die von Pandoc als Eingabeformat unterstützt wird und konvertiert die in das OpenDocument-Text-Format (*.odt, LibreOffice). Für PDF bräuchte Pandoc auch wieder LaTeX.

Nachtrag Zwei: Ging mir jetzt nicht aus dem Kopf mit der bedingten Formatierung für reST im Skript. Ist ansich auch ganz einfach die richtigen Zeichenlängen auszugeben, wenn man mit sed einfach alle Zeichen durch das syntaxrelevante ersetzt:

1
2
3
4
5
$ titel="Das ist ein Titel"
$ echo "$titel" | sed 's/./=/g' ; echo "$titel" ; echo "$titel" | sed 's/./=/g'
=================
Das ist ein Titel
=================

Da man das für Titel und Überschriften bräuchte könnte man das bspw. mit einer Funktion samt Parameterübergabe umsetzen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/usr/bin/env bash
titel="Das ist der Titel"
untertitel="Das ist der Untertitel"
ueberschrift1="Überschrift Ebene 1"
ueberschrift2="Überschrift Ebene 2"

linie () {
    echo "$1" | sed "s/./"$2"/g"
}

linie "$titel" "=" ; echo "$titel" ; linie "$titel" "=" ; echo
linie "$untertitel" "-" ; echo "$untertitel" ; linie "$untertitel" "-" ; echo
echo "$ueberschrift1" ; linie "$ueberschrift1" "+" ; echo
echo "$ueberschrift2" ; linie "$ueberschrift2" "~" ; echo
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$ ./skript
=================
Das ist der Titel
=================

----------------------
Das ist der Untertitel
----------------------

Überschrift Ebene 1
+++++++++++++++++++

Überschrift Ebene 2
~~~~~~~~~~~~~~~~~~~

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Ich nutze dafür pandoc. Das ist ein mächtiges Tool, was alle möglichen Arten von Markus konvertieren kann. Für PDFs braucht man noch pdflatex:

$ apt-get install pandoc texlive
$ pandoc input.txt -o output.pdf

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

Ich denke auch, PDF zu generieren wäre die beste Lösung.

Man kann aber z.B. auch HTML in der Shell direkt mit einem HERE-Doc und Shell-Variablen generieren:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ title='Dies ist der Titel'
$ cat <<DOC
> <html>
> <body>
> <h1>$title</h1>
> </body>
> </html>
> DOC
<html>
<body>
<h1>Dies ist der Titel</h1>
</body>
</html>

Nur mal so... 😉

Arkved

(Themenstarter)

Anmeldungsdatum:
14. Oktober 2013

Beiträge: 13

Danke schonmal für die hilfreichen Antworten, bisher ging jede Antwort in die richtige Richtung und jede hat ihren Vorteil. Das mit dem reST und auch das mit dem LateX ist für mich leider eher nicht die richtige Lösung, so plausibel die Lösungswege auch sind, habe ich leider nicht wirklich die Zeit mich in mir neue Auszeichnungssprachen einzuarbeiten... Wobei wkhtmltopdf nach einigen HTML Anpassungen sehr gute Ergebnisse erzielt! (Wahrscheinlich auf Grund der Interpretierung durch Webkit..)

Der Tipp aus dem Zitat klingt sehr gut und für mich einfach umzusetzen, eventuell werde ich das auch noch mal versuchen, insbesondere weil es den Anschein hat, als wäre das weniger Codegeschnipsel als bei meiner derzeitigen unfertigen Lösung.

rklm schrieb:

Ich denke auch, PDF zu generieren wäre die beste Lösung.

Man kann aber z.B. auch HTML in der Shell direkt mit einem HERE-Doc und Shell-Variablen generieren:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ title='Dies ist der Titel'
$ cat <<DOC
> <html>
> <body>
> <h1>$title</h1>
> </body>
> </html>
> DOC
<html>
<body>
<h1>Dies ist der Titel</h1>
</body>
</html>

Nur mal so... 😉

Ich habe es nun folgendermaßen (fast) gelöst:

1
2
3
4
5
6
7
8
9
cp "$HOME/xxxx/xxxxx/rechnung-muster.html" "rghtml.tmp" 

if ["$mobil" -eq ""]
			then 
				sed s/"Mobil:"/""/g rghtml.tmp
			
			else
				sed "s/Mobil:/Mobil: $mobil <\/br>/g" rghtml.tmp
		fi

Wobei sich hierbei mir noch ein Problem in den Weg stellt, ich möchte anhand der "rechnung-muster.html" über den Umweg der "rghtml.tmp" Werte im Dokument verändern, und nach der Änderung in eine Datei ausgeben, und nicht in den "stdout"(?), habe viel recherchiert, aber keine angebliche Lösung für die Umleitung der sed Ausgabe in eine Datei hat bislang funktioniert, nichteinmal mittels copy & paste... Versucht habe ich bereits Folgende Codezeilen:

1
2
3
4
5
6
7
sed "s/Mobil:/Mobil: $mobil <\/br>/g" -i rghtml.tmp

sed "s/Mobil:/Mobil: $mobil <\/br>/g" rghtml.tmp > rghtml.tmp

sed "s/Mobil:/Mobil: $mobil <\/br>/g" rghtml.tmp > rghtml2.tmp

cat "rghtml.tmp" | sed "s/Mobil:/Mobil: $mobil <\/br>/g" > "neuedatei.tmp"

Jegliche Spielereien mit " und ' sowie \ habe ich bereits ausprobiert, ich bekomme die Ausgabe einfach nicht umgelenkt! (Bin im Umgang mit sed leider sehr unerfahren...)

Tipps hierzu würden mir sehr helfen, wobei ich heute abend definitiv nochmal den Ansatz von rklm ausprobieren werde!

Danke für bisherige Tipps und weitere Antworten!

MfG

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 10978

Bist du sicher, dass da nicht einfach dein Test, ob die Variable $mobil leer ist, fehltschlägt? -eq ist für numerische Vergleiche, wenn du auf einen leeren String prüfen willst, nimm einfach -z (vgl. http://tldp.org/LDP/abs/html/comparison-ops.html):

1
if [ -z "$mobil" ]
Antworten |