PNGファイルとJPGファイルをPDFファイルへ変換.Windows版のImageMagickをVimとWindows PowerShellで使うことを考える

2023/03/03
非常にタイトルが長い…….そして記事も恐らく長い.
この記事では,Windows版のImageMagickとVim,Windows PowerShellで使って
PNGファイルとJPGファイルをPDFファイルへ変換することを試みる.


1 動機・経緯

LuaLaTeXを使っていて,特に大きな画像ファイルを組み込んだ文書のコンパイルが遅いことに困っている.

あまりに遅いので,Vim上からコンパイルをするときは,次のコマンドをVimのコマンドモードで使って,Vimとは別プロセスで行っている*1
これなら編集しているtexファイルを上書き保存さえしなければ,コンパイル中も編集作業が続けられるのだ.
:!Start-Process  {.\lualatex-set.bat} -WindowStyle Minimized
“lualatex-set.bat”の中身はこんな感じである.
lualatex.exe text.tex
mendex.exe -s text.ist text.idx
pbibtex.exe text
lualatex.exe text.tex
lualatex.exe text.tex
索引と参考文献を出力するために,コマンドを複数回実行している.
体感では2~3分かかる(型落ちノートPCでやっているというのもあるが……).
TeXは経験上バグ出しが大変なので,こまめに保存・コンパイルを行ってエラーが出たらすぐ対処するようにしている.
この時間は,下手をしたら次の上書き保存をしたくなる長さだ.

コンパイルに時間が掛かっているのは画像をPDFに埋め込む処理である.
これは最初から画像ファイルをPDFに変換しておくことで解決するらしい(PDF画像は再処理しない挙動らしい).
よって,画質設定が自由(そう)で一括処理ができるツールが欲しい……,やはりImageMagickか,ということになった.
Windows版の,それも最近のバージョンのImageMagickは使ったことがなかったので,調べてメモった.

*1 : これを実行するには,事前に“set shell=powershell.exe”をVimに設定しておかなければならない.

2 ImageMagickのインストール

これは,公式サイトから最新のWindows版インストーラーを引っ張ってきて実行すれば解決する.
記事を書くのに使ったバージョンは“ImageMagick-7.1.0”,インストーラーのファイル名は“ImageMagick-7.1.0-62-Q16-HDRI-x64-dll.exe”だった.
バージョン7以降のImageMagickということにご留意願いたい.OSはWindows 10 Pro 22H2を使用した.

3 WindowsでのImageMagickの実行

PowerShellを起動して,ImageMagickのヘルプとバージョンを表示させてみる.
下のような結果が表示されていれば,インストールはできている.
PS C:\Users\hirayma> magick.exe -help
Usage: magick.exe tool [ {option} | {image} ... ] {output_image}
Usage: magick.exe [ {option} | {image} ... ] {output_image}
       magick.exe [ {option} | {image} ... ] -script {filename} [ {script_args} ...]
       magick.exe -help | -version | -usage | -list {option}

PS C:\Users\hirayama> magick.exe -version
Version: ImageMagick 7.1.0-62 Q16-HDRI x64 32ce406:20230212 https://imagemagick.org
Copyright: (C) 1999 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI Modules OpenCL OpenMP(2.0)
Delegates (built-in): bzlib cairo flif freetype gslib heic jng jp2 jpeg jxl lcms lqr lzma openexr pangocairo png ps raqm raw rsvg tiff webp xml zip zlib
Compiler: Visual Studio 2022 (193431937)
PS C:\Users\hirayama>
昔のImageMagickは“convert.exe”,“mogrify.exe”等のプログラムへ機能ごとに分割されていた(ImageMagickとは画像処理を行うCUIプログラムのセットだった).
ImageMagickの中で最も多用する“convert.exe”は,元々Windowsに標準実装されている“convert.exe”コマンド
(FAT系のファイルシステムをNTFSに変換する結構危ないコマンド)と同名で紛らわしく,不便だったためか,
ImageMagickバージョン7以降は“magick.exe”というプログラムに一本化され,それにオプションをつけて使うことが基本になったようである.
Windowsではこの方法しか受け付けない*2

*2 : Linuxでは従来のコマンドも(当面は)サポートされるようである.

4 あるディレクトリ内のPNGファイルを一括でPDFへ変換

変換したい元の画像は次のようなリモートデスクトップ接続の表示画面である.このような形式が決まったファイルが数十枚ある.
サイズは1442x932.これのリモートデスクトップ接続のウィンドウと,タスクバーをクロップしたい.

sampleDesktop.png


ウィンドウの高さが31,タスクバーの高さが41だったので,
それを反映すると,対象画像が入っているディレクトリへPowerShellで入って,次のコマンドを実行することになる.
magick.exe mogrify -colorspace CMYK -crop 1442x860!+0+31 -format pdf *png
結果のPDFはこちら.ちゃんとクロップできている.
“magick mogrify”は,同じ処理を対象フォルダの同一拡張子をもったファイル全てに適用するコマンドなので,このたった1行のコマンドで,やりたい処理が完結してしまう.
なお,“-colorspace CMYK”というのは通常のRGB色空間から印刷用のCMYK色空間へ変換するオプションである(PDFはCMYKに対応しているため).