Ouvrir le menu principal
poubelleCette page est proposée dans la liste des pages à supprimer, vous êtes invité à donner votre avis sur cette proposition.


Outil écrit par JeanBono.

DescriptionModifier

Télécharge dans la résolution la plus élevée disponible les images des livres numérisés par Gallica.

PrérequisModifier

Serveur web avec PHP et module ImageMagick.

UtilisationModifier

Entrez une adresse du type :

http://gallica.bnf.fr/proxy?method=R&ark=btv1b55005208r.f1&l=6&r=4864,6656,256,256

obtenue en zoomant sur le coin de l’image en bas à droite, puis en cliquant droit > afficher l’image. Le numéro de la page dans l’adresse (du type « .f1 ») n’a pas d’importance.

Pages : numéro de la dernière page.

Pour ne télécharger qu'un ensemble de pages, remplacez le « 1 » à la ligne 46 : for($w=1;$w<=$pages;$w++) par le numéro de la page où commencer le téléchargement, et entrez dans la boîte le numéro de la dernière page à télécharger.

Remarque : les images téléchargées en même temps doivent avoir la même résolution. Dans certains cas, des images, comme la couverture, devront être téléchargées à part.

L’outil génère également une description pour Commons à partir des données de Gallica.

CodeModifier

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    exemple d'URL à fournir:
    http://gallica.bnf.fr/proxy?method=R&ark=btv1b55005208r.f1&l=6&r=4864,6656,256,256
    <form method="post" action="index.php">
    <INPUT type="text" name="url" size="200"><br>
    Pages:
    <INPUT type="text" name="pages">
    <INPUT type="submit" value="Go" name="bouton">
    </form>
    <?php
    /*
    Lien classique : http://gallica.bnf.fr/ark:/12148/btv1b55005208r/f1.zoom.r=lugdunum.langFR
    Images zoomé x6 : http://gallica.bnf.fr/proxy?method=R&ark=btv1b55005208r.f1&l=6&r=4864,6656,256,256
     
    Champs dans la page source non zommée interessants:
    * <meta name="DC.date" content="1808"/>
    * <meta name="DC.publisher" content="Comberousse (Lyon)"/>
    * <meta name="DC.title" content="Nouveau Plan topographique et historique de la ville de Lyon, avec les projets d'agrandissement..."/>
    * <meta name="DC.creator" content="Reithofer, Pierre (18..-19..?). Auteur du texte"/>
    * le numéro du visualiseur est obtenu en lisant les 8 derniers caractères, moins le tout dernier (donc 7) (ex: IFN-8440743 = btv1b8440743b)
    */
     
    $erreur = 0; //compteur d'erreur, s'il reste à 0, pas d'erreurs.
    //1. vérifier qu'il s'agit bien du site gallica
    $url = @$_POST[url];
    $pages = @$_POST[pages]; //nombre de pages du document (normalement 1)
    //a. Protocole HTTP
    if(!stristr($url, "http://")) {
            $erreur = 1;
            echo "Lien non valide (http://)!<br>";
    }
    //b. site gallica
    if(!stristr($url, "gallica.bnf.fr/")) {
            $erreur = 1;
            echo "Site Gallica seulement (bnf.gallica.fr)!<br>";
    }
     
    //c. le reste
    if(!stristr($url, "proxy?method=R&ark=")) {
            $erreur = 1;
            echo "Lien invalide (proxy?method=R&ark=)!<br>";
    }
     
    //d. extirpation des coordonnées
    if($erreur==0) {
      for($w=1;$w<=$pages;$w++) { //on refait ça autant de fois qu'il y a de pages
            echo "Page <b>$w</b> sur <b>$pages</b><br>";
            flush();
            $tmp = explode("=", $url);
            $tmp3=explode(".", $tmp[2]);
            $numero = $tmp3[0];
            $code_image = "$numero.f$w";
            $tmp5 = explode(",", $tmp[4]); // $tmp5 = 4864,6656,256,256
            $x=$tmp5[0];
            $y=$tmp5[1];
            $lignes=$x/256;
            $colonnes=$y/256;
            echo "$lignes lignes<br>$colonnes colonnes<br>$code_image<br>$url<br>"; flush();
           
            $url_details = "http://gallica.bnf.fr/ark:/12148/$numero";
            $tags = get_meta_tags($url_details); //on lit les balises META de la page web
            $date_doc = ""; $auteur_doc = ""; $titre_doc = "";  //on initialise, des fois qu'il n'y ait rien de renseigné
            $date_doc = @$tags['dc_date']; //cette fonction lit les caractères spéciaux commes les "." en tant que "_"
            $auteur_doc = @$tags['dc_creator'];
            $titre_doc = @$tags['dc_title'];
            $code_ifn = substr($numero, -8, -1); // on extirpe le code IFN du numéro
           
            $description_commons = "{{LargeImage}}\n{{crop}}\n=={{int:filedesc}}==\n{{Artwork\n| artist           = $auteur_doc\n| title            = $titre_doc\n| description      = {{fr|$titre_doc.}}\n| date             = $date_doc\n| gallery          = {{Institution:BNF}}\n| Author           = [[User:xxx|xxx]]\n| Source           = {{ARK-BNF|ark:/12148/$numero}}\n}}\n\n=={{int:license-header}}==\n\n{{PD-GallicaScan|IFN-$code_ifn}}\n\n[[Category:Images from Gallica]]\n";
           
            echo "\n<br><br><pre>$description_commons</pre><br>"; //on affiche la description pour Commons
           
            //$code_image = "btv1b84453490.f1" ; //code gallica de l'image a piquer
            $dir = "/tmp/"; //repertoire de travail
     
            $h=0; // compteur de fichiers
            //$im_col = new Imagick(); // preparation pour le fichier final
            $im_tot = new Imagick(); // preparation pour le fichier final
            /* Cree un nouvel objet imagick */
     
            for($i=0;$i<=$colonnes;$i++) { //colonnes
            $im = new Imagick(); //chaque colonne est là dedans
            for($j=0;$j<=$lignes;$j++) { //lignes
                    $tmp1 = $i*256;
                    $tmp2 = $j*256;
                    $coords = "$tmp2,$tmp1,256,256";
                    $url = "http://gallica.bnf.fr/proxy?method=R&ark=$code_image&l=6&r=$coords";
                    $img = imagecreatefromjpeg($url); // telechargement de l'image
                    imagejpeg($img, "$dir/$i-$j.jpg", "100"); //creation du jpeg pour chaque fragment ; 100 = qualite
                   
                    echo "<small>($h) $i-$j.jpg * </small>"; //afficher les lignes pour debug
                    flush(); // pour voir l'evolution ligne par ligne
                   
                    $h++;
                    $im->readImage("$dir/$i-$j.jpg");
            }
            //A chaque nouvelle colonne, on genere la colonne d'avant avec imagemagick
            $im->resetIterator();
            $combined = $im->appendImages(true);
            $combined->setImageFormat("jpg");
            $combined->writeImage("$dir/col-$i.jpg"); //on cree le fichier correspondant a la première colonne
                    echo "<br><small>* Assemblage de la colonne $i * </small><br>";
                   
     
            //break;
                    if($i==$colonnes) { //toutes les colonnes sont créées, on assemble
                            $itot = $i+1; // total de colonnes
                            echo "<br><small>* Assemblage final des $itot colonnes... * </small>"; flush();
                            for($z=0;$z<=$colonnes;$z++) {
                                    $im_tot->readImage("$dir/col-$z.jpg");
                                    echo "<br><small>* Assemblage final de la colonne $z * </small>"; flush();
                            }
                            $im_tot->resetIterator();
                            $combined_tot = $im_tot->appendImages(false); //false = assemblage horizontal
                            $combined_tot->setImageFormat("jpg");
                            $combined_tot->writeImage("$dir/$numero-p$w.jpg");
                            $taille_fic = filesize("$dir/$numero-p$w.jpg");
                            echo "<br><small>* Assemblage final terminé: $numero-p$w.jpg ($taille_fic octets)* </small><br><br>";
                            $combined_tot->destroy(); $im_tot->destroy(); $combined->destroy(); //destruction des objets pour libérer les ressources
                           
                    }
            }
           
            /*
            header("Content-Type: image/jpg");
            echo $combined_tot;
            */
      }
    }