DocFXでPDF作成

2019/08/15 DocFX
PDFに関してはなんとなくまだまだ発展途上の気がします。

wkhtmltopdfのインストール

第一の難関でした。
インストールし、環境変数にPathも追加しコマンドプロンプトでwkhtmltopdf -Vするとちゃんとバージョンが表示されるにも関わらず、下記のエラーが出てPDFが作成されない。
(環境はWin10でVS2019です)
wkhtmltopdf is a prerequisite when generating PDF. 
Please install it from https://wkhtmltopdf.org/downloads.html 
and save the executable folder to %PATH% first. 
Alternatively you can install it from https://chocolatey.org 
with `choco install wkhtmltopdf`.
ユーザーの環境変数ではなくシステムの環境変数に追加してもダメ。
VSを管理者として実行してみたらエラー解消。
一度解消すると、その後普通にVS起動してもエラー出ず。

pdfフォルダを作成し、中にtoc.ymlを置く

toc.yml

- name: Articles
  href: ../articles/toc.yml
- name: Api Documentation
  href: ../api/toc.yml

docfx.jsonにPDF関連のセクション追加

wkhtmltopdfのオプション

wkhtmltopdfのオプション一覧はこちら
docfx.jsonで指定する場合は"wkhtmltopdf":だけでなく"additionalArguments":が必要。

ページ番号を表示させる場合の例

...
"pdf": {
  "wkhtmltopdf": {
    "additionalArguments": "--footer-center [page]"
  },
  "content": [
...

PDF用CSSの調整

デフォルトのままのCSSだとIMPORTANTやWARNINGなどのデザインが崩れています。
しかも日本語化したはずのIMPORTANTやWARNINGもそのまま表示されています。
docfx pdf alert

デフォルトのPDF用テンプレートをエクスポート

こちらでWebサイト用のテンプレートをエクスポートしたのと同様、PDF用のデフォルトテンプレートをエクスポート。
docfx template export pdf.default
エクスポートが成功すると、pdf.default フォルダが追加されます。
pdf.default

カスタムテンプレートの作成

  • fontsフォルダがエクスポートしたpdf.defaultにはなかったので、defaultからコピー。
  • main.cssは元々空なので、エクスポートしたものをコピーしなくても同じ名前で作成した方が文字コードUTF-8になるかも。
  • token.json:唯一pdf.defaultからコピー。
docfxpdf025.png

docfx.jsonの編集

"pdf": {
  "template": [
    "pdf.default",
    "templates/pdf"
  ],

main.cssに追記

padding入れたり、アイコン(glyphicons)のコード変えたり(Web版と違うことに気づいた自分えらい)してかなり近づきましたが、ボーダーとフォントサイズが違いそう。
※2020/02/04 ボーダー周りを修正
docfx pdf alert

@font-face {
    font-family: 'Glyphicons Halflings';
    src: url(../fonts/glyphicons-halflings-regular.eot);
    src: url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')
}


.NOTE, .TIP, .WARNING, .IMPORTANT, .WARNING, .CAUTION {
    border-style:solid;
    border-width:1px;
    border-radius: 5px;
    padding: 15px;
    margin-bottom: 20px;
}

.NOTE, .TIP {
    border-color: #bce8f1;
    color: #31708f;
    background-color: #d9edf7;
}

.IMPORTANT, .CAUTION {
    border-color: #ebccd1;
    color: #a94442;
    background-color: #f2dede;
}

.WARNING {
    border-color: #faebcc;
    color: #8a6d3b;
    background-color: #fcf8e3;
}

.IMPORTANT h5, .CAUTION h5 {
    color: #a94442;
}

.WARNING h5 {
    color: #8a6d3b;
}

.NOTE h5, .TIP h5, .WARNING h5, .IMPORTANT h5, .CAUTION h5 {
    font-size:14px;
    text-transform: uppercase;
    font-weight: bold;
    margin-top: 0;
}

.NOTE h5, .TIP h5 {
    color: #31708f;
}

.NOTE h5:before, .TIP h5:before, .WARNING h5:before, .IMPORTANT h5:before, .CAUTION h5:before {
    position: relative;
    top: 1px;
    display: inline-block;
    font-family: 'Glyphicons Halflings';
    line-height: 1;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    margin-right: .2em;
    font-weight: normal;
}

.NOTE h5:before {
    content: "\e086";
}

.IMPORTANT h5:before, .CAUTION h5:before {
    content: "\e127";
}

.WARNING h5:before {
    content: "\e107";
}

.TIP h5:before {
    content: "\e086";
}


.NOTE > p, .WARNING > p, .IMPORTANT > p, .CAUTION > p, .TIP > p {
    margin-top: 5px;
    margin-bottom: 0;
}


*, :after, :before {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box
}

表紙をつける

pdfフォルダ内にcover.mdを追加

docfxcover010.png

cover.mdに表紙用のスタイル適用

---
documentType: cover
---
# The real cover page title

表紙用スタイルをカスタマイズ

cover.html.primary.tmplを上書き
docfxcover020.png


詳しくはこちら

TOC(目次・Table of Contents)

下記の右側部分。デフォルトで作成される。
docfxpdf070.png

ページ番号が表示されないのは現在の仕様。ulタグのループになっている。
ページ番号表示しようとしたらテーブルにする気がする。

wkhtmltopdfのtocはページ番号付き。ただし最新の安定版ではバグによりtocが作成されない。

outline(しおり・ブックマーク)

DocFXのオプション

DefaultOutlinetoc.ymlを元にブックマーク作成?(デフォルト)
WkDefaultOutlineHTML内のhXを元にブックマーク作成
NoOutlineブックマークを作成しない
なぜかデフォルトのDefaultOutlineのリンクが変。
タイトルとジャンプ先ずれる。
スクロール位置によってジャンプ先が異なるような気もして安定しない。
似たような報告がされているけれど既にClose済み。Nugetのバージョンによるものかもしれません。
WkDefaultOutlineを使うかNoOutlineにする。

WkDefaultOutline

"pdf": {
  "outline": "WkDefaultOutline",
ジャンプ先はきれいに安定するようになりましたが…
docfxpdf050.png

「重要」「警告」などはh5で囲まれていたはず。勘弁してください状態。
試しにアラートの前にh2とh3を追加しアウトラインを3層までに制限してみました。
"pdf": {
  "outline": "WkDefaultOutline",
  "wkhtmltopdf": {
    "additionalArguments": "--footer-center [page] --outline-depth 3"
  },
docfxpdf060.png

これで使い物になるかどうかは使う人の判断で(^^;)。
※hXタグから自動で作成されるため、docfx.json内のtocTitleオプションも無視されます。
「Table of Contents」を日本語にしたい場合は、テンプレート(toc.html.tmpl)を日本語化しましょう。
docfxpdf070.png

OK キャンセル 確認 その他