PDF-Lesezeichen und Inhaltsverzeichnis mit XSL-FO

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!

Screenshot Lesezeichen im PDF