最終更新:2018-03-27 (火) 01:08:04 (207d)

dvipdfmx はデバイスドライバ.
DVI ファイルから PDF ファイルの作成が可能.
特徴は以下のとおり.

  • color スペシャル
  • PDF, EPS, PNG, JPEG, JPEG 2000, BMP, MetaPost のフォーマットのファイルの埋め込み (EPS に関しては外部ツール、例えば Ghostscript の力を借りる)
  • tpic スペシャルのサポート
  • 日本語 PDF しおりの作成
  • PDF セキュリティ機能の設定


Repository

Changelog

Issues

gnuplot で生成した EPS ファイルを dvipfmx で PDF ファイルにするとズレることがある

Usage

EPSを捨ててPDFにしよう

dvipdfmx は Ghostscript という外部プログラムを起動して EPS 画像を PDF に変換 してます.
そのため,EPS 画像の枚数が多いと DVI → PDF の変換に表示に時間が かかります.
そこで,EPS やその他のファイルも PDF で取り込むようにすると, 変換時間が劇的に短縮されます.

EPS 画像は sh から

for f in `ls *.eps`; do epstopdf $f; done

とすれば全て PDF に変換できます.

ビットマップ画像は以下の img2pdf を ~/bin や /usr/local/bin にコピーするとまとめて PDF に変換できます.

#!/bin/sh
# 実行するには ImageMagick 7 以降の magick コマンドが必要
# 指定されたディレクトリの画像を PDF に変換する
# 自分自身の名前
myname=img2pdf
# ImageMagick
imgtopdf=magick
# 検索する画像の拡張子
suffixes="bmp png jpeg jpg gif tiff tif BMP PNG JPEG JPG GIF TIF"
# 変換後の拡張子
suf=pdf
# ディレクトリ
dir=$1
# BoundingBox を作成するプログラム名
# 第 1 引数が "--help" であれば Usage を表示して終了
if [ "$1" == "--help" ] ; then echo "Usage: img2pdf <directory>"; exit; fi
# ディレクトリが指定されている時はそれを使い,指定されてない時は
# カレント・ディレクトリを画像があるディレクトリする
if [ "$1" == "" ] ; then dir=.; fi
# エラーが発生したかどうかを判断するフラグ
errors=''
# エラーログファイル
rm  -f $myname.log
# 各拡張子について検査すr
for suffix in $suffixes; do
    # ls で検査する.エラーは捨てる
    images=`ls ${dir}/*.$suffix 2>/dev/null`
    if [ "$images" != "" ] ; then
       # 各画像ファイルを PDF 形式に変換
       for image in $images; do
           pdf=${image/$suffix/}${suf}
           cmd="$imgtopdf $image $pdf"
           echo -n "$cmd ... "
           $cmd
       done
    fi
done
# エラーが発生した時はログファイルをまとめて表示.
if [ "$errors" != "" ] ; then
    echo -e "\nimg2pdf error occurred in this(these) file(s)$errors"
    cat $myname.log | sed -e 's/^/   /;'
    echo ""
fi

使い方は簡単で

img2dir

とするとカレント・ディレクトリに存在する画像をすべて PDF に変換します.

img2dir img

として画像があるディレクトリを指定すると img ディレクトリ以下のファイルを 変換します.

実行時間の比較

dvipdfmx + EPS 画像の張り込みだと非常に DVI -> PDF 変換に時間がかかると 思ったので,比較をしてみました.
8 枚の画像を EPS, PDF, png/jpg/bmp で用意し, 以下の条件で実行時間を計測してみました.

  • EPS x 8 張り込み: 100 回 実行 dvipdfmx (EPS -> PDF) の時間
    (for ((i=0;i<100;i++)); {time dvipdfmx list} 2>eps.log)
    grep total eps.log |perl -pe 's/ +/ /g;s/ /,/g;' >|eps.csv
  • PDF x 8 張り込み: 100 回 実行 dvipdfmx (EPS -> PDF) の時間
    (for ((i=0;i<100;i++)); {time dvipdfmx pdf} 2>pdf.log)
    grep total pdf.log |perl -pe 's/ +/ /g;s/ /,/g;' >|pdf.csv
  • img x 8 張り込み: 100 回 実行 dvipdfmx (EPS -> PDF) の時間
    (for ((i=0;i<100;i++)); {time dvipdfmx img} 2>img.log)
    grep total img.log |perl -pe 's/ +/ /g;s/ /,/g;' >|img.csv

結果は次の表の通りです.

フォーマット平均処理時間 (100回試行)比較
全て PDF画像0.09501 sec1
ビットマップ0.23038 sec2.4 倍
全て EPS画像1.20427 sec12.7 倍

明らかに全て PDF に変換し, \includegraphics{hoge.pdf} した方が良い事が 分かりました. dvipdfmx には PDF という新たな教訓が 誕生しました.

font maps for dvipdfmx