web-dev-qa-db-fra.com

Extraire le texte de doc et docx

J'aimerais savoir comment lire le contenu d'un document doc ou docx. J'utilise un serveur Linux VPS et PHP, mais s'il existe une solution plus simple utilisant un autre langage, veuillez me le faire savoir, dans la mesure où cela fonctionne sous un serveur Web Linux.

14
Alexandre Mota

Ceci est une solution .DOCX uniquement. Pour .DOC ou .PDF, vous devrez utiliser quelque chose d'autre comme pdf2text.php for PDF

function docx2text($filename) {
   return readZippedXML($filename, "Word/document.xml");
 }

function readZippedXML($archiveFile, $dataFile) {
// Create new Zip archive
$Zip = new ZipArchive;

// Open received archive file
if (true === $Zip->open($archiveFile)) {
    // If done, search for the data file in the archive
    if (($index = $Zip->locateName($dataFile)) !== false) {
        // If found, read it to the string
        $data = $Zip->getFromIndex($index);
        // Close archive file
        $Zip->close();
        // Load XML from a string
        // Skip errors and warnings
        $xml = new DOMDocument();
    $xml->loadXML($data, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
        // Return data without XML formatting tags
        return strip_tags($xml->saveXML());
    }
    $Zip->close();
}

// In case of failure return empty string
return "";
}

echo docx2text("test.docx"); // Save this contents to file
15
no_freedom

Ici, j'ai ajouté la solution pour obtenir le texte des fichiers .doc, .docx Word

Comment extraire du texte d'un fichier Word .doc, docx php

Pour .doc

private function read_doc() {
    $fileHandle = fopen($this->filename, "r");
    $line = @fread($fileHandle, filesize($this->filename));   
    $lines = explode(chr(0x0D),$line);
    $outtext = "";
    foreach($lines as $thisline)
      {
        $pos = strpos($thisline, chr(0x00));
        if (($pos !== FALSE)||(strlen($thisline)==0))
          {
          } else {
            $outtext .= $thisline." ";
          }
      }
     $outtext = preg_replace("/[^a-zA-Z0-9\s\,\.\-\n\r\t@\/\_\(\)]/","",$outtext);
    return $outtext;
}

Pour .docx

private function read_docx(){

        $striped_content = '';
        $content = '';

        $Zip = Zip_open($this->filename);

        if (!$Zip || is_numeric($Zip)) return false;

        while ($Zip_entry = Zip_read($Zip)) {

            if (Zip_entry_open($Zip, $Zip_entry) == FALSE) continue;

            if (Zip_entry_name($Zip_entry) != "Word/document.xml") continue;

            $content .= Zip_entry_read($Zip_entry, Zip_entry_filesize($Zip_entry));

            Zip_entry_close($Zip_entry);
        }// end while

        Zip_close($Zip);

        $content = str_replace('</w:r></w:p></w:tc><w:tc>', " ", $content);
        $content = str_replace('</w:r></w:p>', "\r\n", $content);
        $striped_content = strip_tags($content);

        return $striped_content;
    }
12
M Khalid Junaid

Analyser les documents .docx, .odt, .doc et .rtf

J'ai écrit une bibliothèque qui analyse les documents docx, odt et rtf à partir de réponses fournies ici et ailleurs.

L’amélioration majeure que j’ai apportée à l’analyse .docx et .odt est que la bibliothèque traite le code XML décrivant le document et tente de le rendre conforme aux balises HTML, à savoir em et strong Mots clés. Cela signifie que si vous utilisez la bibliothèque pour un CMS, le formatage du texte n'est pas perdu.

Vous pouvez l'obtenir ici

7
Luke Madhanga

Ma solution est Antiword pour .doc et docx2txt pour .docx

En supposant que vous contrôliez un serveur Linux, téléchargez-les, extrayez-les puis installez-les. J'ai installé chaque système à l'échelle:

Anti-mot: make global_install
docx2txt: make install

Ensuite, utiliser ces outils pour extraire le texte dans une chaîne php:

//for .doc
$text = Shell_exec('/usr/local/bin/antiword -w 0 ' . 
    escapeshellarg($docFilePath));

//for .docx
$text = Shell_exec('/usr/local/bin/docx2txt.pl ' . 
    escapeshellarg($docxFilePath) . ' -');

docx2txt requiert Perl

la solution de no_freedom extrait le texte des fichiers docx, mais elle peut masquer les espaces. La plupart des fichiers que j'ai testés avaient des cas où les mots devant être séparés n'avaient pas d'espace entre eux. Ce n'est pas bien lorsque vous souhaitez effectuer une recherche en texte intégral dans les documents que vous traitez.

6
chiptuned

Essayez ApachePOI . Cela fonctionne bien pour Java. Je suppose que vous n’aurez aucune difficulté à installer Java sous Linux.

1
Lalaka

J'ai utilisé docxtotxt pour extraire le contenu du fichier docx. Mon code est le suivant:

if($extention == "docx")
{   
    $docxFilePath = "/var/www/vhosts/abc.com/httpdocs/writers/filename.docx";
    $content = Shell_exec('/var/www/vhosts/abc.com/httpdocs/docx2txt/docx2txt.pl     
    '.escapeshellarg($docxFilePath) . ' -');
}
0
Mohini

Vous pouvez utiliser Apache Tika comme solution complète fournissant l’API REST.

Une autre bonne bibliothèque est RawText , car elle peut faire une OCR sur des images et extraire du texte de n’importe quel document. Ce n'est pas gratuit, et cela fonctionne sur REST API.

L'exemple de code extrayant votre fichier avec RawText:

$result = $rawText->extract($your_file)
0
SochiX

J'insère de petites améliorations dans la fonction de conversion de doc en txt

private function read_doc() {
    $line_array = array();
    $fileHandle = fopen( $this->filename, "r" );
    $line       = @fread( $fileHandle, filesize( $this->filename ) );
    $lines      = explode( chr( 0x0D ), $line );
    $outtext    = "";
    foreach ( $lines as $thisline ) {
        $pos = strpos( $thisline, chr( 0x00 ) );
        if (  $pos !== false )  {

        } else {
            $line_array[] = preg_replace( "/[^a-zA-Z0-9\s\,\.\-\n\r\t@\/\_\(\)]/", "", $thisline );

        }
    }

    return implode("\n",$line_array);
}

Maintenant, il enregistre les lignes vides et le fichier txt ressemble ligne par ligne.

0
kadutskyi