PDFのネガポジ反転(白黒反転)

僕の講義資料は黒背景に白文字になっていて、これは授業中にどうもそちらの方が見やすそうだと思ったからなのだが、そこには「印刷するとインクの使用量が膨大になる」、「メモの書き込みが事実上できない」という2点の大きな問題があり、授業アンケートには「講義資料がかっこいい」「講義資料が黒背景のためメモができない」という相反するコメントが必ずつく。

しかし、実はただ反転して印刷するだけであれば、Adobe Acrobatで印刷用にネガポジ反転することはできる(設定からカラー設定にコンポジットグレーを選択してネガにチェックを入れる)のだけれど、それをPDFとして保存することはできない。(PDF保存はプリントではなく保存を使えと言われるが保存時にそんな面白機能は提供されていない)

仕方ないのでなんとかする。

流れとしては、「1. PDFを複数の画像ファイルに分解」「2. Imagemagickでネガポジ反転した画像を作成する処理を枚数分ループさせる」「3. Imagemagickで画像をPDFにまとめ直す」、それができたら最後に関数化してシェルスクリプトにまとめる。面倒だから普段通りPythonで書いてもよかったんだけど練習も兼ねて。ちなみに今回はmacOSを想定しています。

PDFを画像で吐き直す

まずこれまで資料はKeynoteからPDFで吐いていたのだが、それをjpegで吐く。既にあるPDFであればAcrobatあたりの「PDFを書き出し」で画像で吐けばよい。(もしくはどうせ後からImagemagickを使うのでconvertでバラしてもよい)

HomebrewとImagemagickを入れる

画像のネガポジ反転にはImagemagickのconvertを使うのが一番楽そうなので、Imagemagickを入れるためにまずhomebrewをインストールする。brewは便利。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

無事に入ったら

brew install imagemagick

でImagemagickを入れる。

試しにファイルを一つネガポジ反転してみる。元ファイルを1.jpg、ネガポジ処理後のファイルをn1.jpgとすると、convertとオプションnegateで、

convert slide001.jpg -negate np1.jpg

こんな感じ。変換は一瞬で終わり、下の画像で左→右に。

メモだけ考えればまあおかしくはないけどなんかちょっと怖い。

ネガポジ+モノクロ二値化

明らかにやりすぎだけど一旦やってみる。

convert slide001.jpg -negate -monochrome np1.jpg

画質が落ちたように見える。

ネガポジ+グレースケール

convert slide001.jpg -negate  -type GrayScale np1.jpg

まあ初めからこれが正解なのはわかっていたんですけど。

シェルスクリプトにしてみる

#!/bin/sh

cd "YOUR_DIRECTORY_HERE"
i=0
for pathfile in `ls *.jpeg`; do
    i=`expr $i + 1`
    echo $i $pathfile
    if [ $i = 1 ]; then
        cp $pathfile np01.jpg
        continue
    fi
    if [ $i -lt 10 ]; then
        convert $pathfile -negate -type GrayScale np0${i}.jpg
    else
        convert $pathfile -negate -type GrayScale np${i}.jpg
    fi
done
convert np*.jpg np.pdf

いかに僕がシェルスクリプトを書いたことがないかがよくわかる。

ちなみに実行前に、

chmod 755 negaposi.sh

で権限振っとかないと走りません。

中でやっている処理はそう難しくなく、ディレクトリ内の全jpegファイル(keynoteから吐き出される画像は拡張子がjpgではなくjpegになってる)を取得して、順番にネガポジグレースケールにconvertしていくんだけど、その際に一点だけネーミングの問題がある。普通に1.jpg, 2.jpg…と付けていくと、最終的なPDF化の際にconvert関数が1.jpg, 11.jpg, 12.jpg…と先頭の数字の大小でページをソートするので、桁は0埋めする必要がある。(今回はスライドが99枚までしかない想定。そこも一般化すべきだけど時間がないので省略)

最後にさらにconvertで変換後のjpgファイルを全部突っ込んでPDFで吐かせれば終わり。

あとはディレクトリを引数で指定する形に書き換えてmacOSのショートカットかAlfredで実行できるようにでもすれば利便性も高まる。っていうか自分が使いやすいようにpythonに書き換えようかな。

…明日も授業なのに午前4時に何をしているんですかね。