Wikisource:Gallica/gallica.php

La bibliothèque libre.
Sauter à la navigation Sauter à la recherche
poubelleCette page est proposée dans la liste des pages à supprimer, vous êtes invité à donner votre avis sur cette proposition.


Outil écrit par JeanBono.

Description[modifier]

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

Prérequis[modifier]

Serveur web avec PHP et module ImageMagick.

Utilisation[modifier]

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.

Code[modifier]

<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;
            */
      }
    }