PDFとしてスキャナーでスキャンしたけど、そのPDFファイルが大きすぎる時。
オンラインには軽量化をするサイトなどがありますが、大事な書類などアップロードはしたくない場合もあります。
解像度を下げたり、グレースケールにしたりすれば軽くなる場合もありますが、スキャン枚数が多いとスキャンのし直しもしたくない。
ということで今回はLinuxのコマンドラインで軽量化をします。
方法は、PDF→JPG→PDFという風に変換し、JPG化する時に圧縮します。
gs(ghostscrtip)でPDFを直接軽量化する方法もありますが、それだと3段階くらいで解像度を変更することしかできず、細かいクオリティの調整などはできないので、今回は少し手間ですが一旦JPGにして調整してからまたPDFに戻します。
以下のページを参考にしましたhttps://stackoverflow.com/questions/43085889/how-to-convert-a-pdf-into-jpg-with-command-line-in-linux
https://linux.die.net/man/1/pdftoppm#:~:text=Pdftoppm%20converts%20Portable%20Document%20Format,%2C%20PPM%2Droot%2Dnnnnnn.
コマンドまとめ
詳しい解説が必要でない方はコマンドだけどうぞ。
1,PDFを圧縮してjpg画像に出力
pdftoppm -jpeg -jpegopt quality=80 -r 200 input.pdf output
2,jpgをPDFに変換
convert *.jpg output.pdf
手順詳細
1、PDFをJPGに変換、圧縮。
このコマンドでJPGに変換しますが、その際に解像度や圧縮率を設定します。
pdftoppm -jpeg -jpegopt quality=80 -r 200 input.pdf output
quality=80が圧縮率です。100が最高画質、0が最低画質です。軽量化したい度合いによって、60-90くらいの間で圧縮すると良いでしょう。
-r 200が解像度です。これはdpiです。印刷物が300dpi以上、画面上で見るだけのものなら150dpi以上が適切でしょう。デフォルトは150です。
変換の際に他にも-gray(グレースケール)、-scale-to-x number横サイズ、範囲指定、パスワード情報、pngで出力など沢山のオプションがあります。他のオプションはこちらを参考にして下さい。
input.pdfが変換元のPDF名です。
outputは出力先のファイル名です。ここにページ番号が振られます。出力名をoutputにすると
output-01.jpg
output-02.jpg
output-03.jpg
output-04.jpg
という風にページごとに番号が振られて出力されます。
出力された画像を開いてみてクオリティなどチェックしましょう。また各画像の合計がだいたいPDFの合計サイズになるので、容量もそれで良いか見ましょう。圧縮したりなければ元のPDFは残っている状態なので再度設定を変えて変換して下さい。
2,JPGをPDFにまとめる。
出力した画像を開いてみて問題無ければ次に再びひとつのPDFに変換して戻します。
その時使用するコマンドがconvertです。
convert *.jpg output.pdf
もしconvertがインストールされていなければ
sudo apt-get install imagemagick
でインストールして下さい。(convertはimagemagickパッケージに含まれます)
*.jpgで現在のディレクトリーの全てのjpgファイルがひとつのPDFに変換されます。もし特定のjpgファイルだけをPDFにしたい場合はこれを file1.jpg file2.jpgとか、必要に応じて変更して下さい。
3,convertが実行できない場合
convertを使う時PDFアクセスの権限に制限がかかっている場合があります。
その場合実行しようとすると not authorizedなんたらかんたらとでてきます。
これはこのページで解説されていますが、Convertが使用するghostscrtipのバージョン9.24以前のセキュリティホールのためにPDFのアクセス制限がかかっていて、9.24以降であれば(Ubuntu 16.04以降なら大丈夫)セキュリティの問題は解決されているものの、PDFの制限はそのままかかっているかもしれない。とのことです。
その場合は
/etc/ImageMagick-6/policy.xml
をsudo vi などのテキストエディタでひらいて
<policy domain=”coder” rights=”none” pattern=”PDF” />
というラインを
<policy domain=”coder” rights=”read|write” pattern=”PDF” />
に書き換えます。気になるようであれば終了後元に戻して下さい。
以上です。細かく説明すると長くなりましたが、実際にやっていることは結構単純だしすぐにできます。一度スキャンしてしまったあとで色々調整できるので便利ですね!