创建DjVu文档Linux HOWTO
版本0.2(2006年7月12日)
1剧情简介
本文档介绍了djvulibre实现DjVu在linux中创建优质DjVu文档的一些用途。 DjVu格式具有位图文件压缩和超文本结构。 它被世界各地的许多网站用于存储和分发数字文档,包括扫描文档和高分辨率图片。 DjVu文件的优点之一是它们特别小,通常小于具有相同内容的PDF或JPEG文件。 这使得DjVu成为数字化书籍和期刊,特别是科学书籍的有用工具。
下面就是一个DjVu文件是由多个单独的JPEG文件创建的,每个包含一个页面的情况。 这里JPEG格式不是一个限制,这些例子可以涵盖任意的图像格式。 还讨论了从PDF转换到DjVu。 扫描仪软件的使用没有解释:参考相关文档。
要求。 软件包djvulibre , jpeg和netpbm是必需的。 强烈推荐使用软件包和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编码器(如cjb2
或cpaldjvu)
转换为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.djvu
和999.jpg.djvu
。 删除这两个文件。 然后通过执行以下命令将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 "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有几个原因,其中包括:
- 扫描文件上,DjVu的性能比PDF更好。 这就是为什么将扫描的PDF文档转换为DjVu格式是有意义的。
- 当我们有很多(单页)的PDF文档要绑定在一起时,还有另一种情况。 例如,从互联网图书馆下载PDF文档的页面。
- 将PDF,单页或多页合并到单个DjVu中。
- 在某些扫描仪上也可以直接扫描到单页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>