🐼

コマンドラインで PDF 文書を2値(白黒)に圧縮する

2024/08/28に公開

コピー機でスキャンした 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