如何将两个rtf文件合并为一个,以及如何使它们成为可读的文本rtf文件。我做了简单的FileReader并使用while循环来显示我想要读取的一个rtf文件,但它以疯狂的格式显示。
我之前从未使用过rtf而且之前从未听过它,所以如果有人可以教我或者帮我将两个rtf文件合并到一个文件中,或者只是告诉我如何使用FileReader显示我刚才读到的东西,变成可读的文本。
谢谢
答案 0 :(得分:3)
连接两个RTF文件并不像直接将一个文件附加到另一个文件那样简单。 RTF文件具有包含样式,字符编码等元数据的标题信息,这些元数据可能存在冲突。
话虽如此,有一些变通方法和库可以让你在一定程度上破解你的方式。你可以:
您可以使用Java Swing的RTFEditorKit从这两个文件中提取文本,将它们连接起来并保存到新文件中。
使用第三方库,例如this
还有其他库,如Apache Tika,POI(如果您首先将RTF转换为MS Word格式),使您能够以不同程度的质量和效率做同样的事情。
我希望这会帮助你成为这项工作的起点。一旦您开始遵循特定的方法并且遇到问题,您可以稍后在stackoverflow上发布有关该问题的具体问题以及您在此之前所做的事情。
修改的
因为我今天有空闲时间,所以我实际上继续进行实际实现以连接两个RTF文件。我已经测试了代码,它正在按预期工作两个类似格式的RTF文件。
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Method;
import java.util.ArrayList;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.Document;
import javax.swing.text.Element;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.rtf.RTFEditorKit;
public class RTFReader {
public static void main(String[] args) {
File input1 = new File("C:\\ragu\\input1.rtf");
File input2 = new File("C:\\ragu\\input2.rtf");
File output = new File ("C:\\ragu\\output.rtf");
FileInputStream fis1 = null;
FileInputStream fis2 = null;
FileOutputStream fw = null;
try {
fis1 = new FileInputStream(input1);
fis2 = new FileInputStream(input2);
fw = new FileOutputStream(output);
} catch (IOException e1) {
e1.printStackTrace();
}
try {
Document doc1 = load(fis1);
Document doc2 = load(fis2);
//String contents1 = doc1.getText(0, doc1.getLength());
//String contents2 = doc2.getText(0, doc2.getLength());
mergeDocument((DefaultStyledDocument)doc2, (DefaultStyledDocument)doc1);
RTFEditorKit rtf = new RTFEditorKit();
rtf.write(fw, doc1, 0, doc1.getLength());
//System.out.println(contents1+contents2);
} catch (IOException e) {
e.printStackTrace();
} catch (BadLocationException e) {
e.printStackTrace();
}
finally{
try {
fis1.close();
fis2.close();
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static Document load(InputStream is) throws IOException {
RTFEditorKit rtf = new RTFEditorKit();
Document doc = rtf.createDefaultDocument();
BufferedReader input = new BufferedReader(new InputStreamReader(is));
try {
rtf.read(input, doc, 0);
} catch (BadLocationException ble) {
throw new IOException(ble);
}
return doc;
}
public static void mergeDocument(DefaultStyledDocument source, DefaultStyledDocument dest) throws BadLocationException {
ArrayList<DefaultStyledDocument.ElementSpec> specs=new ArrayList<DefaultStyledDocument.ElementSpec>();
DefaultStyledDocument.ElementSpec spec=new DefaultStyledDocument.ElementSpec(new SimpleAttributeSet(),
DefaultStyledDocument.ElementSpec.EndTagType);
specs.add(spec);
fillSpecs(source.getDefaultRootElement(), specs, false);
spec=new DefaultStyledDocument.ElementSpec(new SimpleAttributeSet(), DefaultStyledDocument.ElementSpec.StartTagType);
specs.add(spec);
DefaultStyledDocument.ElementSpec[] arr = new DefaultStyledDocument.ElementSpec[specs.size()];
specs.toArray(arr);
insertSpecs(dest, dest.getLength(), arr);
}
protected static void insertSpecs(DefaultStyledDocument doc, int offset, DefaultStyledDocument.ElementSpec[] specs) {
try {
Method m=DefaultStyledDocument.class.getDeclaredMethod("insert", new Class[] {int.class, DefaultStyledDocument.ElementSpec[].class});
m.setAccessible(true);
m.invoke(doc, new Object[] {offset, specs});
} catch (Exception e) {
e.printStackTrace();
}
}
protected static void fillSpecs(Element elem, ArrayList<DefaultStyledDocument.ElementSpec> specs, boolean includeRoot) throws BadLocationException{
DefaultStyledDocument.ElementSpec spec;
if (elem.isLeaf()) {
String str=elem.getDocument().getText(elem.getStartOffset(), elem.getEndOffset()-elem.getStartOffset());
spec=new DefaultStyledDocument.ElementSpec(elem.getAttributes(),
DefaultStyledDocument.ElementSpec.ContentType,str.toCharArray(), 0, str.length());
specs.add(spec);
}
else {
if (includeRoot) {
spec=new DefaultStyledDocument.ElementSpec(elem.getAttributes(), DefaultStyledDocument.ElementSpec.StartTagType);
specs.add(spec);
}
for (int i=0; i<elem.getElementCount(); i++) {
fillSpecs(elem.getElement(i), specs, true);
}
if (includeRoot) {
spec=new DefaultStyledDocument.ElementSpec(elem.getAttributes(), DefaultStyledDocument.ElementSpec.EndTagType);
specs.add(spec);
}
}
}
}
OP:请记住,您不能期望以后完全实施SO。我之所以这么做是因为我有空闲时间,但通常你会自己开始做点什么。享受!
EDIT2 忘记提及学分: 我从here
中选取的代码完成了主要的提升工作