headerbild blog

Entwicklungen der letzten Wochen

Auch, wenn es hier im Blog etwas ruhiger war die letzten Wochen, gibt es »unter der Haube« einige Entwicklungen. Hauptsächlich betreffen diese Änderungen das Handbuch.

Übersetzung des Handbuchs

Das Handbuch wird derzeit ins Englische übersetzt. Da eine manuelle Übersetzung immer Zeit in Anspruch nimmt, habe ich alle Seiten aus dem deutschen Handbuch vorab durch eine automatische Übersetzung laufen lassen, damit überhaupt Inhalte zur Verfügung stehen.

altes und neues Handbuch

Das alte Handbuch (links), das neue Handbuch (rechts). Nun entspricht das englische Handbuch demselben Stand wie das deutsche.

Neben der Übersetzung des Handbuchs gibt es auch ein paar neue Kapitel.

von Patrick Gundlach |

Print CSS mit speedata

Schon lange kann der speedata Publisher mit HTML in den Daten umgehen. Bisher war das nur für wenige Elemente möglich (z.B. b/u/em/ul/li/table) und auch die Gestaltungsmöglichkeiten mit CSS waren eingeschränkt. In der aktuellen Entwicklungsversion (3.9.x) wird ein ganz neuer und robuster HTML Parser benutzt, der auch die CSS Fähigkeiten stark erweitert.

Die Idee ist, dass sich die Ausgabe im Browser und die Ausgabe im PDF soweit wie möglich gleichen.

Vergleich HTML und PDF

Dasselbe (HTML) Dokument im Browser (links) und als PDF (rechts). Noch gibt es Unterschiede bei den Abständen, aber es sollte klar werden, wo die Reise hingeht.

von Patrick Gundlach |

Neue Option --suppressinfo

Es gibt ab Version 3.9.3 einen neuen Kommandozeilenparameter --suppressinfo, um die Datumsangaben aus dem PDF zu löschen und die zufällige Dokumenten ID durch eine feste zu ersetzen.

Normalerweise werden in dem Info-Dictionary Angaben zur Software und zum Dokument gemacht, z.B.

2 0 obj
<<
  /CreationDate (D:20200128205428+01'00')
  /Creator (speedata Publisher 3.9.2, www.speedata.de)
  /ModDate (D:20200128205428+01'00')
  /Producer (LuaTeX 111 - 7235)
  /Trapped /False
>>
endobj

Die Einträge CreationDate und ModDate beinhalten das Datum der Dokumenterzeugung. Manchmal möchte man das aber nicht im PDF haben.

Ebenso ist am Ende der PDF Datei (Trailer) die Dokumenten ID zu finden, die meist zufällig generiert wird:

trailer <<
  /Info 2 0 R
  /Root 1 0 R
  /Size 20
  /ID [<68365150b6c3965d17fe7bf2a16f4a4b><68365150b6c3965d17fe7bf2a16f4a4b>]
>>
von Patrick Gundlach |

Neue Version 3.8

Vor ein paar Tagen habe ich die Version 3.8 veröffentlicht. Zur Erinnerung: die Versionen mit einer geraden Zahl an der zweiten Stelle, sind die »stabilen« Versionen, d.h. vor dem Erscheinen gibt es eine längere Zeit ohne neue Features, in denen ich Fehlerberichte sammle. Erst, wenn es eine Zeit lang keine Fehlerberichte gibt, wird eine stabile Version veröffentlicht.

Änderungen

Die letzte stabile Version ist die 3.6 vom Februar letzten Jahres. Es hat sich natürlich einiges getan. Der Schwerpunkt liegt immer darauf, neue Features so einzubauen, dass alle alten Dokumente ohne Änderungen immer gleich erzeugt werden.

Neben vielen Fehlerkorrekturen gibt es folgende neuen Punkte bzw. sichtbare Änderungen gegenüber der Version 3.6:

von Patrick Gundlach |

Online Publishing

Ab sofort gibt es die Möglichkeit, den speedata Publisher online zu nutzen. Dafür ist keine Installation der Software nötig, alles wird über das Internet gesteuert.

Die Übertragung der Dokumente funktioniert über eine verschlüsselte HTTP REST Schnittstelle, und ist damit unabhängig von der zugrundeliegenden Plattform und sicher zu benutzen. Diese Art der Kommunikation ist seit Jahren Standard beim »cloud computing« und damit für Entwickler kein Neuland.

Die API wurde ganz bewusst einfach gehalten, so dass die PDF-Erzeugung leicht in bestehende Systeme zu integrieren ist. Die Kommunikation läuft über JSON und ist unter api.speedata.de beschrieben.

von Patrick Gundlach |

XMLPrague 2020

Zum vierten Mal in Folge sponsert die speedata GmbH die jährliche XML Konferenz in Prag.

Als Basis für den Datenaustausch als auch für die Programmiersprache hat XML für speedata eine herausragende Bedeutung. Eine Unsterstützung der Konferenz bedeutet natürlich, dass wir auch von Weiterentwicklungen profitieren.

Aber am fruchtbarsten ist es, die Entwickler vor Ort zu treffen und zu fachsimpeln. Dadurch kann man über den Tellerrand hinausblicken und viele neue Impulse bekommen.

Falls zufällig speedata Benutzer vor Ort sein werden, freue ich mich natürlich auch über eine Nachricht!

von Patrick Gundlach |

Finalizer Callback Und HTTP-Modul im Lua-Filter

Zwei Neuerungen gibt es in Version 3.7.18 im Lua-Filter. Zur Erinnerung, man kann vor der eigentlichen Datenverarbeitung ein Lua-Skript starten, das alle notwendigen Dinge erledigen kann, die für die eigentliche Datenverarbeitung vonöten ist. Man kann z.B.

  • Excel-Tabellen in XML umwandeln
  • CSV-Dateien einlesen
  • XML per XSLT transformieren
  • Dateien kopieren

und so weiter.

Ab sofort können auch HTTP-Aufrufe getätigt werden. Und es gibt einen Callback, der beim Ende des Durchlaufs aufgerufen wird, also nach Erzeugung des PDFs und direkt bevor die Datei publisher.finished erstellt wird.

In seiner minimalen Form wird die Funktion so benutzt:

runtime = require("runtime")

-- wird aufgerufen, wenn PDF Datei erzeugt wird
-- (durch den runtime.finalizer callback unten)
function finished()
    print("Die PDF-Datei wurde geschrieben")
end

runtime.finalizer = finished

Zusammen mit dem HTTP-Modul kann man folgendes machen:

runtime = require("runtime")
http = require("http")


-- wird aufgerufen, wenn PDF Datei erzeugt wird
-- (durch den runtime.finalizer callback unten)
function finished()
    tbl, msg = http.get("https://example.com/pdf/is/finished/")
    if tbl == nil then
        print(msg)
        os.exit(1)
    end
end

runtime.finalizer = finished

Hier wird eine URL aufgerufen, wenn die PDF-Datei erstellt ist. Damit kann man z.B. bei einem Dienst »Bescheid geben«, wenn ein PDF zur Verfügung steht.

von Patrick Gundlach |

Inhaltsverzeichnis in einem Durchlauf erstellen

Oft genug hat man Dokumente mit einem Inhaltsverzeichnis, das irgendwo am Anfang des Dokuments stehen soll. Der normale Weg beim speedata Publisher ist es, die Daten für das Inhaltsverzeichnis während eines Durchlaufs zu sammeln (welche Abschnitte gibt es? auf welcher Seite fangen diese an?). Im nächsten Durchlauf werden diese Daten dann benutzt, um das Inhaltsverzeichnis zu erstellen. Diese Methode war bisher notwendig, weil diese Informationen benötigt werden, bevor sie zur Verfügung stehen.

Nun hat PDF aber eine ganz nette Eigenschaft: man kann die Seiten in einer beliebigen Reihenfolge anzeigen lassen.

Der Seitenbaum in einer PDF-Datei besteht im einfachsten Fall aus einer Liste der vorhandenen Seiten.

von Patrick Gundlach |

Steuerung des Layouts

Wenn man von der Kommandozeile das Verhalten des Layout steuern möchte, gibt es ab sofort (Version 3.7.12) einen neuen Mechanismus.

Anwendungsfall ist z.B. ein Layout, das sowohl für die Druckausgabe (mit Beschnittzugabe und Beschnittmarken) als auch für die »online« Version (ggf. mit Bildern in geringerer Auflösung) vorbereitet wird und auf der Kommandozeile dann umgeschaltet wird.

Beispiel

Im Layout der Modus print abgefragt:

<Switch>
  <Case test="sd:mode('print')">
    <Options bleed="3mm" cutmarks="yes"/>
  </Case>
  <Otherwise>
    <Options bleed="0mm" cutmarks="no"/>
  </Otherwise>
</Switch>
von Patrick Gundlach |

XSD Schema

Die speedata Layout-Regelwerke werden ja in XML formuliert. Um die Bearbeitung zu erleichtern, gibt es seit jeher ein RELAX NG Schema zum speedata Publisher. Damit können die spezialisierten XML-Editoren wie z.B. oXygen oder auch normale Editoren wie Atom oder jEdit prüfen, ob die Syntax des Layoutregelwerks korrekt ist und Vorschläge machen, welche Elemente oder Attribute an einer bestimmten Position vorkommen dürfen.

Ab sofort wird auch ein XML Schema (XSD) im Verzeichnis schema mitgeliefert, so dass auch Editoren Unterstützung bieten, die mit RELAX NG nichts anfangen können.

von Patrick Gundlach |