AsciiDoc から 日本語 PDF の作成手順

f:id:Naotsugu:20210825201535p:plain


はじめに

AsciiDoc で日本語を含む PDF を生成するには、asciidoctor-pdf を使うのが王道ですが、asciidoctor-pdf v1.5.0 以降ではフォントのフォールバック設定が除外されており、文字化けが発生します。

そんな時には、以下の作業を行います。

https://github.com/asciidoctor/asciidoctor-pdf/blob/main/data/themes/default-theme.yml からテーマファイルを取得して、以下のフォールバック設定を追加。

font:
  catalog:
    Noto Serif:
        ...略
    M+ 1mn:
        ...略
  # ---- ここから
    M+ 1p Fallback:
      normal: GEM_FONTS_DIR/mplus1p-regular-fallback.ttf
      bold: GEM_FONTS_DIR/mplus1p-regular-fallback.ttf
      italic: GEM_FONTS_DIR/mplus1p-regular-fallback.ttf
      bold_italic: GEM_FONTS_DIR/mplus1p-regular-fallback.ttf
  fallbacks:
    - M+ 1p Fallback
  # ---- ここまで

theme.yml などとして保存して以下で変換。

docker run --rm -v $(pwd):/documents/ asciidoctor/docker-asciidoctor asciidoctor-pdf index.adoc -n -a toc -a pdf-style=theme.yml -o out.pdf

以上で終了です。

少し詳細を以下に記載しておきます。


docker-asciidoctor によるPDF作成

index.adoc が元ファイルだとすると、ファイルの存在するディレクトリに移動して、以下のコマンドでPDFが出力されます(Docker は導入済みの前提です)。

docker run --rm -v "$(pwd)":/documents/ asciidoctor/docker-asciidoctor asciidoctor-pdf index.adoc

Windows(PowerShell)の場合は、$(pwd) を ${pwd} に読み替えてください。

作成される PDF は、元ファイルと同じ名前の index.pdf となります。


よく使う docker-asciidoctor のオプション

asciidoctor-pdf でよく使うオプションは以下となります。

  • -o で生成ファイルを指定(指定無し時はadocファイル名と同)
  • -n セクション番号の自動採番 -a sectnums でも同
  • -a toc で目次位置の属性設定(auto)
  • -a pdf-style=theme.yml PDF生成用のテーマ指定

-a は、attribute の置き換えオプションで、定義済みの attribute の内容をコマンドラインから上書きする際に指定します。

PDF生成時のテーマは、-a pdf-style=theme.yml のように指定します。 デフォルトのテーマは、docker-asciidoctor のインストールディレクトリ内の /data/theme/default-theme.yml にありますが、https://github.com/asciidoctor/asciidoctor-pdf/blob/main/data/themes/default-theme.yml から取得するのが簡単でしょう。

多くの場合は、以下のように実行することになるでしょう。

asciidoctor-pdf index.adoc -n -a toc -a pdf-style=theme.yml -o out.pdf


docker-asciidoctor のテーマファイル

先程の例で指定した -a pdf-style=theme.yml のテーマファイルの内容は、以下にガイドがあります。

github.com

まぁ、長くて読む気にはならないのですが、以下からデフォルトのテーマを取得して、

https://github.com/asciidoctor/asciidoctor-pdf/blob/main/data/themes/default-theme.yml

先頭部分の定義を、

font:
  catalog:
    # Noto Serif supports Latin, Latin-1 Supplement, Latin Extended-A, Greek, Cyrillic, Vietnamese & an assortment of symbols
    Noto Serif:
      normal: GEM_FONTS_DIR/notoserif-regular-subset.ttf
      bold: GEM_FONTS_DIR/notoserif-bold-subset.ttf
      italic: GEM_FONTS_DIR/notoserif-italic-subset.ttf
      bold_italic: GEM_FONTS_DIR/notoserif-bold_italic-subset.ttf
    # M+ 1mn supports ASCII and the circled numbers used for conums
    M+ 1mn:
      normal: GEM_FONTS_DIR/mplus1mn-regular-subset.ttf
      bold: GEM_FONTS_DIR/mplus1mn-bold-subset.ttf
      italic: GEM_FONTS_DIR/mplus1mn-italic-subset.ttf
      bold_italic: GEM_FONTS_DIR/mplus1mn-bold_italic-subset.ttf

以下のようにフォールバック設定を追加するだけで大抵は大丈夫です。

font:
  catalog:
    # Noto Serif supports Latin, Latin-1 Supplement, Latin Extended-A, Greek, Cyrillic, Vietnamese & an assortment of symbols
    Noto Serif:
      normal: GEM_FONTS_DIR/notoserif-regular-subset.ttf
      bold: GEM_FONTS_DIR/notoserif-bold-subset.ttf
      italic: GEM_FONTS_DIR/notoserif-italic-subset.ttf
      bold_italic: GEM_FONTS_DIR/notoserif-bold_italic-subset.ttf
    # M+ 1mn supports ASCII and the circled numbers used for conums
    M+ 1mn:
      normal: GEM_FONTS_DIR/mplus1mn-regular-subset.ttf
      bold: GEM_FONTS_DIR/mplus1mn-bold-subset.ttf
      italic: GEM_FONTS_DIR/mplus1mn-italic-subset.ttf
      bold_italic: GEM_FONTS_DIR/mplus1mn-bold_italic-subset.ttf
    M+ 1p Fallback:
      normal: GEM_FONTS_DIR/mplus1p-regular-fallback.ttf
      bold: GEM_FONTS_DIR/mplus1p-regular-fallback.ttf
      italic: GEM_FONTS_DIR/mplus1p-regular-fallback.ttf
      bold_italic: GEM_FONTS_DIR/mplus1p-regular-fallback.ttf
  fallbacks:
    - M+ 1p Fallback

これで日本語の文字化けは解消します(フォールバックは遅いのでデフォルトで外されたため、日本語を含むフォントファイルの指定が必要)。 なお、asciidoctor-pdf-cjk の指定は、現在では必要ありません。

別のフォントを指定する場合には、例えば IPAフォントをダウンロードして以下のように直接指定するのも良いと思います。

font:
  catalog:
    IPA PGothic:
      normal: ipagp.ttf
      bold: ipagp.ttf
      italic: ipagp.ttf
      bold_italic: ipagp.ttf
base:
  font_family: IPA PGothic

都度のテーマファイルの指定が面倒な場合は、AsciiDoc ファイル内に以下のように指定するのも良いでしょう。

:pdf-style: themes/default-theme.yml