Handbuch durchsuchen:

- Startseite
- Einleitung
- Hallo Welt!
- Grundlagen
  - Erstellen eines Layoutregelwerks
  - Aufbau der Datendatei und des Layoutregelwerks
  - Objekte ausgeben
  - Raster
  - Bereiche auf der Seite (PositioningArea)
  - Dateiorganisation
  - Silbentrennung / Spracheinstellungen
  - Einbinden von Schriftarten
  - Textformate
  - Textformatierung
  - Farben
- Programmierung
- Bilder einbinden
- Tabellen
- Fortgeschrittene Themen
  - Lesezeichen (Bookmarks)
  - Erzeugen von XML-Strukturen
  - Druckausgabe / Schnittmarken
  - CSS
  - Gruppen (virtuelle Objekte)
  - Virtuelle Seiten
  - Rotieren von Inhalten
  - Sortieren von Daten
  - Umfließen von Bildern
  - Seitentypen
  - Starten des Publishers über den Hotfolder
  - Lua-Filter / Datenvorverarbeitung
  - Schemavalidierung
  - Qualitätssicherung (PDF-Vergleich)
  - Fehlersuche / Debugging
  - Servermodus
- Kochbuch
  - Griffmarken
  - Mehrseitige PDF-Dateien einbinden
  - Layoutoptimierung mithilfe von Gruppen
  - Verzeichnisse erstellen
  - Seitenzahlen: Seite x von y
  - Aufzählungslisten nachahmen
- Installationsanleitung
- Voreinstellungen im speedata Publisher
- Starten des Publishers über die Kommandozeile
- Konfiguration des Publishers
- Längenangaben und Maßeinheiten
- XPath- und Layoutfunktionen
- Interne Variablen
- Liste der Änderungen
- Glossar
- Befehlsreferenz
  - A
  - Action
  - AddSearchpath
  - AtPageCreation
  - AtPageShipout
  - AttachFile
  - Attribute
  - B
  - Barcode
  - Bold
  - BoldItalic
  - Bookmark
  - Box
  - Br
  - Case
  - Circle
  - Color
  - Column
  - Columns
  - Compatibility
  - Contents
  - Copy-of
  - DefineColor
  - DefineFontalias
  - DefineFontfamily
  - DefineTextformat
  - Element
  - Fontface
  - ForAll
  - Frame
  - Grid
  - Group
  - Groupcontents
  - HSpace
  - Hyphenation
  - I
  - Image
  - Include
  - Initial
  - InsertPages
  - Italic
  - Layout
  - Li
  - LoadDataset
  - LoadFontfile
  - Loop
  - Makeindex
  - Margin
  - Mark
  - Message
  - NewPage
  - NextFrame
  - NextRow
  - NoBreak
  - Ol
  - Options
  - Otherwise
  - Output
  - Overlay
  - Pageformat
  - Pagetype
  - Paragraph
  - PDFOptions
  - PlaceObject
  - Position
  - PositioningArea
  - PositioningFrame
  - ProcessNode
  - Record
  - Regular
  - Rule
  - SaveDataset
  - SavePages
  - SetGrid
  - SetVariable
  - SortSequence
  - Stylesheet
  - Span
  - Sub
  - Sup
  - Switch
  - Table
  - Tablefoot
  - Tablehead
  - Tablerule
  - Td
  - Text
  - Textblock
  - Tr
  - Trace
  - Transformation
  - U
  - Ul
  - Until
  - URL
  - Value
  - VSpace
  - While

Version 3.2.0
Handbuch durchsuchen:

- Startseite
- Einleitung
- Hallo Welt!
- Grundlagen
  - Erstellen eines Layoutregelwerks
  - Aufbau der Datendatei und des Layoutregelwerks
  - Objekte ausgeben
  - Raster
  - Bereiche auf der Seite (PositioningArea)
  - Dateiorganisation
  - Silbentrennung / Spracheinstellungen
  - Einbinden von Schriftarten
  - Textformate
  - Textformatierung
  - Farben
- Programmierung
- Bilder einbinden
- Tabellen
- Fortgeschrittene Themen
  - Lesezeichen (Bookmarks)
  - Erzeugen von XML-Strukturen
  - Druckausgabe / Schnittmarken
  - CSS
  - Gruppen (virtuelle Objekte)
  - Virtuelle Seiten
  - Rotieren von Inhalten
  - Sortieren von Daten
  - Umfließen von Bildern
  - Seitentypen
  - Starten des Publishers über den Hotfolder
  - Lua-Filter / Datenvorverarbeitung
  - Schemavalidierung
  - Qualitätssicherung (PDF-Vergleich)
  - Fehlersuche / Debugging
  - Servermodus
- Kochbuch
  - Griffmarken
  - Mehrseitige PDF-Dateien einbinden
  - Layoutoptimierung mithilfe von Gruppen
  - Verzeichnisse erstellen
  - Seitenzahlen: Seite x von y
  - Aufzählungslisten nachahmen
- Installationsanleitung
- Voreinstellungen im speedata Publisher
- Starten des Publishers über die Kommandozeile
- Konfiguration des Publishers
- Längenangaben und Maßeinheiten
- XPath- und Layoutfunktionen
- Interne Variablen
- Liste der Änderungen
- Glossar
- Befehlsreferenz
  - A
  - Action
  - AddSearchpath
  - AtPageCreation
  - AtPageShipout
  - AttachFile
  - Attribute
  - B
  - Barcode
  - Bold
  - BoldItalic
  - Bookmark
  - Box
  - Br
  - Case
  - Circle
  - Color
  - Column
  - Columns
  - Compatibility
  - Contents
  - Copy-of
  - DefineColor
  - DefineFontalias
  - DefineFontfamily
  - DefineTextformat
  - Element
  - Fontface
  - ForAll
  - Frame
  - Grid
  - Group
  - Groupcontents
  - HSpace
  - Hyphenation
  - I
  - Image
  - Include
  - Initial
  - InsertPages
  - Italic
  - Layout
  - Li
  - LoadDataset
  - LoadFontfile
  - Loop
  - Makeindex
  - Margin
  - Mark
  - Message
  - NewPage
  - NextFrame
  - NextRow
  - NoBreak
  - Ol
  - Options
  - Otherwise
  - Output
  - Overlay
  - Pageformat
  - Pagetype
  - Paragraph
  - PDFOptions
  - PlaceObject
  - Position
  - PositioningArea
  - PositioningFrame
  - ProcessNode
  - Record
  - Regular
  - Rule
  - SaveDataset
  - SavePages
  - SetGrid
  - SetVariable
  - SortSequence
  - Stylesheet
  - Span
  - Sub
  - Sup
  - Switch
  - Table
  - Tablefoot
  - Tablehead
  - Tablerule
  - Td
  - Text
  - Textblock
  - Tr
  - Trace
  - Transformation
  - U
  - Ul
  - Until
  - URL
  - Value
  - VSpace
  - While

# Qualitätssicherung (PDF-Vergleich)

Um zu gewährleisten, dass neue Versionen des Publishers auch exakt dieselben Ergebnisse liefern wie vorhergehende, verfügt der Publisher über eine Funktionalität, mit der man unerwünschte Verhaltensänderungen erkennen kann.

Die Idee ist folgende: ausgehend von einer Layout-Datei und einem überprüften Ergebnis (Referenz-PDF) kann der Publisher kontrollieren, ob mit der aktuellen Version noch immer dasselbe Ergebnis erzielt wird. Dazu erstellt man eine Layoutdatei und Datendatei im XML Format, lässt eine PDF Datei daraus erzeugen und speichert diese unter dem Namen `reference.pdf` ab. Bei dem Aufruf von `sp compare <Verzeichnis>` wird nun der Publisher erneut aufgerufen und prüft visuell, Seite für Seite, ob die resultierende Datei mit der vorher angelegten PDF Datei `reference.pdf` übereinstimmt.

## Voraussetzungen für den Vergleich

Der Publisher sucht rekursiv ausgehend von dem angegebenen Verzeichnis nach Verzeichnissen, die eine Datei `layout.xml` oder eine Datei `publisher.cfg` enthalten. In diesem Verzeichnis wird dann ein Publisher-Durchlauf gestartet. Die Layoutdatei muss unter dem Namen `layout.xml`, die Daten-Datei unter dem Namen `data.xml` zu finden sein, falls das nicht in der (optionalen) Datei `publisher.cfg` anders konfiguriert ist.

Der PDF-Vergleich benötigt eine Installation der kostenfreien Programmbibliothek ImageMagick, die skriptbasiert Bilder manipulieren und vergleichen kann. ImageMagick gibt es unter anderem für die Betriebssysteme Windows, Mac und Linux.

## Vorgehensweise

Ausgehend von einer Layout- und einer Datendatei erzeugt man in gewohnter Weise eine PDF-Datei. Am einfachsten ist es, wenn man sie direkt mit dem Namen `reference.pdf` erzeugt. Dafür benutzt man die Option `--jobname` auf der Kommandozeile.

    sp --jobname reference

erzeugt die passende PDF-Datei. Mit

    sp --jobname reference clean

löscht man die übrigen und nicht weiter benötigten Zwischendateien. Das Verzeichnis sieht nun so aus:

    beispiel/
    |-- data.xml
    |-- layout.xml
    |-- reference.pdf

    0 directories, 3 files

Wird nun `sp compare beispiel` aufgerufen, sollte es keine Beanstandung geben und als Ausgabe erscheinen:

    $ sp compare beispiel/
    Total run time: 1.62956s

Falls nun eine zukünftige Version des Publishers eine visuelle Änderung des Layouts hervorrufen würde, ist die Ausgabe z. B. folgende:

    $ sp compare beispiel/
    /pfad/zum/verzeichnis/beispiel
    Comparison failed. Bad pages are: [0]
    Max delta is 2162.760009765625
    Total run time: 862.898ms

Die Unterschiede sind als PNG Dateien in dem Verzeichnis enthalten:

    beispiel/
    |-- data.xml
    |-- layout.xml
    |-- pagediff.png
    |-- publisher.pdf
    |-- reference.pdf
    |-- reference.png
    |-- source.png

Die Dateien `source.png` und `reference.png` (bzw. bei mehreren Seiten mit einer Kennung für die Seitenzahl) enthalten die aktuelle Version (`source.png`) und die Referenz (`reference.png`) als Grafikdatei. Die Datei `pagediff.png` (auch hier ggf. mit Kennungen für die Seitenzahlen) stellt die Unterschiede zwischen den ersten beiden Dateien hervorgehoben dar. Die Gemeinsamkeiten werden abgeschwächt dargestellt.

## Praxis

Mit den Möglichkeiten des PDF-Vergleichs kann man nun eine Sammlung von Beispieldokumenten erstellen, die produktionstypisch sind. Eine Vorgehensweise besteht darin, eine Verzeichnisstruktur zu erstellen, die wie folgt aufgebaut ist:

    qa/
    |-- beispiel1
    |   |-- data.xml
    |   |-- layout.xml
    |   |-- reference.pdf
    |-- beispiel2
    |   |-- data.xml
    |   |-- layout.xml
    |   |-- reference.pdf
    |-- beispiel3
        |-- data.xml
        |-- layout.xml
        |-- reference.pdf

Mit dem Aufruf `sp compare qa` werden alle Unterverzeichnisse durchlaufen und überprüft.

- Schemavalidierung
- Fehlersuche / Debugging