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

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

si http://valokuva.org/?p=7 dit vrai alors la syntaxe pour acceder à une page du pdf c'est
$frame = new Imagick('fichier.pdf[page]');

File size: 8.2 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        $image = new Imagick($document['source_url']['absolute'].$document['fullname']); 
172        $nb_pages = $image->getNumberImages();
173        spip_log($document['source_url']['absolute'].$document['fullname'].' -> '.$nb_pages,'doc2img');
174
175    } else {
176        //version 0.9
177        $handle = imagick_readimage($document['source_url']['absolute'].$document['fullname']);   
178        $nb_pages = imagick_getlistsize($handle);
179    }
180
181   
182    //determine l'extension à utiliser
183    $extension = lire_config('doc2img/format_cible');
184   
185    //charge la premiere image
186    spip_log($id_document.'-0','doc2img');
187   
188    $frame = 0;
189
190    //chaque page est un fichier qu'on sauve dans la table doc2img indéxé par son numéro de page   
191    do {
192   
193        //on accede à la page $frame
194        if (@imagick_goto($handle, $frame)) {
195            $handle_frame = @imagick_getimagefromlist($handle);
196        } else {
197            $image_frame = new imagick($document['source_url']['absolute'].$document['fullname'].'['.$frame.']');
198        }
199   
200        //calcule des dimensions
201        //$dimensions = doc2img_ratio($handle_frame);
202               
203        //on redimensionne l'image
204        //imagick_zoom($handle_frame, $dimensions['largeur'], $dimensions['hauteur']);
205       
206        //nom du fichier cible, c'est à dire la frame (image) indexée
207        $document['frame'] = $document['name'].'-'.$frame.'.'.$extension;
208       
209        //on sauvegarde la page
210        if (!@imagick_writeimage($handle_frame,  $document['cible_url']['absolute'].$document['frame'])) {
211            $image_frame->setImageFormat($extension);
212            $image_frame->writeImage($document['cible_url']['absolute'].$document['frame']);
213        }
214
215        //sauvegarde les donnees dans la base       
216        sql_insertq(
217            "spip_doc2img",
218            array(
219                "id_document" => $id_document,
220                "fichier" => set_spip_doc($document['cible_url']['relative'].$document['frame']),
221                "page" => $frame
222            )
223        );
224       
225        //on libére la frame
226        if (!@imagick_free($handle_frame)) {
227            $image_frame->clear();
228            $image_frame->destroy();
229        }
230       
231        $frame++;
232    } while($frame < $nb_pages );
233   
234    //on libére les ressources
235    if (!@imagick_free($handle)) {
236        $image->clear();
237        $image->destroy();       
238    }
239   
240    // libération du verrou
241    spip_fclose_unlock($fp);
242
243    spip_log($id_document." document ok",'doc2img');       
244
245    return true;
246}
247
248?>
Note: See TracBrowser for help on using the repository browser.