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

# はじめに

[asciidoctor-fopubで生成されるPDFの"Table of Contents"などを日本語化する - Qiita]( http://qiita.com/hnakamur/items/94ff084ac5dc326ac859 )をさらに発展させて、各ページのヘッダとフッタをカスタマイズしてみました。

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

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

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

ヘッダのスクリーンショット
![asciidoctor-logo-in-header.png](https://qiita-image-store.s3.amazonaws.com/0/3227/b047aa79-8492-f442-ed02-304da9088a68.png)

フッタのスクリーンショット
![asciidoctor-copyright-in-footer.png](https://qiita-image-store.s3.amazonaws.com/0/3227/c38746cd-57f6-eeb1-85e4-51f940e7f6df.png)

# 変更内容の説明

[asciidoctor/asciidoctor-fopub]( https://github.com/asciidoctor/asciidoctor-fopub )に含まれいている[src/dist/docbook-xsl/]( https://github.com/asciidoctor/asciidoctor-fopub/tree/e1b15e85faa4f17852a2700d751d7428e590bf4c/src/dist/docbook-xsl )フォルダをコピーして修正していきます。

[asciidoctor-fopubで生成されるPDFの"Table of Contents"などを日本語化する - Qiita]( http://qiita.com/hnakamur/items/94ff084ac5dc326ac859 )に書いた修正は適用済みとして、その続きを説明します。

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

[src/dist/dookbook-xsl/fo-pdf.xsl]( https://github.com/asciidoctor/asciidoctor-fopub/blob/master/src/dist/docbook-xsl/fo-pdf.xsl )を見ると、以下のように外部のXSLTスタイルシートをインポートしています。

```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]( http://sourceforge.net/projects/docbook/files/docbook-xsl/ )からダウンロードできるようです。最新版の docbook-xsl-1.78.1.tar.bz2 をダウンロードして展開します。

その後、[ローカルのdocbook.xslを使用するように切り替えます]( https://github.com/1pac/asciidoctor_template/commit/33e91219e20674e99254754c093e6c2261fd7c0f )。

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

変更内容は[ヘッダにロゴ、フッタにコピーライトを追加 · ec5c74a · 1pac/asciidoctor_template]( https://github.com/1pac/asciidoctor_template/commit/ec5c74aae4f00f4f5d731aa07f9d948151e4e291 )でご覧になれます。

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

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

```xslt://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>` を追加してみるとフッタの左側にテキストが追加されました。

```xslt://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]( https://github.com/asciidoctor/asciidoctor-fopub/issues/26 )という情報を見つけました。ヘッダの場合は `header.column.widths` というパラメータがあって、左、中央、右のカラム幅の割合を調整できるとのことです。

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

また、XSLTスタイルシートを見ていると `footer.content.properties` というプロパティを参照している[箇所]( https://github.com/1pac/asciidoctor_template/blob/ec5c74aae4f00f4f5d731aa07f9d948151e4e291/docbook-xsl-1pac/docbook-xsl-1.78.1/fo/pagesetup.xsl#L2899 )がありました。値の指定方法をどこで見つけたかは失念してしまったのですが、以下のように指定すればフォントファミリーとフォントサイズを変更できました。

```xslht://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]( http://en.wikibooks.org/wiki/XQuery/XSL-FO_Images )で出来るそうです。

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

```xslt://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素人の私でもググって情報を見つけて試行錯誤すればやりたいことは出来たので、お手軽にカスタマイズできると言えるかと思います。