dvipdfmxにてPNGがあると時間がかかる

dvipdfmxにてPNGがあると時間がかかる

- 須山 猛 の投稿
返信数: 5

PNGが大量に含まれているDVIにて、dvipdfmxを実行すると、ものすごい時間がかかるのですが、これは仕方がないのでしょうか?
具体的には、一つのPNGファイルの容量が5メガ程度で、50ファイル程度あると、pdfの生成が完了するまで、約20分程かかります(正確には計っておりませんが……)。

uplatexにてdviの生成にはそれほど時間がかかっておりません(1分程度で終了する)。

なお、pngが含まれていないdviの場合、pdfの生成にはそれほど時間がかからないので、明らかにpng原因であると推測されます。pngが含まれているdviの場合、pdfの生成に時間がかかるのは仕方が無いのでしょうか?

須山 猛 への返信

Re: dvipdfmxにてPNGがあると時間がかかる

- Yamamoto Munehiro "munepi" の投稿
PDFに埋め込む画像ファイルが、どのようなPNGやJPGかどうかにも依るところが大きいですが…、
dvipdfmx による zlib 圧縮レベル(デフォルトは9(最大圧縮))を 3 ぐらいに変えると、
多少なりとも生成されるPDFファイルサイズが増える代わりに、PDF生成時間がそれなりに減るかもしれません。

具体的には、以下のコマンドを試してみてください。

## dvipdfmx -z 9 (最大圧縮)

$ time dvipdfmx foo
$ du -hs foo.pdf

## dvipdfmx -z 3 (ほどほどに圧縮)

$ time dvipdfmx -z 3 foo
$ du -hs foo.pdf

## dvipdfmz -z 0 (無圧縮)

$ time dvipdfmz -z 0 foo
$ du -hs foo.pdf
Yamamoto Munehiro "munepi" への返信

Re: dvipdfmxにてPNGがあると時間がかかる

- 須山 猛 の投稿
早速、-z 3を付けて試したところ、PDFの生成がかなり早くなりました。体感で10倍は速くなったと思います。どうもありがとうございました。
須山 猛 への返信

Re: dvipdfmxにてPNGがあると時間がかかる

- Akira Kakuto の投稿
時間がかかる理由は,サイズを計算するために,runtime に
外部プログラム extractbb が走るからです。何度もコンパイル
を繰り返すような場合,予め全ての png ファイルに対して
extractbb を走らせておいて,.xbb ファイルを作成しておくと,
時間がかからなくなります。
例:
extractbb foo.png
とすると,foo.xbb ができます。
foo.xbb にサイズ情報が書かれているので,runtime には
これを読むだけでよいので,時間がかからないわけです。
須山 猛 への返信

Re: dvipdfmxにてPNGがあると時間がかかる

- Z. R. の投稿

dvipdfmxでもpdfLaTeXでも、「PDFを挿入する」場合には中のバイナリデータがそのまま使われるようです。なので、もし「PNG画像が変更されることがない」のであれば、PNGをPDFにいったん変換してそのPDFを代わりに読み込むことで、時間のかかる処理を一度だけで済ませることができます。

PNGをPDFに変換するのはImageMagickなどのソフトウェアで実現できます(しかしImageMagickを使うと圧縮効率が悪いのでファイルサイズが大きくなるようです)。あるいは

\documentclass{article}
\usepackage{graphicx}
\begin{document}
\includegraphics{image.png}
\end{document}

のようなLaTeXファイルを作ってそれをpdflatexで変換する、という方法もあります。