2012-04-20 46 views
11

अपाचे पीओआई का उपयोग करते समय एमएस वर्ड फाइलों से प्राप्त होने वाले तार (प्रोग्रामेटिक रूप से) एक ही पाठ नहीं हैं, जब मैं एमएस वर्ड के साथ फाइलें खोलता हूं।जावा: अपाचे पीओआई: क्या मुझे एमएस वर्ड (.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

दो विकल्प हैं, जो सीधे अपाचे पीओआई में प्रदान किए जाते हैं, दूसरा अपाचे टिका के माध्यम से (जो आंतरिक रूप से अपाचे पीओआई का उपयोग करता है)।

पहला विकल्प 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 का उपयोग करना है। टीका विभिन्न प्रकार की फाइलों के लिए टेक्स्ट निष्कर्षण, और मेटाडाटा प्रदान करता है, इसलिए एक ही कोड .doc, .docx, .pdf और कई अन्य लोगों के लिए भी काम करेगा। अपने शब्द दस्तावेज़ के स्वच्छ, सादा पाठ प्राप्त करने के लिए (आप भी एक्सएचटीएमएल प्राप्त कर सकते हैं यदि आप नहीं बल्कि चाहते हैं), तो आप की तरह कुछ करना चाहते हैं:

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

तरह पैरा दूसरा समाधान में काम नहीं किया पर सीधे इसका इस्तेमाल न मेरे परीक्षण TIKA-1.2 FORMCHECKBOX और .doc फ़ाइलों से अन्य चीजें लौटा दी। हालांकि .docx फ़ाइलें ठीक काम किया। – Simon

+0

मैं आपको सबसे हालिया Tika संस्करण, 1.3 के साथ प्रयास करने का सुझाव दूंगा। यदि समस्या अभी भी होती है, तो कृपया [एक बग उठाएं] (https://issues.apache.org/jira/browse/TIKA) और इसे दिखाते हुए एक नमूना फ़ाइल अपलोड करें, ताकि हम जांच कर सकें! – Gagravarr

+0

यह अभी भी मेरे लिए Tika 1.3 में होता है, इसके लिए यह क्या लायक है। – damd

7

इस वर्ग के जावा में दोनों .doc और .docx फ़ाइलों को पढ़ सकता । इसके लिए मैं टीका-ऐप्लिकेशन-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

इस प्रयास करें, मेरे लिए काम करता है और विशुद्ध रूप है एक पीओआई समाधान। हालांकि आपको 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()); 
}