11

ApachePOIを使用しているときにMSWordファイルから(プログラムで)取得している文字列は、MSWordでファイルを開いたときに表示できるテキストとは異なります。

次のコードを使用する場合:

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」などの多くの不要な文字列を含む1行です。

次のコードは、1行の問題を「修正」しますが、すべての無効な文字と不要なテキストを維持します。

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のクイックガイドを見たときに思いついたのはそれです。私がそうなら、正しいアプローチは何ですか?

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

4

3 に答える 3

7

このクラスは、Javaで.docファイルと.docxファイルの両方を読み取ることができます。このために私はtika-app-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
于 2012-08-17T08:53:43.927 に答える
6

2つのオプションがあります。1つはApachePOIで直接提供され、もう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);
}

もう1つのオプションは、ApacheTikaを使用することです。Tikaは、さまざまなファイルのテキスト抽出とメタデータを提供するため、同じコードが.doc、.docx、.pdfなどの多くのファイルでも機能します。ワードドキュメントのクリーンでプレーンなテキストを取得するには(必要に応じてXHTMLを取得することもできます)、次のようにします。

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();
于 2012-04-22T18:56:21.247 に答える
3

これを試してみてください。私にとってはうまくいき、純粋にPOIソリューションです。ただし、対応するHWPFDocumentを探す必要があります。読んでいるドキュメントがWord97より前のものであることを確認してください。そうでない場合は、私のようにXWPFDocumentを使用してください。

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

特定の部分が必要な場合は、getparagraphtextを使用できますが、テキストエクストラクタは使用しないでください。このように、段落で直接使用してください。

for (XWPFParagraph p : adoc.getParagraphs()) 
{ 
    System.out.println(p.getParagraphText());
}
于 2014-11-04T10:16:32.730 に答える