HTMLページで作成した帳票をA4サイズに収める
HTMLで出力しているページをA4横とかA4縦とかの帳票として印刷できるようにしたいことがあります。
社内用システムとか、需要ありますね。
A4サイズに綺麗に収まり、複数ページの場合は、しっかりとページが分かれるようにプリントアウトできるようにするためには、CSSでレイアウトすればイケます。
具体的なレイアウト方法をご紹介します。
HTMLの基本形
サンプルとして、月間の社員別営業成績表をA4サイズで印刷できるようなレイアウトを考えてみます。
<article>
<section>
<h1>2017年10月の成績</h1>
<table>
<thead>
<tr>
<th>社員番号</th>
<th>名前</th>
<th>獲得顧客数</th>
<th>売上高</th>
<th>売上高前年同期比</th>
</tr>
</thead>
<tbody>
<tr>
<td>00001</td>
<td>山田太郎</td>
<td>100</td>
<td>2,000,000</td>
<td>+ 10.0%</td>
</tr>
<tr>
<td>00003</td>
<td>鈴木一郎</td>
<td>90</td>
<td>1,900,000</td>
<td>+ 12.0%</td>
</tr>
<tr>
<td>00007</td>
<td>青山三郎</td>
<td>80</td>
<td>1,650,000</td>
<td>+ 2.0%</td>
</tr>
<tr>
<td>00004</td>
<td>遠山五郎</td>
<td>75</td>
<td>1,350,000</td>
<td>+ 15.0%</td>
</tr>
<tr>
<td>00910</td>
<td>柴崎六郎</td>
<td>50</td>
<td>1,200,000</td>
<td>+ 20.0%</td>
</tr>
</tdoby>
</table>
</section>
<section>
<h1>2017年9月の成績</h1>
<table>
<thead>
<tr>
<th>社員番号</th>
<th>名前</th>
<th>獲得顧客数</th>
<th>売上高</th>
<th>売上高前年同期比</th>
</tr>
</thead>
<tbody>
<tr>
<td>00001</td>
<td>山田太郎</td>
<td>100</td>
<td>2,000,000</td>
<td>+ 10.0%</td>
</tr>
<tr>
<td>00003</td>
<td>鈴木一郎</td>
<td>90</td>
<td>1,900,000</td>
<td>+ 12.0%</td>
</tr>
<tr>
<td>00007</td>
<td>青山三郎</td>
<td>80</td>
<td>1,650,000</td>
<td>+ 2.0%</td>
</tr>
<tr>
<td>00004</td>
<td>遠山五郎</td>
<td>75</td>
<td>1,350,000</td>
<td>+ 15.0%</td>
</tr>
<tr>
<td>00910</td>
<td>柴崎六郎</td>
<td>50</td>
<td>1,200,000</td>
<td>+ 20.0%</td>
</tr>
</tdoby>
</table>
</section>
<section>
<h1>2017年8月の成績</h1>
<table>
<thead>
<tr>
<th>社員番号</th>
<th>名前</th>
<th>獲得顧客数</th>
<th>売上高</th>
<th>売上高前年同期比</th>
</tr>
</thead>
<tbody>
<tr>
<td>00001</td>
<td>山田太郎</td>
<td>100</td>
<td>2,000,000</td>
<td>+ 10.0%</td>
</tr>
<tr>
<td>00003</td>
<td>鈴木一郎</td>
<td>90</td>
<td>1,900,000</td>
<td>+ 12.0%</td>
</tr>
<tr>
<td>00007</td>
<td>青山三郎</td>
<td>80</td>
<td>1,650,000</td>
<td>+ 2.0%</td>
</tr>
<tr>
<td>00004</td>
<td>遠山五郎</td>
<td>75</td>
<td>1,350,000</td>
<td>+ 15.0%</td>
</tr>
<tr>
<td>00910</td>
<td>柴崎六郎</td>
<td>50</td>
<td>1,200,000</td>
<td>+ 20.0%</td>
</tr>
</tdoby>
</table>
</section>
</article>
こんな感じ。すみません、手抜きで、成績数値は毎月同じです。。月ごとにページを分けて帳票印刷ができるようなイメージです。
ポイントは、ページを分けたいブロックを section で囲っている点。
これを article で括ってあげるとわかりやすいと思います。
当ブログでは、article や section の適切な使い方を紹介している記事もありますので、ご参考ください。
| HTML5の構造化タグはたくさんありますが、まずは押さえるべき「ページ全体に関するもの」と「セクション(=コンテンツにおける区切り)に関するもの」について紹介して... HTML5タグ articleやsectionなど 構造化タグがわかる 初心者向け - shiru-web.com |
CSSでレイアウトする
HTMLで文書構造ができたら、A4印刷ができるようにスタイルを整えていきます。
<link media="print" rel="stylesheet" href="print.css">
この時、「media=”print”」とするのが重要です。
これは、印刷するときにだけ適用させる、というものになります。
そして、先ほどのHTMLのsectionにクラス名をつけます。
<article>
<section class="print_pages">
<h1>2017年10月の成績</h1>
<table>
<thead>
<tr>
<th>社員番号</th>
<th>名前</th>
<th>獲得顧客数</th>
<th>売上高</th>
<th>売上高前年同期比</th>
</tr>
</thead>
<tbody>
<tr>
<td>00001</td>
<td>山田太郎</td>
<td>100</td>
<td>2,000,000</td>
<td>+ 10.0%</td>
</tr>
<tr>
<td>00003</td>
<td>鈴木一郎</td>
<td>90</td>
<td>1,900,000</td>
<td>+ 12.0%</td>
</tr>
<tr>
<td>00007</td>
<td>青山三郎</td>
<td>80</td>
<td>1,650,000</td>
<td>+ 2.0%</td>
</tr>
<tr>
<td>00004</td>
<td>遠山五郎</td>
<td>75</td>
<td>1,350,000</td>
<td>+ 15.0%</td>
</tr>
<tr>
<td>00910</td>
<td>柴崎六郎</td>
<td>50</td>
<td>1,200,000</td>
<td>+ 20.0%</td>
</tr>
</tdoby>
</table>
</section>
<section class="print_pages">
<h1>2017年9月の成績</h1>
<table>
<thead>
<tr>
<th>社員番号</th>
<th>名前</th>
<th>獲得顧客数</th>
<th>売上高</th>
<th>売上高前年同期比</th>
</tr>
</thead>
<tbody>
<tr>
<td>00001</td>
<td>山田太郎</td>
<td>100</td>
<td>2,000,000</td>
<td>+ 10.0%</td>
</tr>
<tr>
<td>00003</td>
<td>鈴木一郎</td>
<td>90</td>
<td>1,900,000</td>
<td>+ 12.0%</td>
</tr>
<tr>
<td>00007</td>
<td>青山三郎</td>
<td>80</td>
<td>1,650,000</td>
<td>+ 2.0%</td>
</tr>
<tr>
<td>00004</td>
<td>遠山五郎</td>
<td>75</td>
<td>1,350,000</td>
<td>+ 15.0%</td>
</tr>
<tr>
<td>00910</td>
<td>柴崎六郎</td>
<td>50</td>
<td>1,200,000</td>
<td>+ 20.0%</td>
</tr>
</tdoby>
</table>
</section>
<section class="print_pages">
<h1>2017年8月の成績</h1>
<table>
<thead>
<tr>
<th>社員番号</th>
<th>名前</th>
<th>獲得顧客数</th>
<th>売上高</th>
<th>売上高前年同期比</th>
</tr>
</thead>
<tbody>
<tr>
<td>00001</td>
<td>山田太郎</td>
<td>100</td>
<td>2,000,000</td>
<td>+ 10.0%</td>
</tr>
<tr>
<td>00003</td>
<td>鈴木一郎</td>
<td>90</td>
<td>1,900,000</td>
<td>+ 12.0%</td>
</tr>
<tr>
<td>00007</td>
<td>青山三郎</td>
<td>80</td>
<td>1,650,000</td>
<td>+ 2.0%</td>
</tr>
<tr>
<td>00004</td>
<td>遠山五郎</td>
<td>75</td>
<td>1,350,000</td>
<td>+ 15.0%</td>
</tr>
<tr>
<td>00910</td>
<td>柴崎六郎</td>
<td>50</td>
<td>1,200,000</td>
<td>+ 20.0%</td>
</tr>
</tdoby>
</table>
</section>
</article>
もちろん、名前はなんでも良いんですけどね。わかりやすく、「print_pages」とでもつけてみました。
さて、CSSです。
.print_pages{
/*A4縦*/
width: 172mm;
height: 251mm;
page-break-after: always;
}
/*最後のページは改ページを入れない*/
.print_pages:last-child{
page-break-after: auto;
}
こんな感じ。
A4縦に最適なレイアウトにしたい場合は、widthを172mm、heightを251mmにします。
A4横だったら、この逆ですね。widthを251mm、heightを172mmです。
page-break-after: always;
は、改ページを意味します。
印刷モードの場合、「class=”print_pages”」の終わりは必ず改ページしてねっていう指定ですね。
続いて指定している、
.print_pages:last-child{
page-break-after: auto;
}
は、最後のページは改行を入れないでね、というものです。
これを入れておかないと、最後のページも改行が入ってしまい、空白の1ページが追加されてしまうことになります。
style要素で指定する場合
HTML内のstyle要素で、印刷時にスタイルがあたるようにするには、下記のように指定すればOKです。
<style type="text/css" media="print">
.print_pages{
/*A4縦*/
width: 172mm;
height: 251mm;
page-break-after: always;
}
/*最後のページは改ページを入れない*/
.print_pages:last-child{
page-break-after: auto;
}
<style>
media=”print” でstyleを定義すれば良いです。
他にも、
<style type="text/css" media="all">
@media print{
.print_pages{
/*A4縦*/
width: 172mm;
height: 251mm;
page-break-after: always;
}
/*最後のページは改ページを入れない*/
.print_pages:last-child{
page-break-after: auto;
}
}
</style>
という「Media Queries」を使った書き方もいけます。
固定ヘッダー、フッターをつける
印刷する際に、各ページにヘッダーやフッターをつけたい、ということも多いと思います。
先ほどのcssを下記のようにすれば良いです。
.print_pages{
/*A4縦*/
width: 172mm;
height: 251mm;
page-break-after: always;
position: relative;
counter-increment: page_count;
}
/*最後のページは改ページを入れない*/
.print_pages:last-child{
page-break-after: auto;
}
.print_pages:before{
position: absolute;
right: 0;
top: 0;
color: red;
content: "関係者外秘";
}
.print_pages:after{
position: absolute;
right: 0;
bottom: 0;
content: counter(page_count) "ページ";
}
基礎となる、print_pagesのpositionをrelativeにして、ヘッダー、フッターにあたる要素をそれぞれbefore、afterで指定し、position:absoluteで、固定表示する場所を指定します。
今回の例では、フッターにページ数を表示させています。
counter-incrementは、要素の連番カウンタの値を進める際に使用できるものです。ここにカウンタ名を定義(上記の例では、”page_count”)、表示させたい場所に、counter(定義名)で表示できます。
最後に、上記のデモサイトリンクを貼っておきます。ぜひ参考にしてください!
デモサイトはこちらをクリック