DjVu作成 · 3 min read · Feb 07, 2026

DjVu ドキュメント作成 Linux HOWTO

バージョン 0.2 (2006年7月12日)

1 概要

この文書は、Linuxで高品質なDjVuドキュメントを作成するためのdjvulibreの実装のいくつかの使用法を説明します。DjVu形式は、ビットマップドキュメントの圧縮とハイパーテキスト構造を特徴としています。これは、スキャンしたドキュメントや高解像度の画像を含むデジタルドキュメントを保存および配布するために、世界中の多くのウェブサイトで使用されています。DjVuファイルの利点の1つは、同じ内容のPDFやJPEGファイルよりも著しく小さいことです。これにより、特に科学的な書籍やジャーナルをデジタル化するための便利なツールとなります。

以下では、各ページが単一のJPEGファイルである複数のJPEGファイルからDjVuドキュメントが作成される場合を考慮します。ここでJPEG形式は制限ではなく、例は任意の画像形式をカバーできます。PDFからDjVuへの変換についても説明します。スキャナーソフトウェアの使用については説明しませんので、関連する文書を参照してください。

要件。 djvulibre、jpeg、およびnetpbmパッケージが必要です。saneおよびxpdfパッケージは強く推奨されます。

2 DjVuの作成

2.1 書籍のスキャン

このセクションのために次の状況を仮定します。デジタル形式でスキャンして保存する必要がある書籍があります。簡単のために、書籍の内容はすべて白黒(テキスト、数式、図など)であり、書籍の表紙だけがカラーで印刷されていると仮定します。通常、私たちができることは、ページごとにスキャンして、JPEGやPDFなどの画像形式でページを別々に保存することです。個人的には、JPEGが最良の選択だと思います。しかし、たとえば、圧縮されたTIFFが目的により適している場合、このHOWTOが役立つかもしれません。ただし、この場合、例のスクリプトは少し修正する必要があります。とりあえず、JPEGに固執しましょう。

書籍の状況では、書籍の表紙(および目立つテキストや画像が含まれている場合は裏表紙も)をカラーJPEGファイルとしてスキャンします。次に、残りを白黒JPEGとしてスキャンします。これにより、最適なパフォーマンスが得られます。スキャンした画像を保存する際は、ファイル名に注意してください。DjVuへの変換の目的のために、すべての画像はページの順序を尊重してアルファベット順に配置する必要があります。たとえば、

000.jpg, 001.jpg, 002.jpg, …, 012.jpg

は正しい番号付けであり、

0.jpg, 1.jpg, 2.jpg, …, 12.jpg

は間違っている番号付けです。なぜなら、12.jpgが2.jpgの前に表示されるからです。書籍全体がスキャンされたら、すべての画像ファイルを別のディレクトリに配置します。

スキャナーのデバイス、ソフトウェア、およびスキャン方法によっては、すべてまたは一部のJPEG画像を回転させる必要がある場合があります。通常、いくつかの単純なパターンに従います。以下のjpegsrotateスクリプトは、そのような場合に非常に便利です。たとえば、現在のディレクトリで偶数ページを上下逆に回転させるには、パラメータ–evenを指定して実行します。スクリプトで使用されるjpegtranプログラムは、JPEGを90、180、または270度時計回りに回転させることができます。

#!/bin/bash
#
jpegsrotate
#
if [ -z `which jpegtran` ]; then
  usage
  echo "エラー: jpegtranが必要です"
  echo
  exit 1
fi
shopt -s extglob
DEFMASK="*.jpg"
DEFEVENMASK="*[02468].jpg"
DEFODDMASK="*[13579].jpg"
DEFDEG=270
function usage() {
  echo
  echo "使用法:"
  echo "$0"
  echo "    マスク $DEFMASK のファイルを $DEFDEG 度時計回りに回転させます"
  echo "$0 --even"
  echo "    マスク $DEFEVENMASK の偶数ファイルを180度回転させます"
  echo "$0 --odd"
  echo "    マスク $DEFODDMASK の奇数ファイルを180度回転させます"
  echo "$0 --params \"REGEXP\" (90|180|270)"
  echo "    指定されたアスペクト比で時計回りにマスク REGEXP のファイルを回転させます"
  echo
}
if [ "$1" == "--even" ]; then
  MASK=$DEFEVENMASK
  DEG=180
elif [ "$1" == "--odd" ]; then
  MASK=$DEFODDMASK
  DEG=180
elif [ "$1" == "--params" ]; then
  if [ -n "$2" -a -n "$3" ]; then
    MASK=$2
    DEG=$3
  else
    usage
    exit 1
  fi
elif [ -n "$1" ]; then
  usage
  exit 1
else
  MASK=$DEFMASK
  DEG=$DEFDEG
fi
for i in $MASK; do
  if [ ! -e $i ]; then
    usage
    echo "エラー: 現在のディレクトリにはマスク $MASK のファイルが含まれている必要があります"
    echo
    exit 1
  fi
  echo "$i"
  jpegtran -rotate $DEG $i > $i.rotated
  mv $i.rotated $i
done

2.2 JPEGからビトナルDjVuへ

画像が準備できたら、それぞれをDjVu形式の別々のページに変換する必要があります。DjVuエンコーダー(cjb2やcpaldjvuなど)を使用し、次にdjvmを使用して別々のページを1つのDjVuドキュメントにまとめます。次のスクリプトをany2djvu-bwという名前でどこかに書いてください。たとえば、~/bin/に書きます。ソース画像を含むディレクトリでスクリプトを実行して、別々の白黒ページを変換します。

#!/bin/bash
#
any2djvu-bw
#
if [ -z `which anytopnm` -o -z `which ppmtopgm` -o -z `which pgmtopbm`\
    -o -z `which cjb2` ]; then
  usage
  echo "エラー: anytopnm、ppmtopgm、pgmtopbm、cjb2が必要です"
  echo
  exit 1
fi
shopt -s extglob
DEFMASK="*.jpg"
DPI=300
# 次の行のコメントを解除して、バンドルされたDjVuドキュメントをコンパイルします
#OUTFILE="#0-bw.djvu"
function usage() {
  echo
  echo "使用法:"
  echo
  echo "$0 [\"REGEXP\"]"
  echo "    現在のディレクトリ内のデフォルトマスク $DEFMASK (または提供されたREGEXP) を持つ単一ページを変換します"
  # 次の行のコメントを解除して、バンドルされたDjVuドキュメントをコンパイルします
  # echo "    そしてそれらをdjvuファイル $OUTFILE としてバンドルします"
  echo
}
if [ -n "$1" ]; then
  MASK=$1
else
  MASK=$DEFMASK
fi
for i in $MASK; do
  if [ ! -e $i ]; then
    usage
    echo "エラー: 現在のディレクトリにはマスク $MASK のファイルが含まれている必要があります"
    echo
    exit 1
  fi
  if [ ! -e $i.djvu ]; then
    echo "$i"
    anytopnm $i | ppmtopgm | pgmtopbm -value 0.499 > $i.pbm
# netpbm >= 10.23では、上記の行は次のように置き換えることができます:
#   anytopnm $i | ppmtopgm | pamditherbw -value 0.499 > $.pbm
    cjb2 -dpi $DPI $i.pbm $i.djvu
    rm -f $i.pbm
  fi
done

# 次の行のコメントを解除して、バンドルされたDjVuドキュメントをコンパイルします
#djvm -c $OUTFILE $MASK.djvu

スクリプトを次のように実行すると、

$ ~/bin/any2djvu-bw

デフォルトの動作が行われ、現在のディレクトリ内のすべての画像 *.jpg を単一ページのDjVuファイルに変換し、拡張子 .jpg.djvu を付けます。この動作は、ファイルマスク(オプションのパラメータ)を定義することで変更できます。ディザリング値0.499は実験的に得られたもので、ビトナル画像にとって非常に良い(もし最良でないにしても)設定を表します。また、any2djvu-bwの指定された行のコメントを解除して、スクリプトの単一実行で最終的なバンドルされた白黒DjVuドキュメントをコンパイルすることもできます。そうした場合、カラーのページが必要ない場合は、次のサブセクションを読む必要はありません。

2.3 JPEGから低色彩DjVuへ

次に、表紙と裏表紙から取得したカラー画像を変換する必要があります。表紙が000.jpgに保存され、裏表紙が999.jpgに保存され、各々がせいぜい8トーンを含むと仮定します。前回のany2djvu-bwの実行により、不要なDjVuファイル、すなわち白黒バージョンの000.jpg.djvuと999.jpg.djvuが残りました。これらの2つのファイルを削除します。次に、次のコマンドを実行して、000.jpgと999.jpgの両方をカラーDjVuページに変換します(引用符が必要です)。

$ ~/bin/any2djvu-low "+(000|999).jpg" 8

ここで、any2djvu-lowは以下に示すスクリプトで、~/bin/に書き込む必要があります。

#!/bin/bash
#
any2djvu-low
#
if [ -z `which cpaldjvu` ]; then
  usage
  echo "エラー: cpaldjvuが必要です"
  echo
  exit 1
fi
shopt -s extglob
DEFMASK="*.jpg"
DPI=300
DEFNCOLORS=256
# 次の行のコメントを解除して、バンドルされたDjVuドキュメントをコンパイルします
#OUTFILE="#0-low.djvu"
function usage() {
  echo
  echo "使用法:"
  echo
  echo "$0 [\"REGEXP\" [INT]]"
  echo "    現在のディレクトリ内のデフォルトマスク $DEFMASK (または提供されたREGEXP) を持つ単一ページを変換します"
  echo "    色数 $DEFNCOLORS (デフォルト) または INT (提供された場合) の低色彩djvuドキュメントに"
# 次の行のコメントを解除して、バンドルされたDjVuドキュメントをコンパイルします
# echo "    そしてそれらをdjvuファイル $OUTFILE としてバンドルします"
  echo
}
if [ -n "$1" ]; then
  MASK=$1
  if [ -n "$2" ]; then
    NCOLORS=$2
  else
    NCOLORS=$DEFNCOLORS
  fi
else
  MASK=$DEFMASK
  NCOLORS=$DEFNCOLORS
fi
for i in $MASK; do
  if [ ! -e $i ]; then
    usage
    echo "エラー: 現在のディレクトリにはマスク $MASK のファイルが含まれている必要があります"
    echo
    exit 1
  fi
  if [ ! -e $i.djvu ]; then
    echo "$i"
    cpaldjvu -dpi $DPI -colors $NCOLORS $i $i.djvu
  fi
done

# 次の行のコメントを解除して、バンドルされたDjVuドキュメントをコンパイルします
#djvm -c $OUTFILE $MASK.djvu

カラーDjVuページは、ビトナルエンコーダーcjb2ではなく、低色彩エンコーダーcpaldjvuによって生成されました。時折、cpaldjvuの2色設定を使用すると、cjb2と比較して出力ファイルがわずかに小さくなることがあります。これは、cpaldjvuの場合、黒色がより明るく見えるためです。したがって、通常、ビトナル画像にはcjb2の使用が好まれます。さらに、cpaldjvuを使用してJPEG画像をビトナルDjVuに変換するのは、cjb2を使用する場合の約1.5倍の時間がかかります。

cpaldjvu(デフォルトの色数256を使用)によって生成される出力は、初期のJPEGファイル(16Mカラーでも)とほぼ同じサイズになると予想されるかもしれません。cpaldjvuのオプション-colors nを使用して色数を減らすことは、多くの場合、問題を指数関数的に遅く解決します。たとえば、nを256から16に減らすと、出力がわずか4倍小さくなることがあります。

2.4 DjVuのバインディング

最終ステップは、すべての別々のDjVuページをマルチページDjVuドキュメントにバインドすることです。以下のスクリプトbinddjvuがその作業を行います。

#!/bin/bash
#
binddjvu
#
shopt -s extglob
OUTFILE="#0.djvu"
DEFMASK="*.jpg.djvu"
if [ -n "$1" ]; then
  MASK=$1
else
  MASK=$DEFMASK
fi
djvm -c $OUTFILE $MASK

マルチページDjVuファイル#0.djvuには、より良い意味のある名前を付けることができます。

$ mv #0.djvu thebook.djvu

これで例は完了です。

2.5 PDFからDjVuへ

PDF形式も文書をデジタル化するために使用されます。たとえば、jstor.orgによって、現在もDjVuよりも広く普及しているのは、多くの人々がPDFを読むためのプログラムを持っていて、DjVuを読むためのプログラムを持っていないからです。PDFをDjVuに置き換える理由はいくつかあります。

  1. スキャンした文書では、DjVuのパフォーマンスはPDFよりも明らかに優れています。これが、スキャンしたPDF文書をDjVu形式に変換する意味です。
  2. 単一ページのPDF文書が多数あり、それらをまとめたい場合の別の状況があります。たとえば、インターネットライブラリからダウンロードしたPDF文書のページを取得します。
  3. 単一ページまたはマルチページのPDFを単一のDjVuにマージします。
  4. 一部のスキャナーでは、単一ページのPDFファイルに直接スキャンすることが可能です。再び、PDFをマルチページDjVuにバインドするのが便利です。

以下のスクリプトpdfs2djvuは、上記の各アクションに十分です。デフォルトでは、pdfs2djvuは現在のディレクトリ内のすべての*.pdfファイルをアルファベット順に取得し、単一のマルチページビトナルDjVuファイル#0.djvuを生成します。

#!/bin/bash
#
pdfs2djvu
#
if [ -z `which pdftoppm` -o -z `which cjb2` -o -z `which djvm` ]; then
  echo
  echo "エラー: pdftoppm、cjb2、djvmが必要です"
  echo
  exit 1
fi
shopt -s extglob
OUTFILE="#0.djvu"
DEFMASK="*.pdf"
DPI=600
if [ -n "$1" ]; then
  MASK=$1
else
  MASK=$DEFMASK
fi
for PDF in $MASK; do
  if [ ! -e $PDF ]; then
    echo
    echo "エラー: 現在のディレクトリにはマスク $MASK のファイルが含まれている必要があります"
    echo
    exit 1
  fi
  echo $PDF
  pdftoppm -mono -r 600 -aa yes $PDF $PDF
  for PBM in $PDF*.pbm; do
    echo $PBM
    cjb2 -dpi $DPI $PBM $PBM.djvu
    rm -f $PBM
  done
done
djvm -c $OUTFILE $MASK*.pbm.djvu

スクリプトpdfs2djvuを実行すると、DjVuエンコードされたページが現在のディレクトリに*.pbm.djvuファイルとして残ります。

3 結論

このHOWTOはDjVuの開発者によってではなく、ユーザーによって書かれました。したがって、HOWTOにはいくつかの技術的詳細が欠けている可能性があります。コマンドに関するより技術的な情報が必要な場合は、manページやその他の関連文書を参照してください。Linuxでdjvulibreを使用し始めるすべての人に、非常に有益な

$ man djvu

をお勧めします。


著者: Vladimir Komendantsky

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。