0

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

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

是否有另一种轻量级的解决方案可以将这些文档解析为纯文本?

4

2 回答 2

1

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

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

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

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

于 2009-10-21T15:07:33.597 回答
0

这可能是您解决方案的一部分:检索纯文本长度的(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 一点。

于 2009-11-03T12:14:11.790 回答