【问题标题】:rtf to text including headers and footersrtf 到文本,包括页眉和页脚
【发布时间】:2009-10-21 14:59:43
【问题描述】:

我们需要将 RTF 文档的内容作为纯文本获取。

我们为此使用了 RFTEditorKit,但我们需要处理的许多 RTF 文档包含 \headerf 或其他标头字段,而 RTFEditorKit 不解析这些(默默地忽略)。

还有其他轻量级的解决方案可以将这些文档解析为纯文本吗?

【问题讨论】:

    标签: java rtf


    【解决方案1】:

    RTF 格式非常简单;编写自己的解析器应该不会花很长时间。否则,只需从 JDK 复制源代码并添加对缺失元素的支持(我说复制是因为根据经验,JDK 中的许多有用的类无法扩展)。

    [编辑] 为确保这不会成为维护的噩梦,请将源代码复制到 VCS 上的不同项目中。相应地标记版本(这样您就可以在 Java 的下一个版本到来时轻松将其取出)。

    然后创建依赖于第一个项目的第二个项目。分支您的第一个项目并进行扩展原始类所需的所有小更改。保持这些变化很小。例如,将方法和字段设为 public/protected 并删除 final。这样,就可以轻松跟踪更改(因为您从不添加/删除行)。

    然后与下一个版本合并将很容易。所有繁重的工作都必须在您自己的项目中完成。

    【讨论】:

    • 对于复制和粘贴需要 c&p 几乎整个 javax.swing.text.rtf 包,我不喜欢这样做,而且这些解决方案往往会回来并成为维护问题
    【解决方案2】:

    这可能是您解决方案的一部分:检索纯文本长度的 (C++) 方法。您可以将字符复制到另一个字符串,而不是增加计数器。

    短译:klammern = 括号

    int Global::GetRtfPlainLength(const CString str)
    {
    int klammern = 0;
    bool command = false;
    int length = 0;
    int i = 0;
    
    //TRACE("\n%s\n",str);
    
    while(i < str.GetLength())
    {
        switch(str[i])
        {
        case '{': 
            klammern++;
            break;
    
        case '}': 
            klammern--;
            break;
    
        case '\\':
            if(!command) // only relevant outside command
            {
                switch(str[i + 1])
                {
                case '\'': // special chars: \'XX -> count only 1
                    i += 3;
                    length++;
                    break;
                case '{': // escaped parenthesis
                case '}':
                    length++;
                    i++;
                    break;
                default: // begin of a command
                    command = true;
                    i++;
                    break;
                } // switch
            }
            break;
    
        case ' ': 
            if(klammern == 1) // inside parenthesis a space is part of the command
            {
                if(command)
                    command = false;
                else 
                    length++;
            }
            break;
    
        case 10:
        case 13:
            break;
    
        default:
            if(!command)
                length++;
            break;
        } // switch
    
        i++;
    } // while
    
    // some corrections
    length += FindCount(str,"\\line ") * 2;
    length += FindCount(str,"\\par ") * 2;
    
    return length;
    }
    

    HTH 一点。

    【讨论】:

      猜你喜欢
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多