Documentação · 10 min read · Feb 07, 2026
Criando Documentos DjVu Linux HOWTO
versão 0.2 (12 de julho de 2006)
1 Sinopse
Este documento explica alguns dos usos da implementação djvulibre de DjVu para criar documentos DjVu de qualidade no linux. O formato DjVu apresenta compressão de documentos bitmap e estrutura de hipertexto. É utilizado por numerosos sites ao redor do mundo para armazenar e distribuir documentos digitais, incluindo documentos digitalizados e imagens de alta resolução. Uma das vantagens dos arquivos DjVu é que eles são notavelmente pequenos, muitas vezes menores que arquivos PDF ou JPEG com o mesmo conteúdo. Isso torna o DjVu uma ferramenta útil para digitalizar livros e periódicos, especialmente os científicos.
Abaixo, considera-se o caso em que um documento DjVu é criado a partir de vários arquivos JPEG separados, cada um contendo uma única página. Aqui, o formato JPEG não é uma limitação, e os exemplos podem cobrir formatos de imagem arbitrários. A conversão de PDF para DjVu também é discutida. O uso de software de scanner não é explicado: consulte a documentação relevante.
Requisitos. Os pacotes djvulibre, jpeg e netpbm são necessários. Os pacotes sane e xpdf são altamente recomendados.
2 Criando DjVu
2.1 Digitalizando um livro
Suponha a seguinte situação para esta seção. Temos um livro que precisa ser digitalizado e armazenado em um formato digital. Para simplificar, suponha que todo o conteúdo do livro é preto e branco (texto, fórmulas, diagramas, etc.), exceto pela capa do livro, que é impressa em cores. O que normalmente podemos fazer é digitalizá-lo página por página e armazenar as páginas separadamente em algum formato de imagem, como JPEG ou PDF. Pessoalmente, acredito que JPEG é a melhor escolha. Mas se você achar, por exemplo, que TIFF comprimido é mais adequado para seus propósitos, este HOWTO pode ser útil para você também. No entanto, neste caso, os scripts de exemplo devem ser ligeiramente alterados. Por enquanto, vamos nos manter com JPEG.
Na nossa situação com o livro, digitalizamos a capa frontal do livro (e a contracapa também, se contiver algum texto ou imagem notável) para arquivos JPEG coloridos. Em seguida, digitalizamos o restante em JPEGs preto e branco. Isso deve proporcionar o desempenho ideal. Ao salvar as imagens digitalizadas, preste atenção aos nomes dos arquivos. Para os propósitos de conversão para DjVu, todas as imagens devem ser organizadas alfabeticamente respeitando a ordem das páginas. Por exemplo,
000.jpg, 001.jpg, 002.jpg, …, 012.jpg
é uma numeração correta; e
0.jpg, 1.jpg, 2.jpg, …, 12.jpg
é uma errada porque 12.jpg aparecerá antes de 2.jpg. Uma vez que todo o livro esteja digitalizado, coloque todos os arquivos de imagem em um diretório separado.
Dependendo do dispositivo de scanner, software e método de digitalização, você pode precisar girar todas ou apenas algumas das imagens JPEG, geralmente seguindo algum padrão simples. O script jpegsrotate abaixo pode ser bastante útil nesse caso. Por exemplo, execute-o com o parâmetro –even para girar as páginas pares de cabeça para baixo no diretório atual. O programa jpegtran usado no script pode girar JPEGs apenas em 90, 180 ou 270 graus no sentido horário.
#!/bin/bash
#
# jpegsrotate
#
if [ -z `which jpegtran` ]; then
usage
echo "Erro: jpegtran é necessário"
echo
exit 1
fi
shopt -s extglob
DEFMASK="*.jpg"
DEFEVENMASK="*[02468].jpg"
DEFODDMASK="*[13579].jpg"
DEFDEG=270
function usage() {
echo
echo "uso:"
echo "$0"
echo " gira arquivos com a máscara $DEFMASK em $DEFDEG graus no sentido horário"
echo "$0 --even"
echo " gira arquivos pares com a máscara $DEFEVENMASK em 180 graus"
echo "$0 --odd"
echo " gira arquivos ímpares com a máscara $DEFODDMASK em 180 graus"
echo "$0 --params \"REGEXP\" (90|180|270)"
echo " gira arquivos com a máscara REGEXP pelo dado ângulo no sentido horário"
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 "Erro: o diretório atual deve conter arquivos com a máscara $MASK"
echo
exit 1
fi
echo "$i"
jpegtran -rotate $DEG $i > $i.rotated
mv $i.rotated $i
done2.2 JPEG para DjVu bitonal
Quando as imagens estiverem prontas, cada uma delas precisa ser convertida em uma página separada no formato DjVu por um codificador DjVu, como cjb2 ou cpaldjvu, e então as páginas separadas devem ser agrupadas em um único documento DjVu pelo djvm. Escreva o seguinte script chamado any2djvu-bw em algum lugar, por exemplo, em ~/bin/. Execute o script no diretório que contém as imagens de origem para converter páginas separadas em preto e branco.
#!/bin/bash
#
# any2djvu-bw
#
if [ -z `which anytopnm` -o -z `which ppmtopgm` -o -z `which pgmtopbm`\
-o -z `which cjb2` ]; then
usage
echo "Erro: anytopnm, ppmtopgm, pgmtopbm e cjb2 são necessários"
echo
exit 1
fi
shopt -s extglob
DEFMASK="*.jpg"
DPI=300
# descomente a linha a seguir para compilar um documento DjVu agrupado
#OUTFILE="#0-bw.djvu"
function usage() {
echo
echo "uso:"
echo
echo "$0 [\"REGEXP\"]"
echo " converte páginas únicas com a máscara padrão $DEFMASK (ou REGEXP se fornecido)"
echo " no diretório atual para documentos djvu de página única em preto e branco"
# descomente a linha a seguir para compilar um documento DjVu agrupado
# echo " e os agrupa como um arquivo djvu $OUTFILE"
echo
}
if [ -n "$1" ]; then
MASK=$1
else
MASK=$DEFMASK
fi
for i in $MASK; do
if [ ! -e $i ]; then
usage
echo "Erro: o diretório atual deve conter arquivos com a máscara $MASK"
echo
exit 1
fi
if [ ! -e $i.djvu ]; then
echo "$i"
anytopnm $i | ppmtopgm | pgmtopbm -value 0.499 > $i.pbm
# no netpbm >= 10.23 a linha acima pode ser substituída pela seguinte:
# anytopnm $i | ppmtopgm | pamditherbw -value 0.499 > $.pbm
cjb2 -dpi $DPI $i.pbm $i.djvu
rm -f $i.pbm
fi
done
# descomente a linha a seguir para compilar um documento DjVu agrupado
#djvm -c $OUTFILE $MASK.djvuSe você executar o script como
$ ~/bin/any2djvu-bwele tomará a ação padrão e tentará converter todas as imagens *.jpg no diretório atual em arquivos DjVu de página única com a extensão .jpg.djvu. Você pode mudar esse comportamento definindo uma máscara de arquivo (o parâmetro opcional). O valor de dithering 0.499 foi obtido experimentalmente e representa uma configuração muito boa (se não a melhor) para imagens bitonais. Você também pode descomentar as linhas indicadas em any2djvu-bw para compilar o documento DjVu final em preto e branco em uma única execução do script. Se você fizer isso e se não precisar de páginas coloridas, pode pular a leitura da próxima subseção que fala sobre a conversão de imagens coloridas.
2.3 JPEG para DjVu de baixa cor
Em seguida, precisamos converter imagens coloridas tiradas da capa frontal e traseira do livro. Suponha que a capa frontal esteja armazenada em 000.jpg e a contracapa esteja armazenada em 999.jpg, e cada uma delas contenha não mais do que, digamos, 8 tons. A execução anterior de any2djvu-bw deixou dois arquivos DjVu indesejados após isso, a saber, as versões em preto e branco 000.jpg.djvu e 999.jpg.djvu. Exclua esses dois arquivos. Em seguida, converta tanto 000.jpg quanto 999.jpg em páginas DjVu coloridas executando o seguinte comando (note que as aspas são necessárias):
$ ~/bin/any2djvu-low "+(000|999).jpg" 8onde any2djvu-low é o script dado abaixo que deve ser escrito em ~/bin/ para executar o comando.
#!/bin/bash
#
# any2djvu-low
#
if [ -z `which cpaldjvu` ]; then
usage
echo "Erro: cpaldjvu é necessário"
echo
exit 1
fi
shopt -s extglob
DEFMASK="*.jpg"
DPI=300
DEFNCOLORS=256
# descomente a linha a seguir para compilar um documento DjVu agrupado
#OUTFILE="#0-low.djvu"
function usage() {
echo
echo "uso:"
echo
echo "$0 [\"REGEXP\" [INT]]"
echo " converte páginas únicas com a máscara padrão $DEFMASK (ou REGEXP se fornecido)"
echo " no diretório atual para documentos djvu de página única de baixa cor com o"
echo " número de cores $DEFNCOLORS (padrão) ou INT (se fornecido)"
# descomente a linha a seguir para compilar um documento DjVu agrupado
# echo " e os agrupa como um arquivo 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 "Erro: o diretório atual deve conter arquivos com a máscara $MASK"
echo
exit 1
fi
if [ ! -e $i.djvu ]; then
echo "$i"
cpaldjvu -dpi $DPI -colors $NCOLORS $i $i.djvu
fi
done
# descomente a linha a seguir para compilar um documento DjVu agrupado
#djvm -c $OUTFILE $MASK.djvuAs páginas DjVu coloridas foram produzidas por um codificador de baixa cor cpaldjvu em vez de um codificador bitonal cjb2. Ocasionalmente, cpaldjvu com a configuração de 2 cores pode produzir arquivos de saída ligeiramente menores em comparação com os de cjb2. Isso pode acontecer uma vez que a cor preta parece ser mais clara no caso de cpaldjvu. Portanto, o uso de cjb2 é preferível para imagens bitonais que geralmente parecem melhores quanto mais brilhante for a cor preta. Além disso, a conversão de uma imagem JPEG para um DjVu bitonal usando cpaldjvu leva aproximadamente 1,5 vezes mais tempo do que a mesma coisa usando cjb2.
Você também pode esperar que cpaldjvu (com o número padrão de cores 256) produza uma saída quase do mesmo tamanho que o JPEG inicial (mesmo um JPEG de 16M cores). Reduzir o número de cores usando a opção -colors n de cpaldjvu em muitos casos resolve o problema exponencialmente lento, por exemplo, reduzir n de 256 para 16 pode dar uma saída apenas 4 vezes menor.
2.4 Vinculando DjVu
O passo final é vincular todas as páginas DjVu separadas em um documento DjVu de múltiplas páginas. O seguinte script binddjvu faz isso.
#!/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 $MASKO arquivo DjVu de múltiplas páginas #0.djvu pode receber um nome melhor e mais significativo:
$ mv #0.djvu o_livro.djvuE terminamos com nosso exemplo.
2.5 PDF para DjVu
O formato PDF também é utilizado para digitalizar documentos, por exemplo, pelo jstor.org, e atualmente ainda é mais amplamente difundido do que o DjVu apenas pelo motivo de que muitas pessoas têm programas para ler PDF e não têm nada para ler DjVu. Existem várias razões para substituir o PDF pelo DjVu, incluindo as seguintes:
- Em documentos digitalizados, o desempenho do DjVu é estritamente melhor do que o do PDF. É por isso que faz sentido converter um documento PDF digitalizado para o formato DjVu.
- Há outro tipo de situação em que temos muitos documentos PDF (de página única) que queremos vincular juntos. Por exemplo, pegue páginas de um documento PDF baixado de uma biblioteca da internet.
- Mesclando PDFs, de página única ou de múltiplas páginas, em um único DjVu.
- Também em alguns scanners é possível digitalizar diretamente para arquivos PDF de página única. Então, novamente, é conveniente vincular PDFs em um DjVu de múltiplas páginas.
O seguinte script pdfs2djvu é suficiente para cada uma das ações acima. Por padrão, pdfs2djvu pega todos os arquivos *.pdf no diretório atual na ordem alfabética e produz um único arquivo DjVu bitonal de múltiplas páginas #0.djvu.
#!/bin/bash
#
# pdfs2djvu
#
if [ -z `which pdftoppm` -o -z `which cjb2` -o -z `which djvm` ]; then
echo
echo "Erro: pdftoppm, cjb2 e djvm são necessários"
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 "Erro: o diretório atual deve conter arquivos com a máscara $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.djvuApós a execução, o script pdfs2djvu deixa páginas codificadas em DjVu como arquivos *.pbm.djvu no diretório atual.
3 Considerações finais
Este HOWTO foi escrito não por um desenvolvedor do DjVu, mas por um usuário. Portanto, o HOWTO pode carecer de alguns detalhes técnicos. Se você deseja obter mais informações técnicas sobre os comandos, consulte as páginas de manual ou qualquer outra documentação relevante. Eu sugeriria um muito instrutivo
$ man djvua todos que estão começando a usar djvulibre no linux.
Autor: Vladimir Komendantsky
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.