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
done

2.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.djvu

Se você executar o script como

$ ~/bin/any2djvu-bw

ele 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" 8

onde 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.djvu

As 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 $MASK

O arquivo DjVu de múltiplas páginas #0.djvu pode receber um nome melhor e mais significativo:

$ mv #0.djvu o_livro.djvu

E 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:

  1. 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.
  2. 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.
  3. Mesclando PDFs, de página única ou de múltiplas páginas, em um único DjVu.
  4. 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.djvu

Apó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 djvu

a todos que estão começando a usar djvulibre no linux.


Autor: Vladimir Komendantsky

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.