source: spip-zone/_plugins_/doc2img/trunk/inc/doc2img_convertir.php @ 62163

Last change on this file since 62163 was 62163, checked in by kent1@…, 7 years ago

Plus de fichiers de fonctions

File size: 10.0 KB
Line 
1<?php
2
3if (!defined("_ECRIRE_INC_VERSION")) return;
4
5/**
6 * Fonction autonome convertissant un document donné en paramètre
7 *
8 *  Ensemble des actions necessaires à la conversion d'un document en image :
9 *  - recupère les informations sur le documents (nom, repertoire, nature)
10 *  - determine les informations sur le documents final (nom, repertoire, extension)
11 *
12 *  Documentation intéressante :
13 *  - http://valokuva.org/?p=7
14 *  - http://valokuva.org/?p=7#comment-19198
15 *
16 * @param int $id_document identifiant du document à convertir
17 * @param string $type méthode à utiliser :
18 *              - full converti tout le document
19 *              - vignette converti la première page en vignette du document
20 */
21function inc_doc2img_convertir($id_document,$type='full') {
22        if(!in_array($type,array('full','vignette')))
23                $type = 'full';
24       
25        if(class_exists('Imagick')){
26
27            include_spip('inc/documents');
28            include_spip('inc/flock');
29                include_spip('inc/config');
30
31            $config = lire_config('doc2img',array());
32
33            $document = doc2img_document($id_document);
34
35            /**
36             * Chargement du document en mémoire
37             * On détermine le nombre de pages du document
38             * On libère la ressource automatiquement si on utilise la class
39             * car on réouvre chaque page par la suite
40             */
41                $image = new Imagick($document['fichier']);
42                $identify = $image->identifyImage();
43                $identify2 = $image->getImageProperties();
44                $nb_pages = $image->getNumberImages();
45                $image->clear();
46                $image->destroy();
47
48            $frame = 0;
49
50                $resolution = $config['resolution'] ? $config['resolution'] : 150;
51               
52                $ajouter_documents = charger_fonction('ajouter_documents', 'action');
53               
54                if($type == 'full'){
55                        /**
56                         * Est ce que ce document a déja été converti
57                         * Si oui, on supprime son ancienne conversion
58                         */
59                        $documents_doc2img = sql_select('L1.id_document',
60                                                                                        'spip_documents AS L1 LEFT JOIN spip_documents_liens AS L2 ON L1.id_document=L2.id_document',
61                                                                                        'L1.mode="doc2img" AND L2.objet="document" AND L2.id_objet='.intval($id_document));
62                       
63                        $documents_a_supprimer = array();
64                        while($document_doc2img = sql_fetch($documents_doc2img)){
65                                spip_log($document_doc2img,'doc2img');
66                                $documents_a_supprimer[] = $document_doc2img['id_document'];
67                        }
68                        if(count($documents_a_supprimer) > 0){
69                                spip_log('On supprime les documents','doc2img');
70                                spip_log($documents_a_supprimer,'doc2img');
71                                $supprimer_document = charger_fonction('supprimer_document','action');
72                                foreach ($documents_a_supprimer as $id_document) {
73                                        $supprimer_document($id_document); // pour les orphelins du contexte, on traite avec la fonction existante
74                                }
75                        }
76                    // chaque page est un fichier qu'on sauve dans la table doc2img indexé
77                    // par son numéro de page
78                    do {
79                        spip_log("Conversion de la page $frame",'doc2img');
80                        //on accede à la page $frame
81                        $image_frame = new Imagick();
82                        if(is_numeric($resolution) && ($resolution <= '600') && ($resolution > $identify['resolution']['x'])){
83                                $image_frame->setResolution($resolution,$resolution);
84                        }
85                                $image_frame->readImage($document['fichier'].'['.$frame.']');
86                                $image_frame->setImageFormat($config['format_cible']);
87                                if(is_numeric($config['compression']) && ($config['compression'] > 50) && ($config['compression'] <= 100)){
88                                        $image_frame->setImageCompressionQuality($config['compression']);
89                                }
90       
91                        //calcule des dimensions
92                        //$dimensions = doc2img_ratio($image_frame,$config);
93       
94                        //nom du fichier cible, c'est à dire la frame (image) indexée
95                        $frame_name = $document['name'].'-'.$frame.'.'.$config['format_cible'];
96                                $dest = $document['cible_url'].$frame_name;
97                        //on sauvegarde la page
98                       
99                        //$image_frame->resizeImage($dimensions['largeur'], $dimensions['hauteur'],Imagick::FILTER_LANCZOS,1);
100                    $image_frame->writeImage($dest);
101                               
102                                /**
103                                 * On ajoute le document dans la table spip_documents avec comme type "doc2img"
104                                 * Il sera automatiquement lié au document original
105                                 */
106                                $files = array(array('tmp_name'=>$dest,'name'=>$frame_name));
107                                $x = $ajouter_documents('new', $files,'document', $id_document, 'doc2img');
108
109                        if(($frame == 0) && ($config['logo_auto']=='on') && in_array($config['format_cible'],array('png','jpg'))){
110                                $id_vignette = sql_getfetsel('id_vignette','spip_documents','id_document='.intval($id_document));
111                                        $frame_tmp = $document['cible_url'].$document['name'].'-logo.'.$config['format_cible'];
112                                        $image_frame->writeImage($frame_tmp);
113                                        $files = array(array('tmp_name'=>$frame_tmp,'name'=>$frame_name));
114                                if(is_numeric($id_vignette) && $id_vignette > 0){
115                                        $x = $ajouter_documents($id_vignette, $files,'', 0, 'vignette');       
116                                }else{
117                                                $x = $ajouter_documents('new', $files,'', 0, 'vignette');
118                                        }
119                                        if (is_numeric(reset($x))
120                                          AND $id_vignette = reset($x)){
121                                                include_spip('action/editer_document');
122                                                document_modifier($id_document,array("id_vignette" => $id_vignette,'mode'=>'document'));
123                                        }
124                        }
125                        //on libère la frame
126                    $image_frame->clear();
127                    $image_frame->destroy();
128                        $frame++;
129                    } while($frame < $nb_pages );
130            }else{
131                do {
132                        if(in_array($config['format_cible'],array('png','jpg'))){
133                                //on accede à la page $frame
134                                $image_frame = new Imagick();
135                                if(is_numeric($resolution) && ($resolution <= '600') && ($resolution > $identify['resolution']['x'])){
136                                        $image_frame->setResolution($resolution,$resolution);
137                                }
138                                        $image_frame->readImage($document['fichier'].'['.$frame.']');
139                                        $image_frame->setImageFormat($config['format_cible']);
140                                        if(is_numeric($config['compression']) && ($config['compression'] > 50) && ($config['compression'] <= 100)){
141                                                $image_frame->setImageCompressionQuality($config['compression']);
142                                        }
143               
144                                //nom du fichier cible, c'est à dire la frame (image) indexée
145                                $frame_name = $document['name'].'-logo.'.$config['format_cible'];
146               
147                                //on sauvegarde la page
148                            $image_frame->writeImage($document['cible_url'].$frame_name);
149                                        $files = array(array('tmp_name'=>$document['cible_url'].$frame_name,'name'=>$frame_name));
150                                       
151                                        $id_vignette = sql_getfetsel('id_vignette','spip_documents','id_document='.intval($id_document));
152                                if(is_numeric($id_vignette)){
153                                        $x = $ajouter_documents($id_vignette, $files,'', 0, 'vignette');       
154                                }else{
155                                                $x = $ajouter_documents('new', $files,'', 0, 'vignette');
156                                        }
157                                        if (is_numeric(reset($x))
158                                          AND $id_vignette = reset($x)){
159                                                include_spip('action/editer_document');
160                                                document_modifier($id_document,array("id_vignette" => $id_vignette,'mode'=>'document'));
161                                        }
162                            $image_frame->clear();
163                            $image_frame->destroy();
164                    }else{
165                                        spip_log("DOC2IMG : le format de sortie sélectionné dans la configuration ne permet pas de créer une vignette",'doc2img');
166                    }
167                        $frame++;
168                    } while($frame < 1 );
169            }
170            return true;
171        }else{
172                spip_log('Erreur Doc2Img : La class doc2img n est pas disponible');
173                return false;
174        }
175}
176
177/**
178 * Calcul les ratios de taille de l'image finale
179 *
180 * Vérifie que le document donné en paramètre est bien listé dans les types de documents
181 * autorisés à la conversion via CFG
182 *
183 * @param $id_document identifiant du document à controler
184 * @return booleen $resultat : true document convertible, false sinon
185 */
186function doc2img_ratio($handle,$config=array()) {
187
188    $ratio['largeur'] = $ratio['hauteur'] = 1;
189
190    /**
191     * Récupération des dimensions du document d'origine
192     */
193        $dimensions['largeur'] = $handle->getImageWidth();
194        $dimensions['hauteur'] = $handle->getImageHeight();
195
196    //si une largeur seuil a été définie
197    if ($largeur = $config['largeur']) {
198        $ratio['largeur'] = $largeur / $dimensions['largeur'];
199    }
200
201    //si une hauteur seuil a été définie
202    if ($hauteur = $config['hauteur']) {
203        $ratio['hauteur'] = $hauteur / $dimensions['hauteur'];
204    }
205
206
207    /**
208     * Ajustement des ratios si proportion demandée
209     * Si agrandissement demandé on prend le plus grand ratio,
210     * sinon le plus petit
211     */
212    if ($config['proportion'] == "on") {
213        $ratio['largeur'] = ($config['agrandir'] == 'on') ? max($ratio['hauteur'], $ratio['largeur']) : min($ratio['hauteur'], $ratio['largeur']);
214        $ratio['hauteur'] = $ratio['largeur'];
215    }
216
217    /**
218     * Définition des dimensions définitives
219     */
220    $dimensions['largeur'] = $ratio['largeur'] * $dimensions['largeur'];
221    $dimensions['hauteur'] = $ratio['hauteur'] * $dimensions['hauteur'];
222
223    return $dimensions;
224}
225
226
227/**
228 * Fonction pour connaitre les infos fichiers du document
229 *
230 *  Calcul un tableau :
231 *  - avec informations sur le documents (nom, repertoire, nature)
232 *  - determine les informations des documents finaux (nom, respertoire, extension)
233 *
234 * @param $id_document identifiant du document à convertir
235 * @return $document : liste de données caractérisant le document
236 */
237function doc2img_document($id_document) {
238
239    //on recupere l'url du document
240    $fichier = sql_fetsel(
241        '*',
242        'spip_documents',
243        'id_document='.$id_document
244    );
245
246    //chemin relatif du fichier
247    $fichier = get_spip_doc($fichier['fichier']);
248
249    //nom complet du fichier : recherche ce qui suit le dernier / et retire ce dernier
250    // $resultat[0] = $resultat[1]/$resultat[2].$resultat[3]
251    preg_match('/(.*)\/(.*)\.(.\w*)/i', $fichier, $result);
252
253    //url relative du repertoire contenant le fichier , on retire aussi le / en fin
254    $document['fichier'] = $fichier;
255
256    //information sur le nom du fichier
257    $document['extension'] = $fichier['extension'];
258    $document['name'] = $result[2];
259    $document['fullname'] = basename($fichier);
260
261    //creation du repertoire cible
262    //url relative du repertoire cible
263    if(!is_dir(_DIR_VAR."cache-doc2img")){
264        sous_repertoire(_DIR_VAR,"cache-doc2img");
265    }
266    $document['cible_url'] = _DIR_VAR."cache-doc2img".'/';
267
268    return $document;
269}
270
271?>
Note: See TracBrowser for help on using the repository browser.