Wikisource:Gallica/gallica.php
Outil écrit par JeanBono.
Sommaire |
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 :
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;
*/
}
}