source: spip-zone/_plugins_/fusion_pdf/action/fusion_pdf.php @ 49825

Last change on this file since 49825 was 49825, checked in by toutati@…, 10 years ago

Un debut de plugin pour generer des pdfs à partir d'un autre pdf

en l'occurence le pdf parent est un document de la rubrique,
le nom de ce fichier doit contenir le mot index, on pourrait configurer cela a part (todo)

document/#ID_ARTICLE/#ID_RUBRIQUE/3-7/PDFusion/35,

les 2 derniers arguments joue sur le titre en donnant le pretitre du pdf et un couper à 35
3-7 indique de fusionner les pages de 3 à 7
le numero XX. titre de la rubrique sera repris
On generera donc PDFusion-NoXX_titre-de-l-article-sans-accent.pdf

Todo on pourrait autoriser la fusion de plusieurs pdfs...

utilise la librairie PDFMerger fpdi et fpdf à modifier tel que ligne 1049 remplacer break par return true;

enjoy

File size: 5.0 KB
Line 
1<?php
2
3if (!defined('_ECRIRE_INC_VERSION')) return;
4/*
5
6[(#BOUTON_ACTION{<:fusionpdf:generez_le_pdf:>,
7#URL_ACTION_AUTEUR{fusion_pdf,
8document/#ID_ARTICLE/#ID_RUBRIQUE/3-6/PDFusion/35,
9#SELF|parametre_url{pdf,done}},
10ajax})]
11
12*/
13
14//pompage de editer_produit (merci Rastapopoulos)
15/**
16 * Action de fusion
17 * @param unknown_type $arg
18 * @return unknown_type
19 */
20function action_fusion_pdf_dist($arg=null) {   
21        if (is_null($arg)){
22                $securiser_action = charger_fonction('securiser_action', 'inc');
23                $arg = $securiser_action();
24        }
25               
26        // On recupere les infos de l'argument
27        @list($objet, $id_article, $id_rubrique, $pages, $pretitre, $raccourcir) = explode('/', $arg);
28        $id_article = intval($id_article);
29        $id_rubrique = intval($id_rubrique);
30        $raccourcir = intval($raccourcir);
31       
32        spip_log("fusion pour pdf article $id_article a partir du document de rubrique $id_rubrique",'fusionpdf');
33
34        // todo?  AND autoriser('fusion_pdf', 'article',$arg[1]))
35        if ($objet == 'document' and $id_article and $id_rubrique) {
36                $fusion=fusion_pdf_post($objet, $id_article, $id_rubrique, $pages, $pretitre, $raccourcir);
37        }
38       
39       
40        // Invalider les caches
41        include_spip('inc/invalideur');
42        suivre_invalideur("id='id_article/$id_article'");       
43
44}
45
46
47function fusion_pdf_post($objet, $id_article, $id_rubrique, $pages, $pretitre,$raccourcir){
48       
49        include_spip('inc/filtres');
50
51        //le titre de la rubrique est de style "012. titre"
52        $titre_rubrique=sql_getfetsel('titre','spip_rubriques',"id_rubrique='$id_rubrique'");
53        $numero_rubrique=recuperer_numero($titre_rubrique);
54        $titre_article=sql_getfetsel('titre','spip_articles',"id_article='$id_article'");
55       
56        //retourne un titre pour le fichier pdf court et comprehensible
57        include_spip('inc/fusionpdf_fonctions');
58        $titre_sortie=titrature($titre_article,$numero_rubrique,$pretitre,$raccourcir);
59               
60        //on recupere le chemin du pdf de la rubrique
61        //la condition ici est index et num (cf like)
62        //todo mettre une condition generique sur le titre (Numero ? ou mot clef? ou facon de l'ecrire
63        $type='rubrique';
64        $pdf_rub = sql_select("D.id_document,D.fichier", "spip_documents AS D LEFT JOIN spip_documents_liens AS T ON T.id_document=D.id_document", 
65        "T.id_objet=" . intval($id_rubrique) . " AND T.objet=" . sql_quote($type)
66        ." AND D.mode='document' AND D.extension ='pdf'"
67        ." AND D.fichier LIKE '%$numero_rubrique%'"
68        ." AND D.fichier LIKE '%index%'"
69        );
70       
71        $doc_depart = sql_fetch($pdf_rub);
72                spip_log("fusionpost2".$doc_depart['fichier']." fera titre = $titre_sortie fin",'fusionpdf');
73
74                if (!$doc_depart) return false;
75
76        $pdf_depart = $doc_depart['fichier'];
77        $fichier_base="pdf/".$titre_sortie.".pdf";
78                $inputpdf=_DIR_IMG.$pdf_depart;
79                $outputpdf=_DIR_IMG.$fichier_base;
80               
81                //verifier que ce n'est pas encore dans la base
82                if ($doc = sql_fetsel('id_document', 'spip_documents', 'fichier='.$fichier_base.' AND id_article='.$id_article))
83                return false;
84       
85        //todo > reprendre les numeros des pages de N-N (5-7)
86        // soit champ supp pour article
87        // soit taper dans cvs, mais en cas d'erreur, attention confusion et grosse galre!
88        fusionner($inputpdf,$outputpdf,$pages);
89       
90        if(file_exists($outputpdf)){
91                $date_article=sql_getfetsel('date','spip_articles',"id_article='$id_article'");
92               
93        //preparer les champs
94                        $champs['date'] = $date_article;
95                        $champs['fichier'] = $fichier_base;
96                        $champs['taille'] =  filesize($outputpdf);
97                        $champs['largeur'] = 0;
98                        $champs['hauteur'] = 0;
99                        $champs['mode'] = 'document';
100                        $champs['extension'] = 'pdf';
101                        $champs['statut'] = 'publie';
102                       
103        //les inserer avec pipeline adequat     
104        $id_document = insert_document($champs);
105
106        if($id_document){
107       
108        //puis sauvegarder le document dans l'article
109        spip_log("insertion doc= $id_document",'fusionpdf');
110                $document_lien = sql_insertq(
111                        'spip_documents_liens',
112                        array(
113                                'id_document'=>$id_document,
114                                'id_objet'=>$id_article,
115                                'objet'=>'article',
116                                'vu'=>'non'
117                        )
118                );
119        }
120       
121
122        }
123
124       
125                return $titre_sortie ." et ". $pdf_depart;
126}
127
128
129//verifier la ligne de modif dans fpdf pour le output
130function fusionner($inputpdf,$outputpdf,$pages) {
131        // pour fusionner divers pdfs entre eux
132        //le inputpdf pourrait etre un tableau (cheminpdf1=>pages,cheminpdf2=>pages)
133        if(include_once(find_in_path('lib/PDFMerger/PDFMerger.php'))){
134       
135        $pdf = new PDFMerger;
136        $pdf->addPDF($inputpdf,$pages)
137                ->merge('file', $outputpdf);                   
138        } else  spip_log("librairie introuvable input= $inputpdf output= $outputpdf",'fusionpdf');
139
140       
141}
142
143
144/**
145 * Cree un nouveau document et retourne son ID
146 *
147 * @param array $champs Un tableau avec les champs par defaut lors de l'insertion
148 * @return int id_document
149 */
150function insert_document($champs=array()) {
151        $id_document = false;
152        if (!$champs) return;
153
154                // Envoyer aux plugins avant insertion
155                $champs = pipeline('pre_insertion',
156                        array(
157                                'args' => array(
158                                        'table' => 'spip_documents',
159                                ),
160                                'data' => $champs
161                        )
162                );
163                // Inserer l'objet
164                $id_document = sql_insertq('spip_documents', $champs);
165               
166                // Envoyer aux plugins apres insertion
167                pipeline('post_insertion',
168                        array(
169                                'args' => array(
170                                        'table' => 'spip_documents',
171                                ),
172                                'data' => $champs
173                        )
174                );
175
176        return $id_document;
177}
178
179
180?>
Note: See TracBrowser for help on using the repository browser.