cmap-info - CMap のバージョン情報等を表示

[2010/9/3新規]

はじめに

最近さまざまなソフトウェアで Adobe CMap を同梱していることを見かけるようになりました。例えば、gs8, texlive, poppler 等々です。置き場所がそれぞれ異なるので、同じものならシンボリックリンクにして無駄を省きたいところです。それに、バージョンの古いCMapがインストールされていたりすることも気になります。

そこで、CMapのバージョン情報などを表示したり、調査したりするシェル/ポストスクリプトコード cmap-info を書いてみました。

使い方

単に CIDSystemInfo(Registry-Ordering-Supplement)、CMapName、CMapVersion を表示させたい場合は、以下のようにします。
$ cmap-info --no-filename /opt/local/gs8.64/share/ghostscript/8.64/Resource/CMap/Adobe-Japan1-UCS2
Adobe-Adobe_Japan1_UCS2-4	Adobe-Japan1-UCS2	5.001
詳細な情報を表示させたいなら、以下のように --detail オプションを使います。
$ cmap-info --detail /opt/local/gs8.64/share/ghostscript/8.64/Resource/CMap/Adobe-Japan1-UCS2
FileName:	/opt/local/gs8.64/share/ghostscript/8.64/Resource/CMap/Adobe-Japan1-UCS2
CMapType:	1 
CMapName:	/Adobe-Japan1-UCS2 
CIDSystemInfo:	<< /Ordering (Adobe_Japan1_UCS2) /Supplement 4 /Registry (Adobe) >> 
CMapVersion:	5.001 
XUID:	[ 1 10 25335 1212 ] 
WMode:	0 
さらに、複数の CMap の置き場所のすべてのファイルを指定して、それをパイプ(|sort|less)で表示することで、以下のように簡単にバージョンの比較ができます。
$ cmap-info /opt/local/gs7.07/share/ghostscript/Resource/CMap/* /opt/local/gs8.64/share/ghostscript/8.64/Resource/CMap/* /opt/local/ptetex3/share/texmf/fonts/cmap/*/* /opt/local/share/poppler/cMap/*/*|sort|grep Adobe-Japan1-UCS2|less
	:
Adobe-Adobe_Japan1_UCS2-4	Adobe-Japan1-UCS2	5.001	/opt/local/gs8.64/share/ghostscript/8.64/Resource/CMap/Adobe-Japan1-UCS2
Adobe-Adobe_Japan1_UCS2-4	Adobe-Japan1-UCS2	5.001	/opt/local/ptetex3/share/texmf/fonts/cmap/ptetex/Adobe-Japan1-UCS2
Adobe-Adobe_Japan1_UCS2-6	Adobe-Japan1-UCS2	8.0	/opt/local/gs7.07/share/ghostscript/Resource/CMap/Adobe-Japan1-UCS2
Adobe-Adobe_Japan1_UCS2-6	Adobe-Japan1-UCS2	8.002	/opt/local/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-UCS2
	:
さらに、重複する CMapName のうち古い CMapVersion のものを除外する --newest-only オプションによって、最新の CMap を調査できます。
$ cmap-info --newest-only /opt/local/gs7.07/share/ghostscript/Resource/CMap/* /opt/local/gs8.64/share/ghostscript/8.64/Resource/CMap/* /opt/local/ptetex3/share/texmf/fonts/cmap/*/* /opt/local/share/poppler/cMap/*/*|sort|less
	:
Adobe-Adobe_Japan1_UCS2-6	Adobe-Japan1-UCS2	8.002	/opt/local/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-UCS2
Adobe-Adobe_Korea1_H_CID-0	Adobe-Korea1-H-CID	2.002	/opt/local/share/poppler/cMap/Adobe-Korea1/Adobe-Korea1-H-CID
Adobe-Adobe_Korea1_H_Host-0	Adobe-Korea1-H-Host	4.002	/opt/local/share/poppler/cMap/Adobe-Korea1/Adobe-Korea1-H-Host
Adobe-Adobe_Korea1_KSCms_UHC-1	Adobe-Korea1-KSCms-UHC	4.003	/opt/local/share/poppler/cMap/Adobe-Korea1/Adobe-Korea1-KSCms-UHC
Adobe-Adobe_Korea1_KSCpc_EUC-1	Adobe-Korea1-KSCpc-EUC	4.003	/opt/local/share/poppler/cMap/Adobe-Korea1/Adobe-Korea1-KSCpc-EUC
Adobe-Adobe_Korea1_UCS2-2	Adobe-Korea1-UCS2	8.0	/opt/local/gs7.07/share/ghostscript/Resource/CMap/Adobe-Korea1-UCS2
	:

逆に、重複する CMapName のうち古い CMapVersion のもののみを表示する--obsolete-only オプションによって、古い CMap を調査できます。sort して見るには --no-cidsysteminfo オプションを併用するとよいでしょう。
cmap-info --obsolete-only --no-cidsysteminfo /opt/local/gs7.07/share/ghostscript/Resource/CMap/* /opt/local/gs8.64/share/ghostscript/8.64/Resource/CMap/* /opt/local/ptetex3/share/texmf/fonts/cmap/*/* /opt/local/share/poppler/cMap/*/*|sort|less
	:
Adobe-Japan1-UCS2	5.001	/opt/local/gs8.64/share/ghostscript/8.64/Resource/CMap/Adobe-Japan1-UCS2
Adobe-Japan1-UCS2	5.001	/opt/local/ptetex3/share/texmf/fonts/cmap/ptetex/Adobe-Japan1-UCS2
Adobe-Japan1-UCS2	8.0	/opt/local/gs7.07/share/ghostscript/Resource/CMap/Adobe-Japan1-UCS2
Adobe-Japan2-0	9.001	/opt/local/gs7.07/share/ghostscript/Resource/CMap/Adobe-Japan2-0
Adobe-Korea1-0	9.001	/opt/local/gs7.07/share/ghostscript/Resource/CMap/Adobe-Korea1-0
Adobe-Korea1-1	10.001	/opt/local/gs7.07/share/ghostscript/Resource/CMap/Adobe-Korea1-1
Adobe-Korea1-2	1.0	/opt/local/gs7.07/share/ghostscript/Resource/CMap/Adobe-Korea1-2
Adobe-Korea1-H-CID	2.0	/opt/local/gs8.64/share/ghostscript/8.64/Resource/CMap/Adobe-Korea1-H-CID
Adobe-Korea1-H-CID	2.001	/opt/local/gs7.07/share/ghostscript/Resource/CMap/Adobe-Korea1-H-CID
Adobe-Korea1-H-Host	4.0	/opt/local/gs8.64/share/ghostscript/8.64/Resource/CMap/Adobe-Korea1-H-Host
Adobe-Korea1-H-Host	4.001	/opt/local/gs7.07/share/ghostscript/Resource/CMap/Adobe-Korea1-H-Host
Adobe-Korea1-KSCms-UHC	4.002	/opt/local/gs7.07/share/ghostscript/Resource/CMap/Adobe-Korea1-KSCms-UHC
Adobe-Korea1-KSCpc-EUC	4.002	/opt/local/gs7.07/share/ghostscript/Resource/CMap/Adobe-Korea1-KSCpc-EUC
Adobe-Korea1-UCS2	5.0	/opt/local/gs8.64/share/ghostscript/8.64/Resource/CMap/Adobe-Korea1-UCS2
Adobe-Korea1-UCS2	5.001	/opt/local/share/poppler/cMap/Adobe-Korea1/Adobe-Korea1-UCS2
	:
そして、最新のCMapと古いCMapについてをまとめて表示する --obsolete-infoオプションによって、より詳しい新旧の CMap を調査できます。この場合、見ての通り sort して見るのは適切ではありません。
$ cmap-info --obsolete-info --no-cidsysteminfo /opt/local/gs7.07/share/ghostscript/Resource/CMap/* /opt/local/gs8.64/share/ghostscript/8.64/Resource/CMap/* /opt/local/ptetex3/share/texmf/fonts/cmap/*/* /opt/local/share/poppler/cMap/*/*|less
	:
-Adobe-Japan1-UCS2	5.001	/opt/local/gs8.64/share/ghostscript/8.64/Resource/CMap/Adobe-Japan1-UCS2
+Adobe-Japan1-UCS2	8.002	/opt/local/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-UCS2
-Adobe-Japan1-UCS2	8.0	/opt/local/gs7.07/share/ghostscript/Resource/CMap/Adobe-Japan1-UCS2
+Adobe-Japan1-UCS2	8.002	/opt/local/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-UCS2
-Adobe-Japan1-UCS2	5.001	/opt/local/ptetex3/share/texmf/fonts/cmap/ptetex/Adobe-Japan1-UCS2
+Adobe-Japan1-UCS2	8.002	/opt/local/share/poppler/cMap/Adobe-Japan1/Adobe-Japan1-UCS2
	:
以上のように、CMapファイル群を適切に管理するのに使えそうなスクリプトだと考えますが、如何でしょうか。

但し、PostScriptインタープリタである gs コマンドに処理をさせており、きちんとした CMap でない場合は処理が失敗します。そういった想定外の CMap ファイルはシェルスクリプトではじくようにしてあります。

Written by Taiji Yamada