🐼
コマンドラインで PDF 文書を2値(白黒)に圧縮する
コピー機でスキャンした PDF 文書のファイルサイズが大きいので,コマンドラインで圧縮する方法を調べた.
今回は ImageMagick というソフトウェアを用いて,グレースケールでスキャンした PDF 文書を2値(白黒)画像で構成された PDF 文書に圧縮する.
必要なもの
- ImageMagick
- pdfimages (あると便利)
pdfimages は Poppler(あるいはそれをバックエンドに用いた PDF ビューア Evince など)をインストールすると,付いてくる.
やり方
まず pdfimages で PDF 文書内の画像の形式や PPI を調べられる.
$ pdfimages -list in.pdf
page num type width height color comp bpc enc interp object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
1 0 image 5732 4054 gray 1 8 jpeg no 25 0 400 400 1384K 6.1%
2 1 image 5732 4054 gray 1 8 jpeg no 29 0 400 400 1460K 6.4%
...
今回はコピー機で 400DPI・グレースケールに設定し,本をスキャンした.画像形式は JPEG になっている.
ImageMagick で PDF 文書を一旦,2値 TIFF 画像に圧縮し,さらに PDF に変換する.density
には先程調べた PPI を指定すればよい.compress
に指定されている group4
は2値画像用の圧縮アルゴリズムで,FAX で利用されているらしい.
magick -density 400 in.pdf -compress group4 tif:- | magick - out1.pdf
$ pdfimages -list out1.pdf
page num type width height color comp bpc enc interp object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
1 0 image 5732 4054 gray 1 1 ccitt no 8 0 400 400 84.3K 3.0%
2 1 image 5732 4054 gray 1 1 ccitt no 22 0 400 400 96.9K 3.4%
...
PPI はそのまま,エンコードが JPEG から CCITT(2値画像)に変換されている.
影によって文字が潰れてしまうような,過剰に黒い場合は閾値 threshold
を下げる.逆に文字が消えてしまうような,過剰に白い場合は threshold
を上げる.
magick -density 400 in.pdf -threshold 40% -compress group4 tif:- | magick - out2.pdf
さらに圧縮したい場合は density
を下げると,PPI を下げることができる.
magick -density 200 in.pdf -compress group4 tif:- | magick - out3.pdf
$ pdfimages -list out3.pdf
page num type width height color comp bpc enc interp object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
1 0 image 2866 2027 gray 1 1 ccitt no 8 0 200 200 43.0K 6.1%
2 1 image 2866 2027 gray 1 1 ccitt no 22 0 200 200 49.5K 7.0%
...
結果
Size | Name |
---|---|
18M | in.pdf |
1.2M | out1.pdf |
1.2M | out2.pdf |
606K | out3.pdf |
PPI そのままで圧縮率は 93% となり,かなりファイルサイズを削減できた.
Discussion