web-dev-qa-db-fra.com

Comment extraire du texte brut à partir de fichiers .doc et .docx?

Tout le monde sait tout ce qu'il peut recommander pour extraire uniquement le texte brut d'un .doc ou .docx?

J'ai trouvé ceci - je me demandais s'il y avait d'autres suggestions?

42
docextract

Si vous voulez du texte brut pur (mon exigence) alors tout ce dont vous avez besoin est

unzip -p some.docx Word/document.xml | sed -e 's/<[^>]\{1,\}>//g; s/[^[:print:]]\{1,\}//g'

Ce que j'ai trouvé sur ligne de commande f

Il décompresse le fichier docx et obtient le document réel, puis supprime toutes les balises xml. Évidemment, tout le formatage est perdu.

50
rob

LibreOffice

Une option est libreoffice /openoffice en mode sans tête (assurez-vous que toutes les autres instances de libreoffice sont fermées en premier):

libreoffice --headless --convert-to "txt:Text (encoded):UTF8" mydocument.doc

Pour plus de détails, voir par ex. ce lien: http://ask.libreoffice.org/en/question/2641/convert-to-command-line-parameter/

Pour une liste des filtres libreoffice, voir http://cgit.freedesktop.org/libreoffice/core/tree/filter/source/config/fragments/filters

Étant donné que la syntaxe de la ligne de commande openoffice est un peu trop compliquée, il existe un wrapper pratique qui peut rendre le processus plus facile: noconv .

Apache POI

Une autre option est Apache POI - une bibliothèque Java bien supportée qui contrairement à antiword peut lire, créer et convertir .doc, .docx, .xls, .xlsx, .ppt, .pptx Fichiers.

Voici le code Java le plus simple pour convertir un document .doc Ou .docx En texte brut:

import Java.io.FileInputStream;
import Java.io.FileWriter;
import Java.io.IOException;

import org.Apache.poi.POITextExtractor;
import org.Apache.poi.extractor.ExtractorFactory;
import org.Apache.poi.openxml4j.exceptions.OpenXML4JException;
import org.Apache.xmlbeans.XmlException;

public class WordToTextConverter {
    public static void main(String[] args) {
        try {
            convertWordToText(args[0], args[1]);
        } catch (ArrayIndexOutOfBoundsException aiobe) {
            System.out.println("Usage: Java WordToTextConverter <Word_file> <text_file>");
        }
    }

    public static void convertWordToText(String src, String desc) {
        try {
            FileInputStream fs = new FileInputStream(src);
            final POITextExtractor extractor = ExtractorFactory.createExtractor(fs);
            FileWriter fw = new FileWriter(desc);
            fw.write(extractor.getText());
            fw.flush();
            fs.close();
            fw.close();

        } catch (IOException | OpenXML4JException | XmlException e) {
            e.printStackTrace();
        }
    }
}


# Maven dependencies (pom.xml):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.Apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>my.wordconv</groupId>
<artifactId>my.wordconv.converter</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
    <dependency>
        <groupId>org.Apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.17</version>
    </dependency>
    <dependency>
        <groupId>org.Apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.17</version>
    </dependency>
    <dependency>
        <groupId>org.Apache.poi</groupId>
        <artifactId>poi-scratchpad</artifactId>
        <version>3.17</version>
    </dependency>
</dependencies>
</project>

REMARQUE: vous devrez ajouter les bibliothèques de poi Apache au chemin de classe. Sur ubuntu/debian, les bibliothèques peuvent être installées avec Sudo apt-get install libapache-poi-Java - cela les installera sous /usr/share/Java. Pour les autres systèmes, vous devrez télécharger la bibliothèque et décompresser l'archive dans un dossier que vous devriez utiliser au lieu de /usr/share/Java. Si vous utilisez maven/gradle (l'option recommandée), incluez alors dépendances org.Apache.poi comme indiqué dans l'extrait de code.

Le même code fonctionnera pour .doc Et .docx Car l'implémentation de convertisseur requise sera choisie en inspectant le flux binaire.

Compilez la classe ci-dessus (en supposant qu'elle se trouve dans le package par défaut et que les pots Api poi sont sous /usr/share/Java):

javac -cp /usr/share/Java/*:. WordToTextConverter.Java

Exécutez la conversion:

Java -cp /usr/share/Java/*:. WordToTextConverter doc.docx doc.txt 

Un projet gradable clonable qui tire toutes les dépendances nécessaires et génère le script Shell wrapper (avec gradle installDist).

28
ccpizza

Essayez Apache Tika . Il prend en charge la plupart des formats de documents (tous les formats Office, formats OpenOffice/LibreOffice, PDF, etc.) en utilisant des bibliothèques basées sur Java (entre autres, Apache POI ). C'est très simple à utiliser:

Java -jar tika-app-1.4.jar --text ./my-document.doc

11
molnarg

Mon préféré est antiword:

http://www.winfield.demon.nl/

Et voici un projet similaire qui revendique le support de docx:

https://github.com/rainey/antiword-xp-rb/wiki

10
Chris Eberle

Je trouve que wv est meilleur que catdoc ou antiword. Il peut gérer le .docx et le convertir en texte ou en html. Voici une fonction que j'ai ajoutée à mon .bashrc pour afficher temporairement le fichier dans le terminal. Modifiez-le si nécessaire.

# open Word in less (ie worl document.doc)
worl() {
    DOC=$(mktemp /tmp/output.XXXXXXXXXX)
    wvText $1 $DOC
    less $DOC
    rm $DOC
}
5
Andre

J'ai récemment traité ce problème et constaté que les outils de ligne de commande OpenOffice/LibreOffice n'étaient pas fiables en production (des milliers de documents traités, des dizaines simultanément).

En fin de compte, j'ai construit un wrapper léger, DocRipper qui est beaucoup plus rapide et récupère tout le texte de .doc, .docx et .pdf sans formatage. DocRipper utilise Antiword, grep et pdftotext pour saisir du texte et le renvoyer.

1
Paul

Pour docx, que diriez-vous http://libopc.codeplex.com/

1
JasonPlutext