asciidoctor-fopubで生成するPDFのヘッダとフッタをカスタマイズする


はじめに

asciidoctor-fopubで生成されるPDFの"Table of Contents"などを日本語化する - Qiitaをさらに発展させて、各ページのヘッダとフッタをカスタマイズしてみました。

ここでは例としてヘッダに会社のロゴ画像、フッタにコピーライト表示を追加します。

サンプルPDFとスクリーンショット

サンプルPDF: http://1pac.github.io/asciidoctor_template/embed_image_sample.pdf
サンプルレポジトリ: https://github.com/1pac/asciidoctor_template

ヘッダのスクリーンショット

フッタのスクリーンショット

変更内容の説明

asciidoctor/asciidoctor-fopubに含まれいているsrc/dist/docbook-xsl/フォルダをコピーして修正していきます。

asciidoctor-fopubで生成されるPDFの"Table of Contents"などを日本語化する - Qiitaに書いた修正は適用済みとして、その続きを説明します。

fo/docbook.xslをローカルにインストールして差し替え

src/dist/dookbook-xsl/fo-pdf.xslを見ると、以下のように外部のXSLTスタイルシートをインポートしています。

//github.com/asciidoctor/asciidoctor-fopub/blob/e1b15e85faa4f17852a2700d751d7428e590bf4c/src/dist/docbook-xsl/fo-pdf.xsl#L20
  <xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/>

このファイルを見るとさらにそこから多数のxslファイルをインポートしています。
探してみると、DocBook - Browse /docbook-xsl at SourceForge.netからダウンロードできるようです。最新版の docbook-xsl-1.78.1.tar.bz2 をダウンロードして展開します。

その後、ローカルのdocbook.xslを使用するように切り替えます

pagesetup.xslでヘッダにロゴ、フッタにコピーライト表示を追加

変更内容はヘッダにロゴ、フッタにコピーライトを追加 · ec5c74a · 1pac/asciidoctor_templateでご覧になれます。

フッタにコピーライト追加

XSLTスタイルシートのファイルを見ていくと、標準でページ下部の中央にページ番号を出力しているのは以下の箇所らしいということがわかりました (<fo:page-number/> の後にテキストを追加してPDFを生成してみてテキストが追加されることで確認しました)。

//github.com/1pac/asciidoctor_template/blob/ec5c74aae4f00f4f5d731aa07f9d948151e4e291/docbook-xsl-1pac/docbook-xsl-1.78.1/fo/pagesetup.xsl#L3128-L3130
      <xsl:when test="$double.sided = 0 and $position='center'">
        <fo:page-number/>
      </xsl:when>

そこで、以下のように <fo:block> を追加してみるとフッタの左側にテキストが追加されました。

//github.com/1pac/asciidoctor_template/commit/ec5c74aae4f00f4f5d731aa07f9d948151e4e291#diff-986cf999932bb520b251bbf7fb9aba5eR3101
  <fo:block>
    <xsl:choose>
      <xsl:when test="$double.sided = 0 and $position='left'">
        Copyright 2014 1PAC. INC. All Right Reserved.
      </xsl:when>
    </xsl:choose>
  </fo:block>

ただ、フォントが大きすぎるし、行が折り返してしまっていました。

ググってみるとLong title in header overflows to body · Issue #26 · asciidoctor/asciidoctor-fopubという情報を見つけました。ヘッダの場合は header.column.widths というパラメータがあって、左、中央、右のカラム幅の割合を調整できるとのことです。

ということで、フッター用に footer.column.widths のパラメータを指定しました。

また、XSLTスタイルシートを見ていると footer.content.properties というプロパティを参照している箇所がありました。値の指定方法をどこで見つけたかは失念してしまったのですが、以下のように指定すればフォントファミリーとフォントサイズを変更できました。

//github.com/1pac/asciidoctor_template/blob/ec5c74aae4f00f4f5d731aa07f9d948151e4e291/docbook-xsl-1pac/fo-pdf.xsl#L263-L267
  <xsl:param name="footer.column.widths">5 1 5</xsl:param>
  <xsl:attribute-set name="footer.content.properties">
    <xsl:attribute name="font-family">Helvetica</xsl:attribute>
    <xsl:attribute name="font-size">8pt</xsl:attribute>
  </xsl:attribute-set>

ヘッダに会社ロゴ画像追加

ググってみると、XSLTスタイルシートで画像を追加するのは
XQuery/XSL-FO Images - Wikibooks, open books for an open worldで出来るそうです。

ということで、以下のように追加してみると、ヘッダの右のほうにロゴが表示されました。

//github.com/1pac/asciidoctor_template/blob/ec5c74aae4f00f4f5d731aa07f9d948151e4e291/docbook-xsl-1pac/docbook-xsl-1.78.1/fo/pagesetup.xsl#L2748-L2754
  <fo:block>
    <xsl:choose>
      <xsl:when test="$double.sided = 0 and $position='right'">
        <fo:external-graphic src="docbook-xsl-1pac/1pac-logo.png"/>
      </xsl:when>
    </xsl:choose>
  </fo:block>

まとめ

asciidoctor-fopubにバンドルされているXSLTスタイルシートをコピーして編集することで、ヘッダやフッタをカスタマイズすることが出来ました。XSLT素人の私でもググって情報を見つけて試行錯誤すればやりたいことは出来たので、お手軽にカスタマイズできると言えるかと思います。