任何人都可以教我将两个RTF文件合并到一个java中并将其转换为可读文本吗?

时间:2016-12-16 16:28:58

标签: java

如何将两个rtf文件合并为一个,以及如何使它们成为可读的文本rtf文件。我做了简单的FileReader并使用while循环来显示我想要读取的一个rtf文件,但它以疯狂的格式显示。

我之前从未使用过rtf而且之前从未听过它,所以如果有人可以教我或者帮我将两个rtf文件合并到一个文件中,或者只是告诉我如何使用FileReader显示我刚才读到的东西,变成可读的文本。

谢谢

1 个答案:

答案 0 :(得分:3)

连接两个RTF文件并不像直接将一个文件附加到另一个文件那样简单。 RTF文件具有包含样式,字符编码等元数据的标题信息,这些元数据可能存在冲突。

话虽如此,有一些变通方法和库可以让你在一定程度上破解你的方式。你可以:

  1. 您可以使用Java Swing的RTFEditorKit从这两个文件中提取文本,将它们连接起来并保存到新文件中。

  2. 使用第三方库,例如this

  3. 还有其他库,如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

    中选取的代码完成了主要的提升工作