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 |

Docker Image für die Entwicklung

Für alle, die schon mal am speedata Publisher etwas ändern wollten, sich aber nicht die ganzen Abhängigkeiten für die Entwicklung installieren möchten, gibt es nun eine gute Nachricht. Ab sofort steht unter https://hub.docker.com/r/speedata/development ein Docker Image zur Verfügung, das alle Programme schon installiert hat. Das Repository von Github selbst ist nicht Teil des Images, aber einfach hinzuzufügen.

von Patrick Gundlach |

Yeoman Generator

Manchmal möchte man schnell eine minimale Layout-Datei haben, um einfache Experimente mit dem speedata Publisher durchzuführen. In der Regel nehme ich das »Hallo Welt« Beispiel aus dem Handbuch und ändere dann das Layout, soweit ich das benötige.

Ab sofort gibt es auch ein Yeoman-Generator, der das »Hallo Welt« Beispiel erzeugt, ohne dass man selber etwas kopieren muss. Yeoman basiert auf npm und erfreut sich immer größerer Beliebtheit. Wenn npm installiert ist, sind es nur noch wenige Schritte bis zum fertigen Minimalbeispiel:

von Patrick Gundlach |

Fallback für Schriftarten

In der neusten Version des Publishers ist es nun möglich, Ersatzschriftarten anzugeben, wenn Zeichen aus einer Schriftart nicht gefunden werden. Z.B. hat die mit dem speedata Publisher mitgelieferte TeX Gyre Heros keine Zeichen für Griechisch, Arabisch oder ähnliches im Zeichensatz. Oder viele CJK (Chinesisch, Japanisch, Koreanisch) Schriftarten haben nur rudimentäre Unterstützung für lateinische Sprachen.

Die Syntax erklärt vielleicht etwas schneller, worum es geht:

<LoadFontfile name="zh" filename="Microsoft JhengHei.ttf">
  <Fallback filename="texgyreheros-regular.otf" />
</LoadFontfile>
von Patrick Gundlach |

Harfbuzz & arabischer Textsatz mit LuaTeX

Immer wieder wünschen sich Anwender des speedata Publishers Textsatz in anderen Schriftsystemen, z.B. das Arabische.

Textsatz im Arabischen

Doch was ist so besonders im arabischen Textsatz? Die Seiten Text Layout Requirements for the Arabic Script vom W3C und Arabic script summary von Richard Ishida gehen sehr ausführlich auf die Thematik ein. Ich erlaube mir ein paar Bilder daraus zu »klauen«.

Einige Punkte:

  1. Die Sprache läuft von rechts nach links und fängt am rechten Seitenrand an. Abgekürzt wird dies oft mit RTL im Gegensatz zu den westlichen Sprachen mit LTR. Gibt es Blocksatz im Arabischen? Was ist mit Silbentrennung?
von Patrick Gundlach |