WebページをPDFにする

例えば、[プログラマが知るべき97のこと](http://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/)をPDF化して、Google Play ブックスにアップしてローカルで読みたい。
Google Play ブックスを使うとPDFを読んだところから開けるので便利。

HTMLをPDFに変換するには[wkhtmltopdf](http://wkhtmltopdf.org/)を使う。
ダウンロードは[こちら](http://wkhtmltopdf.org/downloads.html)。

直接

```
$ wkhtmltopdf http://hoge1 http://hoge2 fuga.pdf
```

のように復数のWebページを指定してPDF化出来る仕様のようだが、やってみるとうまくいかない（サーバがさばききれてない？）ので、一旦wgetを使って、ダウンロードして変換したほうが良さそう。

```
$ wget -r --convert-links --restrict-file-names=nocontrol -E 'http://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/'
```

ここで、`-r`はリンクをたどって再帰的にダウンロードするオプション。`-l`で深さを指定しない場合デフォルトで5つ先までダウンロードしてくれる。
`--convert-links`はhyperlinkや画像、CSSのリンクを、リンク先がダウンロードされているなら相対パス、ダウンロードされてないならホスト付きのリンクに変換して、ローカル環境で見た時に正しく表示できるように変換するオプション。
`--restrict-file-names`はリンクのエスケープの仕方を指定するオプション。プログラマが知るべき97のこと.comのようにリンクが日本語(UTF-8の文字)を含む場合は、これをnocontrolで指定し、変換しないようにする。指定しないと文字化けする。
`-E`はファイル名に拡張子を追加するオプション。これを指定するとHTMLファイルに.htmlがつく。ついてないとwkhtmltopdfで変換できない。

ダウンロードできたら、エッセイのディレクトリに移動し、PDFに変換してやる。

```
$ cd xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/エッセイ
$ wkhtmltopdf -n '分別のある行動.html' '関数型プログラミングを学ぶことの重要性.html' 'ユーザが何をするかを観察する（あなたはユーザではない）.html' 'コーディング規約を自動化する.html' '美はシンプルさに宿る.html' 'リファクタリングの際に注意すべきこと.html' '共有は慎重に.html' 'ボーイスカウト・ルール.html' '他人よりまず自分を疑う.html' 'ツールの選択は慎重に.html' 'ドメインの言葉を使ったコード.html' 'コードは設計である.html' 'コードレイアウトの重要性.html' 'コードレビュー.html' 'コードの論理的検証.html' 'コメントについてのコメント.html' 'コードに書けないことのみをコメントにする.html' '学び続ける姿勢.html' '誰にとっての「利便性」か.html' 'すばやくデプロイ、こまめにデプロイ.html' '技術的例外とビジネス例外を明確に区別する.html' '1万時間の訓練.html' ' ドメイン特化言語.html' '変更を恐れない.html' '見られて恥ずかしいデータは使わないこと.html' '言語だけでなく文化も学ぶ.html' '死ぬはずのプログラムを無理に生かしておいてはいけない.html' '「魔法」に頼りすぎてはいけない.html' 'DRY原則.html' 'そのコードに触れてはならない！.html' '状態だけでなく「ふるまい」もカプセル化する.html' '浮動小数点数は実数ではない.html' 'オープンソースプロジェクトで夢を実現する.html' 'API設計の黄金律.html' '超人の神話.html' 'ハードワークは報われない.html' 'バグレポートの使い方.html' '余分なコードは決して書かない.html' '最初が肝心.html' 'プロセス間通信とアプリケーションの応答時間の関係.html' '無駄な警告を排除する.html' 'コマンドラインツールを使う.html' 'プログラミング言語は複数習得すべき.html' 'IDEを知る.html' '限界を知る.html' 'すべきことは常に明確に.html' '大量のデータはデータベ ースで.html' 'いろいろな言葉を学ぶ.html' '見積りとは何か.html' 'Hello, Worldから始めよう.html' 'プロジェクト自身にしゃべらせる.html' '「その場しのぎ」が長生きしてしまう.html' '正しい使い方を簡単に、誤った使い方を困難に.html' '見えないものを見えるように.html' '並行処理に有効なメッセージパッシング.html' '未来へのメッセージ.html' 'ポリモーフィズムの利用機会を見逃さない.html' 'テスト担当者はプログラマの友人.html' 'バイナリは常に1つ.html' '真実を語るはコードのみ.html' 'ビルドをおろそかにしない.html' 'プリミティブ型よりドメイン固有の型を.html' 'ユーザの操作ミスを防止する.html' 'プロのプログラマとは？.html' 'バージョン管理システムを有効に使う.html' 'いったんコンピュータから離れてみる.html' 'コードを読む.html' '「人間」を知る.html' '車輪の再発明の効用.html' 'シングルトンパターンの誘惑に負けない.html' 'パフ ォーマンスへの道は地雷コードで敷き詰められている.html' 'シンプルさは捨てることによって得られる.html' '単一責任原則.html' '「イエス」から始める.html' '面倒でも自動化できることは自動化する.html' 'コード分析ツールを利用する.html' '偶然の仕様ではなく本物の仕様のためのテストを書く.html' 'テストは夜間と週末に.html' 'テストのないソフトウェア開発はあり得ない.html' '1人より2人.html' 'エラーがエラーを相殺してしまう.html' '他者への思いやりを意識したコーディング.html' 'UNIXツールを友にする.html' '正しいアルゴリズムとデータ構造を選ぶ.html' '冗長なログは眠りを妨げる.html' 'WETなシステムはボトルネックが見つかりにくい.html' 'プログラマとテスターが協力してできること.html' 'コードは生涯サポートするつもりで書く.html' '関数の「サイズ」を小さくする.html' 'コードを見る人のためにテストを書く.html' '良いプログラマになるに は.html' '顧客の言葉はそのまま受け取らない.html' 'エラーを無視するな.html' 'リンカは魔法のプログラムではない.html' 'ペアプログラミングと「フロー」.html' 'テストは正確に、具体的に.html' 'ステートに注目する.html' '命を吹き込む魔法.html' 'ロールプレイングゲーム.html' 'ルーチンワークをフローのきっかけに.html' 'プログラマが持つべき3つのスキル.html' '快適な環境を追求する.html' '見知らぬ人ともうまくやるには.html' '不具合にテストを書いて立ち向かう.html' '育ちのよいコード.html' 'Noといえることの大事さ.html' '名前重要.html' 97_Things_Every_Programmer_Should_Know.pdf
```

ここで、`-n`はJavaScriptを無効にするオプション。これを付けないとうまく行かなかった。
PDFに変換したいHTMLファイルを並べて、最後に変換後のPDFのファイル名を指定すれば、変換できる。