![](/img/trans.png)
[英]How can I extract right-to-left text from .doc and .docx files using Apache POI in java?
[英]Java: Apache POI: Can I get clean text from MS Word (.doc) files?
我在使用 Apache POI 時(以編程方式)從 MS Word 文件中獲取的字符串與我在使用 MS Word 打開文件時可以查看的文本不同。
使用以下代碼時:
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 的快速指南時想到的。 如果我是,正確的方法是什么?
如果該輸出是正確的,是否有一種標准方法可以去除不需要的文本,還是我必須編寫自己的過濾器?
此類可以讀取 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
有兩種選擇,一種直接在 Apache POI 中提供,另一種通過 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 和許多其他文件。 要獲得干凈、純文本的 Word 文檔(如果您願意,也可以獲取 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();
試試這個,對我有用,純粹是一個 POI 解決方案。 不過,您將不得不尋找 HWPFDocument 副本。 確保您正在閱讀的文檔早於 Word 97,否則像我一樣使用 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());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.