Aide:Créer un fichier DjVu/Linux

La bibliothèque libre.
Aller à : Navigation, rechercher

Vous êtes ici : accueil >Aide >Créer un fichier DjVu >Linux

Aide : Manuel de Wikisource

Vous aurez besoin de DjVuLibre qui comprend un visualiseur, et plusieurs utilitaires pour créer et manipuler des fichier Djvu. Vous aurez probablement aussi besoin du logiciel Imagemagick pour convertir d’un format dans un autre et retoucher les scans. L’utilitaire cjb2 permet de créer un fichier DJVU à partir d’un fichier PBM ou TIFF. Il faut donc d’abord convertir vos scans s’ils ne sont dans l’un de ces formats.

Sommaire

[modifier] En ligne de commande

Pdf2djvu et DjVuDigital sont deux utilitaires de conversion en ligne de commande. pdf2djvu est disponible dans les dépôts d’Ubuntu et d’autres distributions. DjVuDigital fait partie des utilitaires de DjVuLibre et se trouve également dans les dépôts d’Ubuntu, mais il exige en outre la compilation de GSDjVu pour fonctionner.

[modifier] Deux programmes tout-en-un

[modifier] pdf2djvu

Dans le cas où votre pdf est déjà de qualité suffisante (complet, détouré, etc.), et que vous n’avez pas de couche texte à ajouter, vous pouvez utiliser directement le paquet pdf2djvu avec la commande :

pdf2djvu -d 300 -o nouveau-fichier.djvu fichier-d-origine.PDF


où « d » (dpi) est la résolution du document d’origine, 300 en général pour un pdf de Gallica. Si la résolution finale est trop faible augmentez ce paramètre à 600 ppp :

pdf2djvu -d 600 -o nouveau-fichier.djvu fichier-d-origine.pdf

Par défaut, pdf2djvu insère dans le fichier DjVu le texte (OCR) du fichier d’origine.

[modifier] DjVuDigital

DjVuDigital nécessite une installation longue et complexe pour les non initiés, car la bibliothèque GSDjVu (un pilote Ghostscript dont il dépend) est sous une licence incompatible avec la GPL et n’est pas redistribuable. De plus, son maniement demande de l’expérience alors que la documentation est restreinte. La compilation et l’installation de la bibliothèque en question sont toutefois expliquées pas à pas dans son readme.

Un tutoriel complet, en anglais, pour installer GSDjVu : http://ubuntuforums.org.

djvudigital --dpi=300 fichier_d’origine.pdf [ficher.djvu]

Défaut : utilitaire non fonctionnel et inutilisable, malgré une meilleure qualité de rendu et une meilleure compression par défaut que pdf2djvu. DjVuDigital ne conserve pas l’OCR d’un fichier et ajoute parfois des carrés blancs sur les images.

[modifier] Avec des scripts

Pour les débutants, vous pouvez voir cette Introduction aux scripts shell et, pour plus bas, une Brève introduction et vue d’ensemble de Perl.


[modifier] script de conversion pour fichiers issus de Google Books

[modifier] Supprimer les marges et créer le DJVU avec un seul script

[modifier] Première solution
  • 1. Récupérez un fichier pdf. Renommez-le clairement si nécessaire. (Par exemple : Plaute.pdf)
  • 2. Créez sur votre ordinateur un nouveau répertoire pour y placer les fac-similés des pages quand ils seront créés. Nommez-le comme le fichier pdf (sans extension).
  • 3. Déposez le fichier.pdf dans ce nouveau répertoire.
  • 4. Ouvrez une console, placez-vous dans le nouveau répertoire contenant le PDF.
  • 5. Tapez la commande pdfimages nom-de-fichier-pdf-avec-son-extension nom-à-donner-aux-fac-similés-qui-vont-se-créer,
    ici : pdfimages Plaute.pdf Plaute
  • 6. Attendez que tous les fac-similés soient créés : ils portent le nom donné ci-dessus suivi d’un numéro à trois chiffres (celui des pages du livre) et ont pour extension pbm.
  • 7. Recopiez-y le script ci-dessous dans un fichier texte simple appelé "monscript" (par exemple avec Kedit), en remplaçant Plaute par le nom de votre fichier. Dans certains cas, vous obtiendrez un fichier inversé : texte blanc sur fond noir. Dans ce cas il faudra enlever -negate et recommencer.
#!/bin/bash
convert -negate Plaute-000.png Plaute-000.pbm
cjb2 -clean Plaute-000.pbm Plaute.djvu
 
for n in `seq 1 9`
do
        i="Plaute-00$n.pbm"
        j=`basename $i .pbm`
        convert -trim -bordercolor white -border 10x10 $j.pbm $j.pbm
        cjb2 -clean $j.pbm $j.djvu
        djvm -i Plaute.djvu $j.djvu
        echo $j
done
for n in `seq 10 99`
do
        i="Plaute-0$n.pbm"
        j=`basename $i .pbm`
        convert -trim -bordercolor white -border 10x10 $j.pbm $j.pbm
        cjb2 -clean $j.pbm $j.djvu
        djvm -i Plaute.djvu $j.djvu
        echo $j
done
for n in `seq 100 421`
do
        i="Plaute-$n.pbm"
        j=`basename $i .pbm`
        convert -trim -bordercolor white -border 10x10 $j.pbm $j.pbm
        cjb2 -clean $j.pbm $j.djvu
        djvm -i Plaute.djvu $j.djvu
        echo $j
done

Ce script traite d’abord les numéros à un chiffre (1 à 9) puis ceux à deux chiffres (10 à 99) puis ceux à 3 chiffres (100 à 421 parce que Plaute.djvu avait 421 pages, donc 421 fac-similés. Vous remplacez bien sûr 421 par le nombre de pages de votre fichier à vous).

  • 8. Dans la console, lancez le script
bash monscript
  • 9. Si vous désirez suivre en direct la création page par page du djvu (le tout peut prendre quelques heures), vous pouvez laisser votre console ouverte et la placer dans un coin de votre écran de façon que la ligne où défilent peu à peu les numéros des images soit placée à ras du bas de l’écran ; vous dimensionnerez ensuite les fenêtres de vos autres activités pour laisser cette ligne visible.
  • 10. Vous pouvez vous occuper à autre chose, le script travaille pour vous.


[modifier] Deuxième solution

[à déplacer à droite]

Transclusion

Source : Wikisource:Scriptorium/Novembre 2008

[modifier] Script Bash de conversion PDF→Djvu

Le script proposé dans la page d’aide à la création d’un fichier Djvu n’est pas assez automatisé (à mon goût). Je vous propose un nouveau script qui détermine le nom du fichier Djvu à partir du nom de fichier PDF, mais également le nombre de pages. Il est donc utilisable tel quel pour tous les fichiers PDF. Il dépend d’ImageMagick, de dejavulibre et de poppler-utils.

#!/bin/sh
#pdf2djvu
 
# vérification du type de fichier
if [ "$(file -bi "$1")" != 'application/pdf' ]; then
        echo "$1" "n’est pas un fichier PDF."
        exit 1;
fi
 
BOOKNAME=$(basename "$1" .pdf)
MAXPAGES=$(pdfinfo "$1"|grep 'Pages'|awk '{print $2}')
 
echo "Livre :" "$BOOKNAME"
echo "Nombre de pages :" "$MAXPAGES"
 
# conversion du PDF en images
pdftoppm -r 300 -mono "$1" "$BOOKNAME"
 
# création de la première page
convert -trim -bordercolor white -border 10x10 "$BOOKNAME"-001.pbm "$BOOKNAME"-001.pbm
cjb2 -clean "$BOOKNAME"-001.pbm "$BOOKNAME".djvu
rm "$BOOKNAME"-001.pbm
 
for n in `seq 2 $MAXPAGES`
do
        # obtention du nom de fichier pbm
        case `expr length $n` in
        1)
                pbmname=`basename "$BOOKNAME"-00$n.pbm .pbm`
                ;;
        2)
                pbmname=`basename "$BOOKNAME"-0$n.pbm .pbm`
                ;;
        3)
                pbmname=`basename "$BOOKNAME"-$n.pbm .pbm`
                ;;
        *)
                exit 1;
                ;;
        esac
 
        # détourage
        convert -trim -bordercolor white -border 10x10 "$pbmname".pbm "$pbmname".pbm
        # conversion au format Djvu
        cjb2 -clean "$pbmname".pbm "$pbmname".djvu
        djvm -i "$BOOKNAME".djvu "$pbmname".djvu
        echo "$pbmname"
        # nettoyage des fichiers intermédiaires
        rm "$pbmname".djvu "$pbmname".pbm
 
done
exit 0;

Copiez ce script dans un fichier pdf2djvu.sh, rendez-le exécutable, puis utilisez-le ainsi : sh pdf2djvu.sh nomdupdfàconvertir.pdf


[modifier] Ajout d’une couche texte

Si vous avez déjà un fichier DJVU, vous pouvez utiliser le script suivant : Utilisateur:Kipmaster/djvu-ocr.

Le script Perl qui suit permet de faire la même chose que le script Bash précédent, mais permet également d’ajouter la couche texte au fichier DjVu.

Comme pour le script Bash, placez ce script dans votre répertoire de travail (contenant le PDF), par exemple sous le nom pdf2djvu, et rendez le exécutable:

chmod +x pdf2djvu

La transformation se fait en deux étapes : extraction de la couche OCR de la source, puis conversion. La couche OCR peut provenir de Gallica (lors de l’enregistrement, choisissez txt comme format et enregistrez la page résultante dans le répertoire contenant le script et le fichier PDF. L’extraction de la couche texte se fait à l’aide de cette commande :

./pdf2djvu gallica2txt LeLivre.html LeLivre.txt

Vous pouvez alternativement réutiliser la couche texte du PDF. Sur Gallica, la couche texte du PDF a parfois certains problèmes de retour à la ligne, préférez donc la version texte téléchargeable si vous le pouvez.

./pdf2djvu pdf2txt LeLivre.pdf LeLivre.txt

La transformation du PDF en DejaVu se fait à l’aide de la commande suivante :

./pdf2djvu mkdjvu LeLivre.pdf LeLivre.djvu LeLivre.txt [dpi]

dpi est optionnel, il permet de jouer sur la taille de l’image. Plus dpi est grand, plus l’image l’est, mais plus le DjVu résultant est volumineux. La valeur par défaut est 300. Le DejaVu résultant ne devrait jamais être plus volumineux que le PDF d’entrée – si c’est le cas, réduisez ce paramètre.

Si le script vous répond « WARNING: Created file seems invalid » à la fin, ne l’envoyez pas sur Commons, et demandez de l’aide à son auteur ou sur le scriptorium.


[modifier] Le script
#!/usr/bin/perl -w
 
use strict;
use feature ’say’;
use Encode;
 
sub escape {
        return sprintf "\\%03o", ord(shift);
}
 
# gallica2txt(html file, text file):
#   Transform the Gallica OCR (in HTML version) text into a suitable .txt
sub gallica2txt {
        my $html = shift;
        my $txt = shift;
 
        open HTML, $html;
        open TXT, ">", $txt;
 
        my $page;
 
        while(<HTML>) {
                next unless m|^<div id="contentPageModeText">$|..m|^</div>$|;
                $page = $1 if m|^<div id="numPageModeText">\D+(\d+)|;
                next if m|^</?div|;
                s|</?span[^>]*>||g;
                s|<br[^>]*>|\n$page: |gi;
                chomp;
                say TXT "$page: $_";
        }
 
        close HTML;
        close TXT;
}
 
# pdf2txt(pdf file, text file)
#    Extract the hidden text layer of the PDF file
sub pdf2txt {
        my $pdf = shift;
        my $txt = shift;
        my $pages = $1 if `pdfinfo "$pdf"` =~ /Pages:\s*(.+)/;
 
        open TXT, ">", $txt;
 
        for(1..$pages) {
                say STDERR;
                open PDF, "pdftotext -layout -f $_ -l $_ \"$pdf\" - |";
                while(my $line = <PDF>) {
                        chomp $line;
                        say TXT "$_: $line";
                }
                close PDF;
        }
 
        close TXT;
}
 
# create_text_layer(djvu file, text):
#   Add text to the hidden text layer of the first page of the djvu file.
#   Create and destroy a temporary file called (djvu file).dsed
sub create_text_layer {
        my $djvu = shift;
        my $text = shift;
        my ($max_x, $max_y) = ($1-1, $2-1) if `djvudump "$djvu"` =~ /DjVu (\d+)x(\d+)/;
        my $dsed = "$djvu.dsed";
 
        # Workaround for MediaWiki bug #21526
        # see https://bugzilla.wikimedia.org/show_bug.cgi?id=21526
        $text =~ s/"(?=\s*\))//g;
 
        $text =~ s/\\/\\134/g;
        $text = encode("ascii", $text, sub { sprintf "\\%03o", shift; });
        $text =~ s/([\001-\037\177"])/escape($1)/ge;
 
        open DSED, ">", $dsed;
        print DSED "(page 0 0 $max_x $max_y \"$text\")";
        close DSED;
 
        system "djvused", $djvu, "-e", "select 1; set-txt ’$dsed’", "-s";
        unlink $dsed;
}
 
my $op = shift;
 
if($op eq "gallica2txt") {
        gallica2txt(shift, shift);
}
elsif($op eq "pdf2txt") {
        pdf2txt(shift, shift);
}
elsif($op eq "mkdjvu") {
        my $pdf = shift;
        my $title = $pdf;
           $title =~ s/\.pdf$//;
        my $out = shift || "$title.djvu";
        my $txt = shift || "$title.txt";
        my $dpi = shift || 300;
 
        my %text_layer;
        if(-f $txt) {
                open TXT, $txt;
                while(<TXT>) {
                        next if !m|^(\d+): (.*)$|;
                        if(defined($text_layer{$1})) {
                                $text_layer{$1} .= "$2\n";
                        }
                        else {
                                $text_layer{$1} = "$2\n";
                        }
                }
                close TXT;
        }
 
        my $maxpages = $1 if `pdfinfo "$pdf"` =~ /Pages:\s*(.+)/;
        for(1..$maxpages) {
                say STDERR;
 
                my $ppm = sprintf "%s-%03d.ppm", $title, $_;
                my $pbm = sprintf "%s-%03d.pbm", $title, $_;
                my $djvu = sprintf "%s-%03d.djvu", $title, $_;
                my $dsed = sprintf "%s-%03d.dsed", $title, $_;
 
                system "pdftoppm", "-r", $dpi, "-f", $_, "-l", $_, $pdf, $title;
                system "convert", "-trim", "-bordercolor", "white", "-border", "10x10", $ppm, $pbm;
                system "cjb2", $pbm, $djvu;
 
                create_text_layer($djvu, $text_layer{$_}) if defined($text_layer{$_});
 
                if($_ == 1) {
                        rename($djvu, $out);
                }
                else {
                        system "djvm", "-i", $out, $djvu;
                        unlink $djvu;
                }
 
                unlink $ppm;
                unlink $pbm;
        }
        system "djvutxt \"$out\" | iconv -f UTF8 -t UTF8 > /dev/null";
 
        say STDERR "WARNING: Created file seems invalid" if($?);
}
else {
        say "Usage:";
        say " Transform the Gallica OCR to a form suitable with mkdjvu";
        say "  $0 gallica2txt [Gallica HTML file] [Output file]";
        say " Extract the hidden text layer of a PDF file to a form suitable with mkdjvu";
        say "  $0 pdf2txt [Gallica HTML file] [Output file]";
        say " Transform a PDF file to a DjVu file";
        say "  $0 mkdjvu [PDF file] [DjVu file] [Text file] [dpi=300]";
}

[modifier] Les utilitaires DjVuLibre

(...) Voir DjVuLibre

  • cjb2
  • c44
  • cpaldjvu
  • csepdjvu

[modifier] djvm

Djvm est un utilitaire en ligne de commande pour manipuler des fichiers djvu (assembler, insérer, supprimer des pages). Il fait partie des utilitaires de DjVuLibre.

[modifier] Supprimer les premières pages publicitaires
  1. Ouvrez une console dans le répertoire de votre fichier djvu.
  2. Tapez dans la console :
djvm -d fichier.djvu 1

ou plus généralement :

djvm -d fichier.djvu <n° de page>

en remplaçant fichier.djvu par le nom de votre fichier, et <n° de page> par le numéro de la page. Appuyez sur la touche Entrée.

C’est tout : la page ou les pages indiquées ont disparu.


[modifier] Avec une interface graphique

[modifier] scantailor et gscan2pdf

(...)

Outils personnels
Espaces de noms

Variantes
Actions
Lire
Contribuer
Imprimer / exporter
Boîte à outils