【コピペでできる】cssでA4サイズぴったりに印刷できるようにレイアウトする方法
HTMLページで作成した帳票をA4サイズに収める
HTMLで出力しているページをA4横とかA4縦とかの帳票として印刷できるようにしたいことがあります。
社内用システムとか、需要ありますね。
A4サイズに綺麗に収まり、複数ページの場合は、しっかりとページが分かれるようにプリントアウトできるようにするためには、CSSでレイアウトすればイケます。
具体的なレイアウト方法をご紹介します。
HTMLの基本形
サンプルとして、月間の社員別営業成績表をA4サイズで印刷できるようなレイアウトを考えてみます。
001 | < article > |
002 | < section > |
003 | < h1 >2017年10月の成績</ h1 > |
004 | < table > |
005 | < thead > |
006 | < tr > |
007 | < th >社員番号</ th > |
008 | < th >名前</ th > |
009 | < th >獲得顧客数</ th > |
010 | < th >売上高</ th > |
011 | < th >売上高前年同期比</ th > |
012 | </ tr > |
013 | </ thead > |
014 | < tbody > |
015 | < tr > |
016 | < td >00001</ td > |
017 | < td >山田太郎</ td > |
018 | < td >100</ td > |
019 | < td >2,000,000</ td > |
020 | < td >+ 10.0%</ td > |
021 | </ tr > |
022 | < tr > |
023 | < td >00003</ td > |
024 | < td >鈴木一郎</ td > |
025 | < td >90</ td > |
026 | < td >1,900,000</ td > |
027 | < td >+ 12.0%</ td > |
028 | </ tr > |
029 | < tr > |
030 | < td >00007</ td > |
031 | < td >青山三郎</ td > |
032 | < td >80</ td > |
033 | < td >1,650,000</ td > |
034 | < td >+ 2.0%</ td > |
035 | </ tr > |
036 | < tr > |
037 | < td >00004</ td > |
038 | < td >遠山五郎</ td > |
039 | < td >75</ td > |
040 | < td >1,350,000</ td > |
041 | < td >+ 15.0%</ td > |
042 | </ tr > |
043 | < tr > |
044 | < td >00910</ td > |
045 | < td >柴崎六郎</ td > |
046 | < td >50</ td > |
047 | < td >1,200,000</ td > |
048 | < td >+ 20.0%</ td > |
049 | </ tr > |
050 | </ tdoby > |
051 | </ table > |
052 | </ section > |
053 | < section > |
054 | < h1 >2017年9月の成績</ h1 > |
055 | < table > |
056 | < thead > |
057 | < tr > |
058 | < th >社員番号</ th > |
059 | < th >名前</ th > |
060 | < th >獲得顧客数</ th > |
061 | < th >売上高</ th > |
062 | < th >売上高前年同期比</ th > |
063 | </ tr > |
064 | </ thead > |
065 | < tbody > |
066 | < tr > |
067 | < td >00001</ td > |
068 | < td >山田太郎</ td > |
069 | < td >100</ td > |
070 | < td >2,000,000</ td > |
071 | < td >+ 10.0%</ td > |
072 | </ tr > |
073 | < tr > |
074 | < td >00003</ td > |
075 | < td >鈴木一郎</ td > |
076 | < td >90</ td > |
077 | < td >1,900,000</ td > |
078 | < td >+ 12.0%</ td > |
079 | </ tr > |
080 | < tr > |
081 | < td >00007</ td > |
082 | < td >青山三郎</ td > |
083 | < td >80</ td > |
084 | < td >1,650,000</ td > |
085 | < td >+ 2.0%</ td > |
086 | </ tr > |
087 | < tr > |
088 | < td >00004</ td > |
089 | < td >遠山五郎</ td > |
090 | < td >75</ td > |
091 | < td >1,350,000</ td > |
092 | < td >+ 15.0%</ td > |
093 | </ tr > |
094 | < tr > |
095 | < td >00910</ td > |
096 | < td >柴崎六郎</ td > |
097 | < td >50</ td > |
098 | < td >1,200,000</ td > |
099 | < td >+ 20.0%</ td > |
100 | </ tr > |
101 | </ tdoby > |
102 | </ table > |
103 | </ section > |
104 | < section > |
105 | < h1 >2017年8月の成績</ h1 > |
106 | < table > |
107 | < thead > |
108 | < tr > |
109 | < th >社員番号</ th > |
110 | < th >名前</ th > |
111 | < th >獲得顧客数</ th > |
112 | < th >売上高</ th > |
113 | < th >売上高前年同期比</ th > |
114 | </ tr > |
115 | </ thead > |
116 | < tbody > |
117 | < tr > |
118 | < td >00001</ td > |
119 | < td >山田太郎</ td > |
120 | < td >100</ td > |
121 | < td >2,000,000</ td > |
122 | < td >+ 10.0%</ td > |
123 | </ tr > |
124 | < tr > |
125 | < td >00003</ td > |
126 | < td >鈴木一郎</ td > |
127 | < td >90</ td > |
128 | < td >1,900,000</ td > |
129 | < td >+ 12.0%</ td > |
130 | </ tr > |
131 | < tr > |
132 | < td >00007</ td > |
133 | < td >青山三郎</ td > |
134 | < td >80</ td > |
135 | < td >1,650,000</ td > |
136 | < td >+ 2.0%</ td > |
137 | </ tr > |
138 | < tr > |
139 | < td >00004</ td > |
140 | < td >遠山五郎</ td > |
141 | < td >75</ td > |
142 | < td >1,350,000</ td > |
143 | < td >+ 15.0%</ td > |
144 | </ tr > |
145 | < tr > |
146 | < td >00910</ td > |
147 | < td >柴崎六郎</ td > |
148 | < td >50</ td > |
149 | < td >1,200,000</ td > |
150 | < td >+ 20.0%</ td > |
151 | </ tr > |
152 | </ tdoby > |
153 | </ table > |
154 | </ section > |
155 | </ article > |
こんな感じ。すみません、手抜きで、成績数値は毎月同じです。。月ごとにページを分けて帳票印刷ができるようなイメージです。
ポイントは、ページを分けたいブロックを section で囲っている点。
これを article で括ってあげるとわかりやすいと思います。
当ブログでは、article や section の適切な使い方を紹介している記事もありますので、ご参考ください。
CSSでレイアウトする
HTMLで文書構造ができたら、A4印刷ができるようにスタイルを整えていきます。
1 | < link media = "print" rel = "stylesheet" href = "print.css" > |
この時、「media=”print”」とするのが重要です。
これは、印刷するときにだけ適用させる、というものになります。
そして、先ほどのHTMLのsectionにクラス名をつけます。
001 | < article > |
002 | < section class = "print_pages" > |
003 | < h1 >2017年10月の成績</ h1 > |
004 | < table > |
005 | < thead > |
006 | < tr > |
007 | < th >社員番号</ th > |
008 | < th >名前</ th > |
009 | < th >獲得顧客数</ th > |
010 | < th >売上高</ th > |
011 | < th >売上高前年同期比</ th > |
012 | </ tr > |
013 | </ thead > |
014 | < tbody > |
015 | < tr > |
016 | < td >00001</ td > |
017 | < td >山田太郎</ td > |
018 | < td >100</ td > |
019 | < td >2,000,000</ td > |
020 | < td >+ 10.0%</ td > |
021 | </ tr > |
022 | < tr > |
023 | < td >00003</ td > |
024 | < td >鈴木一郎</ td > |
025 | < td >90</ td > |
026 | < td >1,900,000</ td > |
027 | < td >+ 12.0%</ td > |
028 | </ tr > |
029 | < tr > |
030 | < td >00007</ td > |
031 | < td >青山三郎</ td > |
032 | < td >80</ td > |
033 | < td >1,650,000</ td > |
034 | < td >+ 2.0%</ td > |
035 | </ tr > |
036 | < tr > |
037 | < td >00004</ td > |
038 | < td >遠山五郎</ td > |
039 | < td >75</ td > |
040 | < td >1,350,000</ td > |
041 | < td >+ 15.0%</ td > |
042 | </ tr > |
043 | < tr > |
044 | < td >00910</ td > |
045 | < td >柴崎六郎</ td > |
046 | < td >50</ td > |
047 | < td >1,200,000</ td > |
048 | < td >+ 20.0%</ td > |
049 | </ tr > |
050 | </ tdoby > |
051 | </ table > |
052 | </ section > |
053 | < section class = "print_pages" > |
054 | < h1 >2017年9月の成績</ h1 > |
055 | < table > |
056 | < thead > |
057 | < tr > |
058 | < th >社員番号</ th > |
059 | < th >名前</ th > |
060 | < th >獲得顧客数</ th > |
061 | < th >売上高</ th > |
062 | < th >売上高前年同期比</ th > |
063 | </ tr > |
064 | </ thead > |
065 | < tbody > |
066 | < tr > |
067 | < td >00001</ td > |
068 | < td >山田太郎</ td > |
069 | < td >100</ td > |
070 | < td >2,000,000</ td > |
071 | < td >+ 10.0%</ td > |
072 | </ tr > |
073 | < tr > |
074 | < td >00003</ td > |
075 | < td >鈴木一郎</ td > |
076 | < td >90</ td > |
077 | < td >1,900,000</ td > |
078 | < td >+ 12.0%</ td > |
079 | </ tr > |
080 | < tr > |
081 | < td >00007</ td > |
082 | < td >青山三郎</ td > |
083 | < td >80</ td > |
084 | < td >1,650,000</ td > |
085 | < td >+ 2.0%</ td > |
086 | </ tr > |
087 | < tr > |
088 | < td >00004</ td > |
089 | < td >遠山五郎</ td > |
090 | < td >75</ td > |
091 | < td >1,350,000</ td > |
092 | < td >+ 15.0%</ td > |
093 | </ tr > |
094 | < tr > |
095 | < td >00910</ td > |
096 | < td >柴崎六郎</ td > |
097 | < td >50</ td > |
098 | < td >1,200,000</ td > |
099 | < td >+ 20.0%</ td > |
100 | </ tr > |
101 | </ tdoby > |
102 | </ table > |
103 | </ section > |
104 | < section class = "print_pages" > |
105 | < h1 >2017年8月の成績</ h1 > |
106 | < table > |
107 | < thead > |
108 | < tr > |
109 | < th >社員番号</ th > |
110 | < th >名前</ th > |
111 | < th >獲得顧客数</ th > |
112 | < th >売上高</ th > |
113 | < th >売上高前年同期比</ th > |
114 | </ tr > |
115 | </ thead > |
116 | < tbody > |
117 | < tr > |
118 | < td >00001</ td > |
119 | < td >山田太郎</ td > |
120 | < td >100</ td > |
121 | < td >2,000,000</ td > |
122 | < td >+ 10.0%</ td > |
123 | </ tr > |
124 | < tr > |
125 | < td >00003</ td > |
126 | < td >鈴木一郎</ td > |
127 | < td >90</ td > |
128 | < td >1,900,000</ td > |
129 | < td >+ 12.0%</ td > |
130 | </ tr > |
131 | < tr > |
132 | < td >00007</ td > |
133 | < td >青山三郎</ td > |
134 | < td >80</ td > |
135 | < td >1,650,000</ td > |
136 | < td >+ 2.0%</ td > |
137 | </ tr > |
138 | < tr > |
139 | < td >00004</ td > |
140 | < td >遠山五郎</ td > |
141 | < td >75</ td > |
142 | < td >1,350,000</ td > |
143 | < td >+ 15.0%</ td > |
144 | </ tr > |
145 | < tr > |
146 | < td >00910</ td > |
147 | < td >柴崎六郎</ td > |
148 | < td >50</ td > |
149 | < td >1,200,000</ td > |
150 | < td >+ 20.0%</ td > |
151 | </ tr > |
152 | </ tdoby > |
153 | </ table > |
154 | </ section > |
155 | </ article > |
もちろん、名前はなんでも良いんですけどね。わかりやすく、「print_pages」とでもつけてみました。
さて、CSSです。
01 | .print_pages{ |
02 | /*A4縦*/ |
03 | width : 172 mm; |
04 | height : 251 mm; |
05 | page-break-after : always ; |
06 | } |
07 | /*最後のページは改ページを入れない*/ |
08 | .print_pages:last-child{ |
09 | page-break-after : auto ; |
10 | } |
こんな感じ。
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です。
01 | < style type = "text/css" media = "print" > |
02 | .print_pages{ |
03 | /*A4縦*/ |
04 | width: 172mm; |
05 | height: 251mm; |
06 | page-break-after: always; |
07 | } |
08 | /*最後のページは改ページを入れない*/ |
09 | .print_pages:last-child{ |
10 | page-break-after: auto; |
11 | } |
12 | < style > |
media=”print” でstyleを定義すれば良いです。
他にも、
01 | < style type = "text/css" media = "all" > |
02 | @media print{ |
03 | .print_pages{ |
04 | /*A4縦*/ |
05 | width: 172mm; |
06 | height: 251mm; |
07 | page-break-after: always; |
08 | } |
09 | /*最後のページは改ページを入れない*/ |
10 | .print_pages:last-child{ |
11 | page-break-after: auto; |
12 | } |
13 | } |
14 | </ style > |
という「Media Queries」を使った書き方もいけます。
固定ヘッダー、フッターをつける
印刷する際に、各ページにヘッダーやフッターをつけたい、ということも多いと思います。
先ほどのcssを下記のようにすれば良いです。
01 | .print_pages{ |
02 | /*A4縦*/ |
03 | width : 172 mm; |
04 | height : 251 mm; |
05 | page-break-after : always ; |
06 | position : relative ; |
07 | counter-increment : page_count; |
08 | } |
09 | /*最後のページは改ページを入れない*/ |
10 | .print_pages:last-child{ |
11 | page-break-after : auto ; |
12 | } |
13 | .print_pages:before{ |
14 | position : absolute ; |
15 | right : 0 ; |
16 | top : 0 ; |
17 | color : red ; |
18 | content : "関係者外秘" ; |
19 | } |
20 | .print_pages:after{ |
21 | position : absolute ; |
22 | right : 0 ; |
23 | bottom : 0 ; |
24 | content : counter (page_count) "ページ" ; |
25 | } |
基礎となる、print_pagesのpositionをrelativeにして、ヘッダー、フッターにあたる要素をそれぞれbefore、afterで指定し、position:absoluteで、固定表示する場所を指定します。
今回の例では、フッターにページ数を表示させています。
counter-incrementは、要素の連番カウンタの値を進める際に使用できるものです。ここにカウンタ名を定義(上記の例では、”page_count”)、表示させたい場所に、counter(定義名)で表示できます。
最後に、上記のデモサイトリンクを貼っておきます。ぜひ参考にしてください!
デモサイトはこちらをクリック