紙をスキャンせずに写真でPDFを作るときの注意
書類を撮った写真をPDFにまとめる、という使い方は多い。このとき、元の画像をJPEGで渡すかPNGで渡すかで、出来上がるPDFのサイズが5倍変わる。
同じ画像を両方の形式で保存して、それぞれPDFにして測った。
| 入れた形式 | 元のサイズ | PDFのサイズ | 元との比 | PDF内の圧縮方式 |
|---|---|---|---|---|
| JPEG | 410,543 B | 411,489 B | 100% | DCTDecode |
| PNG | 2,787,360 B | 2,103,652 B | 75% | FlateDecode |
中身はまったく同じ写真だ。 それでも PDF は 411KB と 2,104KB に分かれた。
JPEGはそのまま入る
右端の列が答えになっている。
DCTDecode は、JPEGの圧縮方式そのものだ。PDFはこの方式を中に持てるので、JPEGを入れるときは圧縮されたバイト列をほどかずに、そのまま抱え込む。だから元の410KBが、ほぼそのまま411KBになる。増えた1KB弱はページの管理情報だ。
一方 FlateDecode は、PNGなどで使われる可逆圧縮だ。PNGを入れるときは、一度展開して画素に戻し、可逆のまま詰め直す。
可逆ということは、情報を1つも捨てないということでもある。捨てないので、劇的には小さくならない。
つまりPDFに入れた時点の大小は、元の画像が非可逆か可逆かでほぼ決まる。
写真はJPEGで渡す
実用的な結論はこれだけだ。
- 写真 → JPEG。そのまま入るので、元のファイルサイズがそのまま効く
- スクリーンショットや図 → PNGのままでいい。
もともと小さいので、展開して入れ直しても大きくならない
これは画像形式の使い分けの話とまったく同じ結論で、PDFにするときも判断は変わらないということになる。
注意が1つある。すでにJPEGになっている写真を、PNGに変換してから入れるのは損だ。JPEGの時点で捨てられた情報は戻らないのに、ファイルだけが大きくなる。「PNGのほうが高画質だから」と変換すると、画質はそのままでサイズだけ5倍になる。
ページサイズが、実質の解像度を決める
もう1つ、見落としやすい点がある。
PDFの中で画像は「このページのこの範囲に描く」という形で置かれる。つまり画像の画素数は変わらないまま、印刷される大きさだけが変わる。結果として、実質の解像度(dpi)はページサイズで決まる。
1600×1200ピクセルの画像を例にすると、こうなる。
| ページの作り方 | ページの大きさ | 実質の解像度 |
|---|---|---|
| 画像に合わせる | 1600 × 1200 pt | 72 dpi |
| A4縦に収める | 595 × 842 pt | 約 194 dpi |
| A4横に収める | 842 × 595 pt | 約 137 dpi |
同じ画像なのに、3倍近く違う。
「画像に合わせる」は、1ピクセルを1ポイントとして置く設定になる。PDFの1ポイントは1/72インチなので、そのまま72dpiだ。画面で見るぶんには問題ないが、印刷すると粗い。
紙に出す予定があるなら、A4など決まった用紙サイズに収めるほうがいい。同じ画素数が狭い面積に詰め込まれるので、実質の解像度が上がる。
印刷の目安は300dpiと言われる。1600×1200をA4縦に収めても194dpiなので、文字が小さい書類だと読みにくいことがある。撮る段階で解像度を上げておくしかない。
スキャナで作ったPDFとの違い
スキャナやコピー機が出すPDFは、見た目が似ていても中身の作りが違うことが多い。
多くの機種は、取り込んだ画像を内部でJPEGや、白黒2値向けの方式に変換してからPDFに入れている。解像度も200dpiや300dpiといった決まった値で取り込んでいる。
写真から作る場合は、そうした調整が挟まらない。撮影時の画素数と、指定したページサイズが、そのまま結果になる。軽くしたいなら、PDFにする前に画像の側で小さくしておく必要がある。
まとめ
- JPEGはそのまま入り、PNGは展開して入れ直される。 同じ写真で5倍違った
- 写真はJPEGのまま渡す。 PNGに変換してから入れると、画質はそのままで重くなるだけ
- ページサイズが実質の解像度を決める。 「画像に合わせる」は72dpiになる
- 印刷する予定があるなら、用紙サイズに収めるほうが精細になる
計測の条件
1600×1200のノイズ混じりの画像を、JPEG(品質85)とPNGで保存し、pdf-lib(このサイトのツールが使っているもの)で1ページのPDFにした。圧縮方式は、生成されたPDFのバイト列から /Filter を読み取った。実質の解像度は、画像の画素数をページの大きさ(1pt = 1/72インチ)で割って求めた。