我们需要将RTF文档的内容作为纯文本。
我们正在使用RFTEditorKit,但我们需要处理的许多RTF文档包含 \ headerf 或其他头字段,而RTFEditorKit不会解析这些(默默忽略)。
是否有另一种轻量级解决方案可以将这些文档解析为纯文本?
答案 0 :(得分:1)
RTF格式非常简单;编写自己的解析器不需要很长时间。否则,只需从JDK复制源代码并添加对缺少元素的支持(我说复制,因为从经验来看,JDK中的许多有用的类都无法扩展)。
[编辑]要确保这不会成为维护的噩梦,请将源复制到VCS上的不同项目中。相应地标记版本(因此,当Java的下一个版本发布时,您可以轻松地将其删除)。
然后创建第二个项目,这取决于第一个项目。分支您的第一个项目,并进行扩展原始类所需的所有小更改。保持这些变化很小。例如,将方法和字段设为public / protected并删除final。这样,跟踪更改很简单(因为您从不添加/删除行)。
与下一个版本合并将很容易。所有繁重的工作都必须在你自己的项目中完成。
答案 1 :(得分: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。