如何提取rtf表
How to extract rtf tables
我有一个 rtf 文件。它有很多 table 里面。我一直在尝试使用 java(POI 和 tika)来提取 table。这在 .doc 中很容易,其中 tables 是这样定义的。但是在 rtf 文件中似乎没有任何 'this is a table' 标记作为元数据的一部分。有谁知道从这样的文件中提取 table 的最佳策略是什么?将其转换为另一种文件格式有帮助。有什么线索可以让我查找吗?
有一个linux工具叫unrtf,看看manual
使用该应用程序,您可以将 rtf 文件转换为 html:
unrtf --html your_input_file.rtf > your_output_file.html
现在您可以使用任何编程 api 来轻松操作 html/xml 和提取表格。够你用吗?
感谢hexin的回答。最后,我能够通过使用 TXTParser 来使用 Tika,然后将粗体标记之间的所有段(这是我的表的分隔方式)放入数组列表中。我不得不使用制表符分隔符从那里定义表格。
这是没有位的代码,可以根据选项卡提取表格(仍在处理中):
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);
}
}
}
我有一个 rtf 文件。它有很多 table 里面。我一直在尝试使用 java(POI 和 tika)来提取 table。这在 .doc 中很容易,其中 tables 是这样定义的。但是在 rtf 文件中似乎没有任何 'this is a table' 标记作为元数据的一部分。有谁知道从这样的文件中提取 table 的最佳策略是什么?将其转换为另一种文件格式有帮助。有什么线索可以让我查找吗?
有一个linux工具叫unrtf,看看manual
使用该应用程序,您可以将 rtf 文件转换为 html:
unrtf --html your_input_file.rtf > your_output_file.html
现在您可以使用任何编程 api 来轻松操作 html/xml 和提取表格。够你用吗?
感谢hexin的回答。最后,我能够通过使用 TXTParser 来使用 Tika,然后将粗体标记之间的所有段(这是我的表的分隔方式)放入数组列表中。我不得不使用制表符分隔符从那里定义表格。 这是没有位的代码,可以根据选项卡提取表格(仍在处理中):
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);
}
}
}