source: spip-zone/_plugins_/_dev_/doc2img/inc/convertir.php @ 21133

Last change on this file since 21133 was 21133, checked in by cam.lafit@…, 11 years ago

des spip_log pour comprendre où coinde phpimagick2.x

File size: 8.7 KB
Line 
1<?php
2
3/*! \brief fonction qui indique si le document a deja été converti
4 *
5 * 
6 *  \param $id_document identifiant du document à controler
7 *  \return booleen $resultat : true document converti, false sinon
8 */
9function is_doc2img($id_document) {
10    $pages = sql_countsel('spip_doc2img','id_document='.$id_document,'id_doc2img');
11    if (is_numeric($pages)) {       
12        return true;
13    } else  {
14        return false;
15    }
16}
17
18
19/*! \brief fonction controlant que le document founit est convertible
20 *
21 *  Vérifie que le document donné en paramétre est bien listé dans les types de documents autorisés à la conversion via CFG
22 * 
23 *  \param $id_document identifiant du document à controler
24 *  \return booleen $resultat : true document convertible, false sinon
25 */
26function can_doc2img($id_document = NULL) {
27   
28    include_spip('cfg_options');   
29
30    $extension = sql_getfetsel(
31        'extension',
32        'spip_documents',
33        'id_document = '.$id_document
34    );
35
36    //on liste les extensions autorisées depuis CFG
37    $types_autorises = explode(',',lire_config("doc2img/format_document",null,true));
38   
39    //on controle si le document est convertible ou non   
40    if (in_array($extension,$types_autorises)) {
41        return true;
42    } else {
43        return false;
44    }
45}
46
47/*! \brief calcul les ratios de taille de l'image finale
48 *
49 *  Vérifie que le document donné en paramétre est bien listé dans les types de documents autorisés à la conversion via CFG
50 * 
51 *  \param $id_document identifiant du document à controler
52 *  \return booleen $resultat : true document convertible, false sinon
53 */
54function doc2img_ratio(&$handle) {
55
56    //on determine les dimensions des frames
57    $proportion = (lire_config('doc2img/proportion'));
58   
59    //par défaut le ratio faut 1
60    $ratio['largeur'] = $ratio['hauteur'] = 1;
61
62    //dimensions du document d'origine
63    $dimensions['largeur'] = imagick_getwidth($handle);
64    $dimensions['hauteur'] = imagick_getheight($handle);   
65
66    //si une largeur seuil a été définie
67    if ($largeur = lire_config('doc2img/largeur')) {
68        $ratio['largeur'] = $largeur / $documents['largeur'];
69    }
70   
71    //si une hauteur seuil a été définie
72    if ($hauteur = lire_config('doc2img/hauteur')) {
73        $ratio['hauteur'] = $hauteur / $documents['hauteur'];
74    }
75   
76
77    //ajustement des ratio si proportion demandée
78    if (lire_config('doc2img/proportion') == "on") {
79        //si agrandiessement demandée on prend le plus grand ratio, sinon le plus petit
80        $ratio['largeur'] = (lire_config('doc2img/agrandir')) ? max($ratio['hauteur'], $ratio['largeur']) : min($ratio['hauteur'], $ratio['largeur']);
81        $ratio['hauteur'] = $ratio['largeur']; 
82    }
83       
84    //defini les nouvelles dimensions
85    $dimensions['largeur'] = $ratio['largeur'] * imagick_getwidth($handle);
86    $dimensions['hauteur'] = $ratio['hauteur'] * imagick_getheight($handle);
87
88    return $dimensions;
89}
90
91/*! \brief fonction autonome convertissant un document donné en paramétre
92 *
93 *  Ensemble des actions necessaires à la conversion d'un document en image :
94 *  - recupére les informations sur le documents (nom, repertoire, nature)
95 *  - determine les informatsions sur le documents finals (nom, respertoire, extension)
96 * 
97 * \param $id_document identifiant du document à convertir 
98 */   
99function convertir_document($id_document) {
100
101    // NOTE : les repertoires doivent se finir par un /
102
103    include_spip('cfg_options');
104    include_spip('inc/documents');
105    include_spip('inc/flock');
106
107    //racine du site c'est a dire url_site/
108    //une action se repere à la racine du site
109    $racine_site = getcwd().'/';
110
111    spip_log('doc2img à convertir : '.$id_document ,'doc2img');
112
113    //on recupere l'url du document
114    $fichier = sql_getfetsel(
115        'fichier',
116        'spip_documents',
117        'id_document='.$id_document
118    );
119
120
121    //chemin relatif du fichier
122    $fichier = get_spip_doc($fichier); 
123
124    //nom complet du fichier : recherche ce qui suit le dernier / et retire ce dernier
125    // $resultat[0] = $resultat[1]/$resultat[2].$resultat[3]
126    preg_match('/(.*)\/(.*)\.(.\w*)/i', $fichier, $result);
127
128    //url relative du repertoire contenant le fichier , on retire aussi le / en fin
129    $document['source_url']['relative'] = $result[1].'/';
130    $document['source_url']['absolute'] = $racine_site.$document['source_url']['relative'];
131   
132    //information sur le nom du fichier
133    $document['extension'] = $result[3];
134    $document['name'] = $result[2];
135    $document['fullname'] = $result[2].'.'.$result[3];
136   
137    //creation du repertoire cible
138    //url relative du repertoire cible
139    $document['cible_url']['relative'] = _DIR_IMG.lire_config('doc2img/repertoire_cible').'/'.$document['name'].'/';
140    $document['cible_url']['absolute'] = $racine_site.$document['cible_url']['relative'];
141
142    spip_log($document,'doc2img');
143
144    //verrouille document ou quitte
145    //si erreur sur verrou alors on quitte le script
146    if (!$fp = @spip_fopen_lock($document['source_url']['absolute'].$document['fullname'],'r',LOCK_EX)) {
147        spip_log('verouillé '.$id_document,'doc2img');
148        return false;
149    }
150       
151    //suppresssion d'un eventuel repertoire deja existant
152    include_spip('base/doc2img_install');
153    rm($document['cible_url']['absolute']);
154
155    //suppression dans la base
156    sql_delete(
157        "spip_doc2img",
158        "id_document = ".$id_document
159    );
160
161    //creation du repertoire cible
162    if (!@mkdir($document['cible_url']['absolute'])) {
163        spip_log('erreur repertoire '.$id_document,'doc2img');   
164        return false;
165    }
166       
167    //charge le document dans imagick
168    //determine le nombre de pages dans le document
169    if (class_exists('Imagick')) {
170        //version 2.x
171        $version = '2.x';
172        $image = new Imagick($document['source_url']['absolute'].$document['fullname']); 
173        $nb_pages = $image->getNumberImages();
174        spip_log($document['source_url']['absolute'].$document['fullname'].' -> '.$nb_pages,'doc2img');
175
176    } else {
177        //version 0.9
178        $version = '0.9';
179        $handle = imagick_readimage($document['source_url']['absolute'].$document['fullname']);   
180        $nb_pages = imagick_getlistsize($handle);
181    }
182
183   
184    //determine l'extension à utiliser
185    $extension = lire_config('doc2img/format_cible');
186   
187    //charge la premiere image
188    spip_log($id_document.'-0','doc2img');
189   
190    $frame = 0;
191
192    //chaque page est un fichier qu'on sauve dans la table doc2img indéxé par son numéro de page   
193    do {
194   
195        //on accede à la page $frame
196        if ($version == '0.9') {
197            imagick_goto($handle, $frame);
198            $handle_frame = @imagick_getimagefromlist($handle);
199        } else {
200            $image_frame = new imagick($document['source_url']['absolute'].$document['fullname'].'['.$frame.']');
201            spip_log($document['source_url']['absolute'].$document['fullname'].'['.$frame.']','doc2img');
202        }
203   
204        //calcule des dimensions
205        //$dimensions = doc2img_ratio($handle_frame);
206               
207        //on redimensionne l'image
208        //imagick_zoom($handle_frame, $dimensions['largeur'], $dimensions['hauteur']);
209       
210        //nom du fichier cible, c'est à dire la frame (image) indexée
211        $document['frame'] = $document['name'].'-'.$frame.'.'.$extension;
212       
213        //on sauvegarde la page
214        if ($version == '0.9') {
215            imagick_writeimage($handle_frame,  $document['cible_url']['absolute'].$document['frame']);
216        } else {
217            $image_frame->setImageFormat($extension);
218            $image_frame->writeImage($document['cible_url']['absolute'].$document['frame']);
219            spip_log('ecriture frame'.$frame,'doc2img');
220        }
221
222        //sauvegarde les donnees dans la base       
223        sql_insertq(
224            "spip_doc2img",
225            array(
226                "id_document" => $id_document,
227                "fichier" => set_spip_doc($document['cible_url']['relative'].$document['frame']),
228                "page" => $frame
229            )
230        );
231        spip_log('injection bd','doc2img');
232       
233        //on libére la frame
234        if ($version == '0.9') {
235            imagick_free($handle_frame);
236        } else {
237            $image_frame->clear();
238            $image_frame->destroy();
239            spip_log('liberation ressources frame','doc2img');
240        }
241       
242        $frame++;
243   
244    } while($frame < $nb_pages );
245   
246    //on libére les ressources
247    if ($version == '0.9') {
248        imagick_free($handle);
249    } else {
250        $image->clear();
251        $image->destroy();
252        spip_log('liberation image','doc2img');
253    }
254   
255    // libération du verrou
256    spip_fclose_unlock($fp);
257
258    spip_log($id_document." document ok",'doc2img');       
259
260    return true;
261}
262
263?>
Note: See TracBrowser for help on using the repository browser.