Changeset 49180 in spip-zone


Ignore:
Timestamp:
Jun 29, 2011, 7:51:36 PM (10 years ago)
Author:
magegahell@…
Message:

Modification de l'extracteur de PDF et DOC (base sur catdoc)
Ajout des extracteurs PPT, XLS (base sur catdoc)
Ajout des extracteurs ODT, DOCX, PPTX, XSLX a l'aide de fonctions/classes PHP (necessite PHP > 5.2 pouvant traiter les archives)
Ajout d'un formulaire de configuration de l'extraction des documents (permet de se passer des define).
Ajout d'une fonction pour reinitialiser l'indexation dans la base de donnees.

Location:
_plugins_/fulltext
Files:
15 added
7 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/fulltext/exec/fulltext.php

    r46186 r49180  
    2424
    2525        echo propre(_T('fulltext:liste_tables_connues')." [->http://www.spip-contrib.net/Fulltext].");
     26       
     27        // lien vers le panneau de configuration de l'indexation des documents
     28        $url = generer_url_ecrire('fulltext_document');
     29        echo propre(_T('fulltext:configurer_egalement_doc'))."<a href='$url'>"._T('fulltext:configuration_indexation_document')."</a>";
    2630
    2731        echo debut_droite("", true);
     
    7074                                echo Fulltext_regenerer_index($table);
    7175                       
    72                         // Reinitialiser les documents
     76                        // Reinitialiser les documents en erreurs
    7377                        if (_request('reinitialise') == $table OR _request('reinitialise') == 'tous')
    7478                                echo Fulltext_reinitialiser_document();
     79                        // Reinitialiser tous les documents     
     80                        if (_request('reinitialise') == 'document_tout')
     81                                echo Fulltext_reinitialiser_totalement_document();
    7582                               
    7683                        // Recuperation des index deja existant
     
    123130        }
    124131
     132        // lien vers le panneau de configuration de l'indexation des documents
     133        $url = generer_url_ecrire('fulltext_document');
     134        echo "<p><b><a href='$url'>"._T('fulltext:configuration_indexation_document')."</a></b></p>\n";
     135       
    125136        $url = generer_url_ecrire(_request('exec'), 'regenerer=tous');
    126137        echo "<p><b><a href='$url'>"._T('fulltext:regenerer_tous')."</a></b></p>\n";
     
    128139        $url = generer_url_ecrire(_request('exec'), 'reinitialise=document');
    129140        echo "<p><b><a href='$url'>"._T('fulltext:reinitialise_index_doc')."</a></b></p>\n";
    130        
     141
     142        $url = generer_url_ecrire(_request('exec'), 'reinitialise=document_tout');
     143        echo "<p><b><a href='$url'>"._T('fulltext:reinitialise_totalement_doc')."</a></b></p>\n";       
    131144        // charset site
    132145        $charset = strtolower(str_replace('-','',$GLOBALS['meta']['charset']));
  • _plugins_/fulltext/extract/doc.php

    r31883 r49180  
    99// voulu ; dans le cas contraire le document sera lu comme s'il etait
    1010// dans le charset iso-8859-1
    11 
     11// Extracteurs basee sur la librairie catdoc (a definir dans _FULLTEXT_DOC_EXE dans mes_options.php ou via le panneau de configuration) : http://www.wagner.pp.ru/~vitus/software/catdoc/  (version Windows : http://blog.brush.co.nz/2009/09/catdoc-windows/ )
     12// Exemple pour utilisation en local sous Windows : define("_FULLTEXT_DOC_EXE","C:\catdoc\catdoc.exe");
     13// Exemple pour utilisation sous Linux : define("_FULLTEXT_DOC_EXE","/usr/local/bin/catdoc");
     14// Exemple d'option pour extraction de .doc au format Windows vers format iso-8859-1  : define("_FULLTEXT_DOC_CMD_OPTIONS","-s cp1252 -d 8859-1 ");
     15// Les anciens developpements pour les autres librairies (metamail, wvText, antiword) ont ete conservee.
    1216// http://doc.spip.org/@extracteur_doc
    13 function extracteur_doc($fichier, &$charset) {
     17function extracteur_doc($fichier, &$charset, $bin, $opt = '') {
    1418
    1519        $charset = 'iso-8859-1';
     20        if ((defined('_FULLTEXT_DOC_EXE'))||($bin)) {
     21                $exe = $bin ? $bin : _FULLTEXT_DOC_EXE;
     22        } else {
     23                // TODO : essayer de trouver tout seul l'executable
     24                spip_log('Erreur extraction DOC : Il faut spécifier _FULLTEXT_DOC_EXE dans mes_options.php ou dans le panneau de configuration');
     25                return false;
     26        }
     27        if ((defined('_FULLTEXT_DOC_CMD_OPTIONS') && '' != _FULLTEXT_DOC_CMD_OPTIONS)||($opt)) {
     28                $options = $opt ? ' '.$opt.' ' : ' '._FULLTEXT_DOC_CMD_OPTIONS.' ';
     29        } else {
     30                $options = ' ';
     31        }
    1632
     33        spip_log('Extraction DOC avec '.$exe, 'extract');
     34        $cmd = $exe.$options.$fichier;
     35        $sortie = exec($cmd, $output, $return_var);
     36        if($return_var != 0){
     37                //Erreur
     38                spip_log('Erreur extraction '.$fichier.' (code '.$return_var.') : '.$erreur, 'extract');
     39                return false;
     40        }else{
     41                //Go
     42                spip_log('Fichier DOC '.$fichier.' a ete extrait avec '.$options,'extract');
     43                foreach($output as $out){
     44                        $texte .= $out."\n";
     45                }
     46                return $texte;
     47        }
     48       
     49        //Anciens developpements pour autres binaires que catdoc. Antiword devrait fonctionner avec le code ci-dessus egalement.
     50        #metamail
    1751        @exec('metamail -d -q -b -c application/msword '.escapeshellarg($fichier), $r, $e);
    1852        if (!$e) return @join(' ', $r);
     
    3165        if (!$e) return @join(' ', $r);
    3266
    33         # catdoc
    34         # http://www.45.free.net/~vitus/ice/catdoc/
    35         @exec('catdoc '.escapeshellarg($fichier), $r, $e);
    36         if (!$e) return @join(' ', $r);
    37 
     67 
     68 
    3869}
    3970?>
  • _plugins_/fulltext/extract/pdf.php

    r31896 r49180  
    1111
    1212// http://doc.spip.org/@extracteur_pdf
    13 function extracteur_pdf($fichier, &$charset) {
     13function extracteur_pdf($fichier, &$charset, $bin, $opt = '') {
    1414  $charset = 'iso-8859-1';
    1515       
    1616  $texte = '';
    1717  $output = array();
    18   if (defined('_FULLTEXT_PDF_EXE')) {
    19     $exe = _FULLTEXT_PDF_EXE;
     18  if((defined('_FULLTEXT_PDF_EXE'))||($bin)) {
     19    $exe = $bin ? $bin : _FULLTEXT_PDF_EXE;
    2020  } else {
    2121        // TODO : essayer de trouver tout seul l'exécutable
    22         spip_log('Erreur extraction PDF : Il faut spécifier _FULLTEXT_PDF_EXE dans mes_options.php');
     22        spip_log('Erreur extraction PDF : Il faut specifier _FULLTEXT_PDF_EXE dans mes_options.php ou utiliser le panneau de configuration');
    2323        return false;
    2424  }
    25   if (defined(_FULLTEXT_PDF_CMD_OPTIONS) && '' != _FULLTEXT_PDF_CMD_OPTIONS) {
    26         $options = ' '._FULLTEXT_PDF_CMD_OPTIONS.' ';
     25  if ((defined('_FULLTEXT_PDF_CMD_OPTIONS') && '' != _FULLTEXT_PDF_CMD_OPTIONS)||($opt)) {
     26        $options = $opt ? ' '.$opt.' ' : ' '._FULLTEXT_PDF_CMD_OPTIONS.' ';
    2727  } else {
    2828        $options = ' ';
    2929  }
    30         spip_log('Extraction PDF avec '.$exe, 'extract');
    3130  $cmd = $exe.$options.$fichier;
     31  spip_log('Extraction PDF avec '.$cmd, 'extract');
    3232  $sortie = exec($cmd, $output, $return_var);
    3333  if ($return_var != 0) {
    3434    if ($return_var == 3) {
    35       $erreur = "Le contenu de ce fichier PDF est protégé.";
     35      $erreur = "Le contenu de ce fichier PDF est protege.";
    3636    }
    3737    spip_log('Erreur extraction '.$fichier.' (code '.$return_var.') : '.$erreur, 'extract');
  • _plugins_/fulltext/genie/fulltext_index_document.php

    r47831 r49180  
    11<?php
    22function genie_fulltext_index_document_dist($t) {
    3         // Ne retenir que les 50 premiers ko
    4         @define('_FULLTEXT_TAILLE',50000);
     3        //Recuperation de la configuration
     4        $fulltext = sql_fetsel('valeur', 'spip_meta', 'nom = "fulltext"');
     5        $fulltext = unserialize($fulltext['valeur']);
     6        // Ne retenir que les 50 000 premiers caracteres (ou la valeur choisie)
     7        $taille_index = $fulltext['taille_index'] ? $fulltext['taille_index'] : @define('_FULLTEXT_TAILLE',50000);
    58
    69        $nb_docs = 5;
     
    912                        $extension = $row['extension'];
    1013                        $doc = $row['fichier'];
    11                 spip_log('Indexation de '.$doc, 'extract');
    12                         global $extracteur;
    13                         if (include_spip('extract/'.$extension)
    14                                 AND function_exists($lire = $extracteur[$extension])) {
    15                                 include_spip('inc/distant');
    16                                 include_spip('inc/documents');
    17                                 if (!$fichier = copie_locale(get_spip_doc($row['fichier']), 'test')) {
    18                                         spip_log('Pas de copie locale de '.$row['fichier'], 'extract');
    19                                         return;
     14                        //On indexe seulement si c'est autorise
     15                        if(($fulltext[$extension.'_index'] == 'on')||(defined('_FULLTEXT_'.strtoupper($extension).'_EXE'))){
     16                        spip_log('Indexation de '.$doc, 'extract');
     17                                global $extracteur;
     18                                if (include_spip('extract/'.$extension)
     19                                        AND function_exists($lire = $extracteur[$extension])) {
     20                                        include_spip('inc/distant');
     21                                        include_spip('inc/documents');
     22                                        //Le fichier existe-t-il/est-il accessible ?
     23                                        if (!$fichier = copie_locale(get_spip_doc($row['fichier']), 'test')) {
     24                                                //Le fichier n'est pas accessible, on log mais on poursuit pour les autres
     25                                                spip_log('Pas de copie locale de '.$row['fichier'], 'extract');
     26                                                //Et on met le statut en erreur
     27                                                sql_updateq("spip_documents", array('extrait' => 'err'), "id_document=".intval($row['id_document']));
     28                                        }else{
     29                                                //Le fichier existe, on indexe
     30                                                // par defaut, on pense que l'extracteur va retourner ce charset
     31                                                $charset = 'iso-8859-1';
     32                                                // lire le contenu
     33                                                $contenu = $lire(_DIR_RACINE.$fichier, $charset, $fulltext[$extension.'_bin'], $fulltext[$extension.'_opt']);
     34                                                if (!$contenu) {
     35                                                        spip_log('Echec de l\'extraction de '.$fichier, 'extract');
     36                                                        sql_updateq("spip_documents", array('contenu' => '', 'extrait' => 'err'), "id_document=".intval($row['id_document']));
     37                                                } else {
     38                                                        $contenu = substr($contenu, 0, $taille_index);
     39                                                        // importer le charset
     40                                                        include_spip('inc/charsets');
     41                                                        $contenu = importer_charset($contenu, $charset);
     42                                                        sql_updateq("spip_documents", array('contenu' => $contenu, 'extrait' => 'oui'), "id_document=".intval($row['id_document']));
     43                                                }
     44                                        }
    2045                                }
    21                                 // par defaut, on pense que l'extracteur va retourner ce charset
    22                                 $charset = 'iso-8859-1';
    23                                 // lire le contenu
    24                                 $contenu = $lire(_DIR_RACINE.$fichier, $charset);
    25                                 if (!$contenu) {
    26                                         spip_log('Echec de l\'extraction de '.$fichier, 'extract');
    27                                         sql_updateq("spip_documents", array('contenu' => '', 'extrait' => 'err'), "id_document=".intval($row['id_document']));
    28                                 } else {
    29                                         $contenu = substr($contenu, 0, _FULLTEXT_TAILLE);
    30                                         // importer le charset
    31                                         include_spip('inc/charsets');
    32                                         $contenu = importer_charset($contenu, $charset);
    33                                         sql_updateq("spip_documents", array('contenu' => $contenu, 'extrait' => 'oui'), "id_document=".intval($row['id_document']));
     46                                else {
     47                                        // inutile de parcourir un par un tous les docs avec la meme extension !
     48                                        sql_updateq('spip_documents', array('contenu' => '', 'extrait' => 'err'),"extrait = 'non' AND extension=".sql_quote($extension));
     49                                        spip_log("Impossible d'indexer tous les .$extension", 'extract');
    3450                                }
    35                         }
    36                         else {
    37                                 // inutile de parcourir un par un tous les docs avec la meme extension !
     51                        }else{                 
     52                                // si pas autoriser inutile de parcourir un par un tous les docs avec la meme extension !
    3853                                sql_updateq('spip_documents', array('contenu' => '', 'extrait' => 'err'),"extrait = 'non' AND extension=".sql_quote($extension));
    39                                 spip_log("Impossible d'indexer tous les .$extension", 'extract');
     54                                spip_log("Interdiction d'indexer tous les .$extension", 'extract');
    4055                        }
    4156                }
  • _plugins_/fulltext/inc/fulltext_exec.php

    r49009 r49180  
    9090}
    9191
     92function Fulltext_reinitialiser_totalement_document() {
     93  sql_updateq("spip_documents", array('contenu' => '', 'extrait' => 'non'));
     94  return "<p><strong>"._T('fulltext:index_reinitialise_totalement')."</strong></p>";
     95}
     96
    9297function Fulltext_creer_tous($tables = false) {
    9398        if(!$tables) { // Si les tables ne sont pas donnee, on va les chercher
  • _plugins_/fulltext/lang/fulltext_fr.php

    r45782 r49180  
    88        // A
    99        'accents_pas_pris' => 'Les accents ne sont pas pris en compte (« déjà » ou « deja », retourneront à l\'identique « déjà », « dejà », « déja »...)',
     10        'activer_indexation' => 'Activer l\'indexation des',
    1011        'asie' => 'asie',
    1112        'asterisque_terminale' => 'ne retournera rien: l\'astérisque * doit être terminale',
     
    1415        // C
    1516        'casse_indifferente' => 'La casse (minuscule/majuscule) des mots recherchés est indifférente.',
     17        'configurer_egalement_doc' => 'Vous pouvez &eacute;galement configurer l\'indexation des documents :',
     18        'configuration_indexation_document' => 'Configuration de l\'indexation des documents',
    1619        'convertir_myisam' => 'Convertir en MyISAM',
    1720        'convertir_toutes' => 'Convertir toutes les tables en MyISAM',
     
    2629        'enfantillage' => 'enfantillage',
    2730        'enfants' => 'enfants',
     31        'erreur_doc_bin' => 'Vous devez renseigner le binaire &agrave; utiliser pour extraire les .doc',
     32        'erreur_pdf_bin' => 'Vous devez renseigner le binaire &agrave; utiliser pour extraire les .pdf',
     33        'erreur_ppt_bin' => 'Vous devez renseigner le binaire &agrave; utiliser pour extraire les .ppt',
     34        'erreur_taille_index' => 'Il faut au moins indexer un caract&egrave;re.',
     35        'erreur_xls_bin' => 'Vous devez renseigner le binaire &agrave; utiliser pour extraire les .xls',
    2836        'et' => 'ET',
    2937        'etranger' => 'étranger',
     
    3442        'fonctionnement_recherche' => 'Fonctionnement du moteur de recherche de ce site',
    3543        'fulltext_cree' => 'FULLTEXT créé',
    36 
     44        'fulltext_documentation' => 'Pour plus d\'information sur la configuration, consultez la documentation en ligne :',
     45       
     46        //G
     47        'general' => 'Général',
     48       
    3749        // I
    3850        'il_faut_myisam' => 'il faut MyISAM',
     
    4052        'index_regenere' => 'index de la table régénérés',
    4153        'index_reinitialise' => 'Les documents en erreur ont été réinitialisés',
     54        'index_reinitialise_totalement' => 'Les document ont tous été réinitialisés',
    4255        'index_supprime' => 'index supprimé',
     56        'infos_fulltext_document' => 'Vous pourrez ici choisir quels type dedocuments sont indexés par Fulltext et configurer les binaires utilisés et leurs options.',
     57        'indiquer_chemin_bin' => 'Indiquer le chemin vers le binaire traitant l\'indexation des',
     58        'indiquer_options_bin' => 'Indiquer les options pour l\'indexation des',
     59       
    4360
    4461        // L
     
    4764        // M
    4865        'mais_pas' => 'mais PAS',
    49 
     66        'message_ok_configuration' => 'Enregistrement de vos pr&eacute;f&eacute;rences termin&eacute;e',
     67        'message_ok_update_configuration' => 'Mise &agrave; jour de vos pr&eacute;f&eacute;rences termin&eacute;e',
     68       
     69        //N
     70        'necessite_version_php' => '(n&eacute;cessite PHP 5.2 au minimum, ainsi que l\'option -enable-zip)',
     71        'nombre_caracteres' => 'Nombre de caract&egrave;res index&eacute;s (depuis le debut du document).',
     72       
    5073        // O
    5174        'ou_bien' => 'ou bien',
    52 
     75        // Q
     76        'que_des_exemples' => 'NB : les adresses de binaires et options propos&eacute;es ici ab initio ne sont que des exemples.',
    5377        // P
    5478        'pas_index' => 'Pas d\'index FULLTEXT',
     
    5882        'regenerer_tous' => 'Régénérer tous les index FULLTEXT',
    5983        'reinitialise_index_doc' => 'Réinitialiser l\'indexation des documents en erreur',
     84        'reinitialise_totalement_doc' => 'Réinitialiser l\'indexation de tous les documents',
    6085        'reserve_webmestres' => 'Page réservée aux webmestres',
    6186        'retourne' => 'Retourne les textes qui contiennent',
     87        'retour_configuration_fulltext' => 'Retour &agrave; la configuration de Fulltext',
    6288
    6389        // S
  • _plugins_/fulltext/plugin.xml

    r47831 r49180  
    33        Fulltext
    44        </nom>
    5         <auteur>Fil</auteur>
    6         <version>0.6.1</version>
     5        <auteur>Fil, Gael Chareyre</auteur>
     6        <version>0.6.2</version>
    77        <version_base>0.2</version_base>
    88        <etat>
     
    1313Indexation FULLTEXT du contenu pour acc&#233;l&#233;rer le moteur de recherche
    1414-* exploite le mode FULLTEXT SEARCH IN BOOLEAN MODE de MySQL, cf. [->http://dev.mysql.com/doc/refman/5.0/fr/fulltext-boolean.html]
    15 Pour un fonctionnement optimal, il faut installer des programmes compl&eacute;mentaires et param&eacute;trer leur utilisation dans <code>mes_options.php</code> :
     15Pour un fonctionnement optimal, il faut installer des programmes compl&eacute;mentaires et param&eacute;trer leur utilisation dans <code>mes_options.php</code> ou via le panneau de configuration :
     16-** Tous les types de documents doivent avoir une constante de type <code>_FULLTEXT_EXT_EXE</code> de d&eacute;finie (ou EXT est l'extension du document) ou l'&eacute;quivalent dans le panneau de configuration.
     17-** L'indexation de document est inactive par d&eacute;faut (aucune constantes de d&eacute;finies).
    1618-* Pour les {{PDF}} :
    1719-** Installer [Xpdf->http://www.foolabs.com/xpdf/]
     
    1921-*** Sur Mac OS X via [MacPorts->http://xpdf.darwinports.com/] ou avec cette [version compilée->http://users.phg-online.de/tk/MOSXS/xpdf-tools-3.dmg],
    2022-*** Sur d'[autres OS->http://www.foolabs.com/xpdf/download.html]
    21 -** Définir ces constantes :
     23-** D&eacute;finir ces constantes (ou utiliser le panneau de configuration):
    2224-*** <code>_FULLTEXT_PDF_EXE</code> (par exemple <code>/usr/bin/pdftotext</code>) : Chemin vers l'ex&eacute;cutable <code>pdftotext</code> de [Xdpf->http://www.foolabs.com/xpdf/] afin de transformer les fichiers PDF en texte brut
    2325-*** <code>_FULLTEXT_PDF_CMD_OPTIONS</code> (par exemple <code>-enc UTF-8</code>) : Options d'appel de l'ex&eacute;cutable
    2426-*<code>_FULLTEXT_TAILLE</code> : Taille maximum conserv&eacute;e pour la version texte des fichiers (50000 par d&eacute;faut)
     27-* Pour les {{DOC, PPT, XLS}} :
     28-** Installer [Catdoc->http://www.wagner.pp.ru/~vitus/software/catdoc/]
     29-*** Sur [Ubuntu/Linux->http://www.wagner.pp.ru/~vitus/software/catdoc/],
     30-*** Sur [Windows->http://blog.brush.co.nz/2009/09/catdoc-windows/]
     31-** D&eacute;finir les constantes correspondantes (ou utiliser le panneau de configuration) de la meme mani&egrave;re que pour les PDF.
     32-* Pour les {{ODT, DOCX, PPTX, XLSX}} :
     33-** Utilise des fonctions et des classes PHP (n&eacute;cessite PHP 5.2 au minimum, ainsi que l'option -enable-zip).
    2534        </description>
    2635        <lien>http://www.spip-contrib.net/Fulltext</lien> <!-- URI de documentation -->
Note: See TracChangeset for help on using the changeset viewer.