Java 如何提取rtf表

Java 如何提取rtf表,java,text,rtf,text-mining,text-extraction,Java,Text,Rtf,Text Mining,Text Extraction,我有一个rtf文件。里面有很多桌子。我一直在尝试使用java(POI和tika)来提取表。这在.doc中是很容易的,因为表是这样定义的。然而,在rtf文件中,似乎没有任何“thisatable”标记作为元数据的一部分。有人知道从这样的文件中提取表的最佳策略是什么吗?将其转换为其他文件格式会有所帮助。有什么线索要我查吗?有一个叫做unrtf的linux工具,请看 使用该应用程序,您可以将rtf文件转换为html: unrtf --html your_input_file.rtf > your

我有一个rtf文件。里面有很多桌子。我一直在尝试使用java(POI和tika)来提取表。这在.doc中是很容易的,因为表是这样定义的。然而,在rtf文件中,似乎没有任何“thisatable”标记作为元数据的一部分。有人知道从这样的文件中提取表的最佳策略是什么吗?将其转换为其他文件格式会有所帮助。有什么线索要我查吗?

有一个叫做unrtf的linux工具,请看

使用该应用程序,您可以将rtf文件转换为html:

unrtf --html your_input_file.rtf > your_output_file.html

现在,您可以使用任何编程api来操作html/xml并轻松提取表。您需要的足够了吗?

谢谢hexin的回答。最后,我能够使用Tika,方法是使用TXTParser,然后将粗体标记之间的所有段(这就是我的表的分隔方式)放入arraylist中。我必须使用制表符分隔符从那里定义表格。 以下代码没有基于选项卡提取表的位(仍在处理):

导入java.io.File;
导入java.io.FileInputStream;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.regex.Matcher;
导入java.util.regex.Pattern;
导入org.apache.tika.exception.TikaException;
导入org.apache.tika.metadata.metadata;
导入org.apache.tika.metadata.TikaCoreProperties;
导入org.apache.tika.parser.ParseContext;
导入org.apache.tika.parser.html.HtmlParser;
导入org.apache.tika.parser.rtf.RTFParser;
导入org.apache.tika.parser.txt.TXTParser;
导入org.apache.tika.sax.BodyContentHandler;
导入org.xml.sax.SAXException;
公共类文本分析器{
公共静态void main(最终字符串[]args)引发IOException、TikaException{
//检测文件类型
BodyContentHandler=新的BodyContentHandler(-1);
元数据=新元数据();
FileInputStream-inputstream=newfileinputstream(新文件(“/Users/mydoc.rtf”);
ParseContext pcontext=新的ParseContext();
//文本文档解析器
TXTParser TXTParser=新的TXTParser();
试一试{
parse(inputstream、处理程序、元数据、pcontext);
}捕获(SAXE异常){
e、 printStackTrace();
} 
字符串s=handler.toString();
Pattern Pattern=Pattern.compile(“\\\\b\\\\f1\\\\fs24.+?\\\\par.+?)\\\\b\\\\f1\\\\fs24.*?\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\;
匹配器匹配器=模式匹配器;
ArrayList arr=新的ArrayList();
while(matcher.find()){
arr.add(匹配器组(1));
}
for(字符串名称:arr){
System.out.println(“数组编号为:”+arr.indexOf(name)+“\n\n”+name);
}
}
}
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.metadata.TikaCoreProperties;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.html.HtmlParser;
import org.apache.tika.parser.rtf.RTFParser;
import org.apache.tika.parser.txt.TXTParser;
import org.apache.tika.sax.BodyContentHandler;
import org.xml.sax.SAXException;


public class TextParser {
public static void main(final String[] args) throws IOException,TikaException{
 //detecting the file type
 BodyContentHandler handler = new BodyContentHandler(-1);
 Metadata metadata = new Metadata();

 FileInputStream inputstream = new FileInputStream(new File("/Users/mydoc.rtf"));
 ParseContext pcontext = new ParseContext();

 //Text document parser
 TXTParser TXTParser = new TXTParser();
 try {
     TXTParser.parse(inputstream, handler, metadata,pcontext);

} catch (SAXException e) {

    e.printStackTrace();
} 
 String s=handler.toString();

Pattern pattern = Pattern.compile("(\\\\b\\\\f1\\\\fs24.+?\\\\par .+?)\\\\b\\\\f1\\\\fs24.*?\\{\\\\",Pattern.DOTALL);

Matcher matcher = pattern.matcher(s);
ArrayList<String> arr= new ArrayList<String>();

while (matcher.find()) {
       arr.add(matcher.group(1));
     }

 for(String name : arr){
     System.out.println("The array number is: "+arr.indexOf(name)+" \n\n "+name);
 }

 }
}