backport

技術ネタと野球とときどき雑談

GitBookでPDFを生成するときの日本語フォントの扱いを調べてみた

2016-09-05
development GitBook

GitBookでPDFを生成するときの日本語フォント周りで試行錯誤したので調査結果を残しておきます。調査した環境はCentOS7です。

GitBookのPDF生成は内部でCalibreのebook-convertコマンドを呼び出します。GitBookではinputとoptionの調整を行い、実際のPDF生成処理はCalibreに委ねています。

Calibreのドキュメントを読むと、ebook-convertのPDF生成オプションのうち、フォントに関係しそうなのは

  • –pdf-mono-family
  • –pdf-sans-family
  • –pdf-serif-family
  • –pdf-standard-font

の4つです。「フォントを埋め込むかどうか」というオプションは見当たりません。挙動から推測するに、Calibreは強制的にフォント埋め込みを行うようです。

続いて、GitBookでどのようにオプションを指定しているかを調べてみます。GitBookでPDF生成オプションを組み立てているのは lib/output/ebook/getConvertOptions.js の以下の部分です。book.jsonで指定されたパラメータを解釈してebook-convertコマンドに渡す準備をしているところです。

            return options = extend(options, {
                '--chapter-mark':           String(pdfOptions.chapterMark),
                '--page-breaks-before':     String(pdfOptions.pageBreaksBefore),
                '--margin-left':            String(pdfOptions.margin.left),
                '--margin-right':           String(pdfOptions.margin.right),
                '--margin-top':             String(pdfOptions.margin.top),
                '--margin-bottom':          String(pdfOptions.margin.bottom),
                '--pdf-default-font-size':  String(pdfOptions.fontSize),
                '--pdf-mono-font-size':     String(pdfOptions.fontSize),
                '--paper-size':             String(pdfOptions.paperSize),
                '--pdf-page-numbers':       Boolean(pdfOptions.pageNumbers),
                '--pdf-sans-family':        String(pdfOptions.fontFamily),
                '--pdf-header-template':    headerTpl,
                '--pdf-footer-template':    footerTpl
            });

見ての通り、どうやら --pdf-sans-family しか指定しないようです。

ということで、GitBookでPDFを生成したときのフォント周りの挙動は以下のようになると思われます。

  • GitBookで生成したPDFにはserif, sans serif, monospaceの3種類のフォントが必要に応じて埋め込まれる
  • フォントを指定できるのはsans serifだけ(book.jsonのpdf.fontFamilyオプション)
  • serifとmonospaceはOSのデフォルトを埋め込もうとする

どのフォントが埋め込まれるかはCSSに依存するようなのですが、試した限りだと日本語でちょっと凝った文書を書くと3種類とも埋め込まれますね。

GitBookはなんで全フォント指定可能にしてないんだろう。ちょっと中途半端感が拭えません...



コメント欄を表示する