PDF-Lesezeichen und Inhaltsverzeichnis mit XSL-FO
David Maus, 21. Mär 2018
Um praktische Erfahrungen mit XSL-FO zu sammeln, erstelle ich aus den im Projekt Selbstzeugnisse der Frühen Neuzeit in der Herzog August Bibliothek publizierten Daten einfache PDF-Dateien.
Heute habe ich mich mit dem Erstellen von PDF-Lesezeichen beschäftigt. Im PDF der Edition sollen zusätzlich zum Inhaltsverzeichnis auch PDF-Lesezeichen enthalten sein, mit denen der Benutzer im Dokument navigieren kann.
Da Lesezeichen und Inhaltsverzeichnis die selbe Information abbilden, habe ich ein Template geschrieben, das die
benötigten Informationen in einem Zwischenformat zusammenstellt. Der Einfachheit halber habe ich das TEI-Vokabular
für die Struktur der Liste gewählt. Für jeden Eintrag wird ein
item
erzeugt, in dessen
corresp
das Sprungziel abgelegt wird. Das Label des Eintrags wird in einem
label
angegeben.
<xsl:template name="inhaltsverzeichnis-einträge"> <list> <xsl:for-each select="text/front//div/head[count(ancestor::div/head) eq 1]"> <item corresp="{generate-id()}"> <label><xsl:value-of select="normalize-space()"/></label> </item> </xsl:for-each> <item corresp="diarium"> <label>Ephemerides. Sive Diarium (1594-1635)</label> <list> <xsl:for-each select="text/group/text/body"> <item corresp="{generate-id()}"> <label> <xsl:value-of> <xsl:value-of select="format-date((.//div/head/date[1]/@when)[1], '[Y]')"/> <xsl:text> (</xsl:text> <xsl:value-of select="format-date((.//div/head/date[1]/@when)[1], '[D01].[M01].')"/> <xsl:text>–</xsl:text> <xsl:value-of select="format-date((.//div/head/date/@when)[last()], '[D01].[M01].[Y]')"/> <xsl:text>)</xsl:text> </xsl:value-of> </label> </item> </xsl:for-each> </list> </item> <item corresp="register"> <label>Register</label> </item> </list> </xsl:template>
Diese Inhaltsangaben werden nun durch je ein Template für Lesezeichen und Inhaltsverzeichnis formatiert. Die Hierarchie des Inhalts bilde ich im Inhaltsverzeichnis durch Einrückung der Einträge an.
<xsl:template match="item" mode="inhaltsverzeichnis"> <fo:block margin-left="{(count(ancestor::list) - 1)}em"> <fo:basic-link internal-destination="{@corresp}"> <xsl:value-of select="label"/> <fo:inline> <fo:leader leader-pattern="dots"/> </fo:inline> <fo:page-number-citation ref-id="{@corresp}"/> </fo:basic-link> </fo:block> <xsl:apply-templates mode="#current"/> </xsl:template> <xsl:template match="item" mode="lesezeichen"> <fo:bookmark internal-destination="{@corresp}"> <fo:bookmark-title> <xsl:value-of select="label"/> </fo:bookmark-title> <xsl:apply-templates mode="#current"/> </fo:bookmark> </xsl:template>
Das Ergebnis ist ganz passabel!
