Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

はじめてのPDF

インストールが済んでいる前提で、1枚出すところから改ページまでを順に試します。

1. 変換する

hello.htmlを用意します。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <style>
      body { font-family: sans-serif; }
      h1 { border-bottom: 2px solid #333; padding-bottom: 8px; }
      .total { text-align: right; font-size: 1.2em; font-weight: bold; }
    </style>
  </head>
  <body>
    <h1>請求書</h1>
    <p>いつもお世話になっております。下記のとおりご請求申し上げます。</p>
    <p class="total">合計 ¥12,000</p>
  </body>
</html>

変換します。

sghtmltopdf hello.html -o hello.pdf

出力先(-o)を省略すると、入力の拡張子を.pdfにしたファイル名になります。 -を使うと標準入力から読み、標準出力へ書けます。

cat hello.html | sghtmltopdf - -o - > hello.pdf

2. 用紙と余白を決める

sghtmltopdf hello.html -o hello.pdf \
  --page-size A4 --margin-top 20mm --margin-bottom 20mm

単位はmm/cm/in/pt/pxが使え、省略するとmmです。

同じことはCSSの@pageでも書けます。 両方書いた場合はCSSが勝ちます(CLIオプションは初期値として扱われます)。 wkhtmltopdfと逆なので、移行時はwkhtmltopdfからの移行を確認してください。

@page {
  size: A4;
  margin: 20mm;
}

3. 改ページする

「ここから次のページ」は、CSSのbreak-beforeで指定します。

<style>
  .page-break { break-before: page; }
</style>

<h1>請求書</h1>
<p>1ページ目です。</p>

<div class="page-break">
  <h1>明細</h1>
  <p>2ページ目です。</p>
</div>

break-after(この要素の後で改ページ)、break-inside: avoid(この要素を分割しない)も使えます。 見出しだけが行末に取り残されるのを防ぐorphans/widowsもあります。 詳しくはページ分割を参照してください。

4. ヘッダーとフッターを付ける

sghtmltopdf hello.html -o hello.pdf \
  --header-center "請求書" \
  --footer-right "[page] / [topage]" \
  --header-line

[page]は現在のページ番号、[topage]は総ページ数に置き換わります。 JavaScriptは実行しないため、この置換で表現します。 HTMLでヘッダーを作りたい場合は--header-htmlが使えます。

5. フォントを固定する

ここまでの例はシステムのフォントを使っています。 サーバやCIで出力を環境に依存させたくない場合は、フォントファイルを明示してください。

sghtmltopdf hello.html -o hello.pdf \
  --font NotoSansJP-Regular.ttf \
  --gothic-font NotoSansJP-Regular.ttf