2012-04-20 18 views
11

Apache POIを使用しているときに私が(プログラムで)MS Wordファイルから取得している文字列は、MS Wordでファイルを開くと見ることができるテキストと同じではありません。Java:Apache POI:MS Word(.doc)ファイルからクリーンテキストを取得できますか?

次のコードを使用している場合:

File someFile = new File("some\\path\\MSWFile.doc"); 
InputStream inputStrm = new FileInputStream(someFile); 
HWPFDocument wordDoc = new HWPFDocument(inputStrm); 
System.out.println(wordDoc.getText()); 

の出力が "、多くの「無効」の文字(はい、「ボックス」)を持つ単一の行、および「FORMTEXT」のような多くの不要な文字列であり、HYPERLINK \l "_Toc##########" 「(数字であること 『#』)、」PAGEREF _Toc########## \h 4」など

次のコードを 『修正』シングルラインの問題が、すべての無効な文字や不要なテキストを維持します。

File someFile = new File("some\\path\\MSWFile.doc"); 
InputStream inputStrm = new FileInputStream(someFile); 
WordExtractor wordExtractor = new WordExtractor(inputStrm); 
for(String paragraph:wordExtractor.getParagraphText()){ 
    System.out.println(paragraph); 
} 

テキストを抽出するのに間違った方法を使用しているのかどうかわかりませんが、それはPOI's quick-guideを見ると思い付きます。私の場合、正しいアプローチは何ですか?

出力が正しい場合は、不要なテキストを取り除くための標準的な方法がありますか、それとも独自のフィルターを作成する必要がありますか?

答えて

6

2つのオプションがあります.1つはApache POIに直接提供され、もう1つはApache Tika(Apache POIを内部的に使用する)経由で提供されます。

最初のオプションはWordExtractorを使用しますが、呼び出すときはstripFields(String)を呼び出してラップします。これは、あなたが見たHYPERLINKのようなテキストに含まれるテキストベースのフィールドを削除します。コードは

NPOIFSFileSystem fs = new NPOIFSFileSytem(file); 
WordExtractor extractor = new WordExtractor(fs.getRoot()); 

for(String rawText : extractor.getParagraphText()) { 
String text = extractor.stripFields(rawText); 
System.out.println(text); 
} 

Apache Tikaです。 Tikaは、さまざまなファイルに対してテキスト抽出とメタデータを提供するので、.doc、.docx、.pdfなどの多くのコードで同じコードが使用できます。 Javaでの.docや.docxの両方のファイルを読み込むことができ

TikaConfig tika = TikaConfig.getDefaultConfig(); 
TikaInputStream stream = TikaInputStream.get(file); 
ContentHandler handler = new BodyContentHandler(); 
Metadata metadata = new Metadata(); 
tika.getParser().parse(input, handler, metadata, new ParseContext()); 
String text = handler.toString(); 
+2

などの段落に直接それを使用いけない場合

InputStream inputstream = new FileInputStream(m_filepath); //read the file XWPFDocument adoc= new XWPFDocument(inputstream); //and place it in a xwpf format aString = new XWPFWordExtractor(adoc).getText(); //gets the full text 

私のテスト。 TIKA-1.2は、.docファイルからFORMCHECKBOXなどを返しました。 .docxファイルは正常に機能しました。 – Simon

+0

最新のTikaバージョン1.3を試してみることをお勧めします。それでも問題が発生した場合は、[バグを報告](https://issues.apache.org/jira/browse/TIKA)して、それを示すサンプルファイルをアップロードしてください。 – Gagravarr

+0

これは、私にとってTika 1.3では、それが価値があるためにまだ起こります。 – damd

7

このクラス:、あなたのような何かをしたいWord文書のきれいな、プレーンテキストを取得するには(あなたは、むしろしたい場合、あなたはまた、XHTMLを得ることができます) 。このために私はティカアプリ-1.2.jarを使用しています:

/* 
* This class is used to read .doc and .docx files 
* 
* @author Developer 
* 
*/ 

import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.net.URL; 
import org.apache.tika.detect.DefaultDetector; 
import org.apache.tika.detect.Detector; 
import org.apache.tika.io.TikaInputStream; 
import org.apache.tika.metadata.Metadata; 
import org.apache.tika.parser.AutoDetectParser; 
import org.apache.tika.parser.ParseContext; 
import org.apache.tika.parser.Parser; 
import org.apache.tika.sax.BodyContentHandler; 
import org.xml.sax.ContentHandler; 

class TextExtractor { 
    private OutputStream outputstream; 
    private ParseContext context; 
    private Detector detector; 
    private Parser parser; 
    private Metadata metadata; 
    private String extractedText; 

    public TextExtractor() { 
     context = new ParseContext(); 
     detector = new DefaultDetector(); 
     parser = new AutoDetectParser(detector); 
     context.set(Parser.class, parser); 
     outputstream = new ByteArrayOutputStream(); 
     metadata = new Metadata(); 
    } 

    public void process(String filename) throws Exception { 
     URL url; 
     File file = new File(filename); 
     if (file.isFile()) { 
      url = file.toURI().toURL(); 
     } else { 
      url = new URL(filename); 
     } 
     InputStream input = TikaInputStream.get(url, metadata); 
     ContentHandler handler = new BodyContentHandler(outputstream); 
     parser.parse(input, handler, metadata, context); 
     input.close(); 
    } 

    public void getString() { 
     //Get the text into a String object 
     extractedText = outputstream.toString(); 
     //Do whatever you want with this String object. 
     System.out.println(extractedText); 
    } 

    public static void main(String args[]) throws Exception { 
     if (args.length == 1) { 
      TextExtractor textExtractor = new TextExtractor(); 
      textExtractor.process(args[0]); 
      textExtractor.getString(); 
     } else { 
      throw new Exception(); 
     } 
    } 
} 

をコンパイルするには:

javac -cp ".:tika-app-1.2.jar" TextExtractor.java 

を実行するには:

java -cp ".:tika-app-1.2.jar" TextExtractor SomeWordDocument.doc 
3

は私のために動作し、純粋で、これを試してみてくださいPOIソリューションあなたはHWPFDocumentの対応を探す必要があります。読んでいる文書がWord 97よりも先にあるかどうかを確認してください。そうでない場合はXWPFDocumentを使用してください。今、あなたはあなたがgetparagraphtext使用することができ、特定の部品をしたいが、テキスト抽出器を使用して第二の溶液が中に動作しませんでした。この

for (XWPFParagraph p : adoc.getParagraphs()) 
{ 
    System.out.println(p.getParagraphText()); 
} 
関連する問題