创建DjVu文档Linux HOWTO

创建DjVu文档Linux HOWTO

版本0.2(2006年7月12日)

1剧情简介

本文档介绍了djvulibre实现DjVu在linux中创建优质DjVu文档的一些用途。 DjVu格式具有位图文件压缩和超文本结构。 它被世界各地的许多网站用于存储和分发数字文档,包括扫描文档和高分辨率图片。 DjVu文件的优点之一是它们特别小,通常小于具有相同内容的PDF或JPEG文件。 这使得DjVu成为数字化书籍和期刊,特别是科学书籍的有用工具。

下面就是一个DjVu文件是由多个单独的JPEG文件创建的,每个包含一个页面的情况。 这里JPEG格式不是一个限制,这些例子可以涵盖任意的图像格式。 还讨论了从PDF转换到DjVu。 扫描仪软件的使用没有解释:参考相关文档。

要求。 软件包djvulibrejpegnetpbm是必需的。 强烈推荐使用软件包和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可以很方便。 例如,使用参数运行它 - 即使当前目录中的偶数页面颠倒。 脚本中使用的程序jpegtran可以将JPEG只能顺时针旋转90,180或270度。

#!/bin/bash
#
# jpegsrotate
#

if [ -z `which jpegtran` ]; then
  usage
  echo "Error: jpegtran is needed"
  echo
  exit 1
fi

shopt -s extglob

DEFMASK="*.jpg"
DEFEVENMASK="*[02468].jpg"
DEFODDMASK="*[13579].jpg"
DEFDEG=270

function usage() {
  echo
  echo "usage:"
  echo "$0"
  echo "    rotates files with the mask $DEFMASK by $DEFDEG degrees clockwise"
  echo "$0 --even"
  echo "    rotates even files with the mask $DEFEVENMASK by 180 degrees"
  echo "$0 --odd"
  echo "    rotates odd files with the mask $DEFODDMASK by 180 degrees"
  echo "$0 --params \"REGEXP\" (90|180|270)"
  echo "    rotates files with the mask REGEXP by the given aspect ratio clockwise"
  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 "Error: current directory must contain files with the mask $MASK"
    echo
    exit 1
  fi
  echo "$i"
  jpegtran -rotate $DEG $i > $i.rotated
  mv $i.rotated $i
done

2.2 JPEG到bitonal DjVu

当图像准备就绪时,每个都需要通过DjVu编码器(如cjb2cpaldjvu)转换为DjVu格式的单独页面,然后单独的页面将通过djvm绑定到单个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 "Error: anytopnm, ppmtopgm, pgmtopbm and cjb2 are needed"
  echo
  exit 1
fi

shopt -s extglob

DEFMASK="*.jpg"
DPI=300
# uncomment the following line to compile a bundled DjVu document
#OUTFILE="#0-bw.djvu"

function usage() {
  echo
  echo "usage:"
  echo
  echo "$0 [\"REGEXP\"]"
  echo "    converts single pages with the default mask $DEFMASK (or REGEXP if provided)"
  echo "    in the current directory to single-page black and white djvu documents"
# uncomment the following line to compile a bundled DjVu document
# echo "    and bundles them as a djvu file $OUTFILE"
  echo
}

if [ -n "$1" ]; then
  MASK=$1
else
  MASK=$DEFMASK
fi

for i in $MASK; do
  if [ ! -e $i ]; then
    usage
    echo "Error: current directory must contain files with the mask $MASK"
    echo
    exit 1
  fi
  if [ ! -e $i.djvu ]; then
    echo "$i"
    anytopnm $i | ppmtopgm | pgmtopbm -value 0.499 > $i.pbm
# in netpbm >= 10.23 the above line can be replaced with the following:
#   anytopnm $i | ppmtopgm | pamditherbw -value 0.499 > $.pbm
    cjb2 -dpi $DPI $i.pbm $i.djvu
    rm -f $i.pbm
  fi
done

# uncomment the following line to compile a bundled DjVu document
#djvm -c $OUTFILE $MASK.djvu

如果你运行脚本

$ ~/bin/any2djvu-bw
它将采取默认动作,并尝试将当前目录中的所有图像* .jpg转换为扩展名为.jpg.djvu的单页DjVu文件。您可以通过定义文件掩码(可选参数)来更改此行为。抖动值0.499通过实验获得,代表了非常好的(如果不是最好的)双色图像的设置。您还可以取消注释 any2djvu-bw中的指定行,以在脚本的单个运行中编译最终捆绑的黑色和白色DjVu文档。如果你这样做,如果你不需要任何彩色页面,你可能会跳过下一个小节,说明彩色图像的转换。

2.3 JPEG到低色DjVu

接下来,我们需要转换从前书和后书封面拍摄的彩色图像。 假设前盖存储在000.jpg中 ,后盖存储在999.jpg中 ,并且每个包含不超过8个音调。 之前的任务no2djvu-bw在它之后留下了两个不需要的DjVu文件,即黑白版本000.jpg.djvu999.jpg.djvu 。 删除这两个文件。 然后通过执行以下命令将000.jpg999.jpg转换为彩色DjVu页面(注意,引号是必需的):

$ ~/bin/any2djvu-low "+(000|999).jpg" 8
其中 any2djvu-low是下面给出的脚本,必须写入 〜/ bin /才能执行命令。

#!/bin/bash
#
# any2djvu-low
#

if [ -z `which cpaldjvu` ]; then
  usage
  echo "Error: cpaldjvu is needed"
  echo
  exit 1
fi

shopt -s extglob

DEFMASK="*.jpg"
DPI=300
DEFNCOLORS=256
# uncomment the following line to compile a bundled DjVu document
#OUTFILE="#0-low.djvu"

function usage() {
  echo
  echo "usage:"
  echo
  echo "$0 [\"REGEXP\" [INT]]"
  echo "    converts single pages with the default mask $DEFMASK (or REGEXP if provided)"
  echo "    in the current directory to single-page low colour djvu documents with the"
  echo "    number of colours $DEFNCOLORS (default) or INT (if provided)"
# uncomment the following line to compile a bundled DjVu document
# echo "    and bundles them as a djvu file $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 "Error: current directory must contain files with the mask $MASK"
    echo
    exit 1
  fi
  if [ ! -e $i.djvu ]; then
    echo "$i"
    cpaldjvu -dpi $DPI -colors $NCOLORS $i $i.djvu
  fi
done

# uncomment the following line to compile a bundled DjVu document
#djvm -c $OUTFILE $MASK.djvu

彩色DjVu页面由低色彩编码器cpaldjvu而不是由双色编码器cjb2生成 。 与cjb2相比, 偶尔使用2色设置的cpaldjvu可能会产生略小的输出文件。 这可能发生,因为在cpaldjvu的情况下,黑色似乎更轻。 因此,对于通常看起来更好的黑色颜色的双色图像,cjb2的使用是优选的。 此外,使用cpaldjvu将JPEG图像转换为双重 DjVu比使用cjb2的相同事物大约长1.5倍。

您也可能期望cpaldjvu (默认颜色数256)将产生与初始(甚至16M颜色)JPEG文件大小相同的输出。 在许多情况下,使用cpaldjvu选项减少颜色数量可以解决问题的指数慢,例如,将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的原因。 用DjVu替换PDF有几个原因,其中包括:

  1. 扫描文件上,DjVu的性能比PDF更好。 这就是为什么将扫描的PDF文档转换为DjVu格式是有意义的。
  2. 当我们有很多(单页)的PDF文档要绑定在一起时,还有另一种情况。 例如,从互联网图书馆下载PDF文档的页面。
  3. 将PDF,单页或多页合并到单个DjVu中。
  4. 在某些扫描仪上也可以直接扫描到单页PDF文件。 然后再次在多页DjVu中绑定PDF是方便的。
以下脚本 pdfs2djvu适用于上述每个操作。默认情况下, pdfs2djvu按照字母顺序获取当前目录中的所有 * .pdf文件,并生成一个单页多页的DjVu文件 #0.djvu

#!/bin/bash
#
# pdfs2djvu
#

if [ -z `which pdftoppm` -o -z `which cjb2` -o -z `which djvm` ]; then
  echo
  echo "Error: pdftoppm, cjb2 and djvm are needed"
  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 "Error: current directory must contain files with the mask $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 djvu
任何人开始在linux上使用 djvulibre


作者:Vladimir Komendantsky <MY_LASTNAME at gmail.com>
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏