Java rtf到文本,包括页眉和页脚
我们需要以纯文本的形式获取RTF文档的内容 我们使用了RFTEditorKit,但我们需要处理的许多RTF文档都包含\headerf或其他头字段,RTFEditorKit不会解析这些字段(默认忽略)Java rtf到文本,包括页眉和页脚,java,rtf,Java,Rtf,我们需要以纯文本的形式获取RTF文档的内容 我们使用了RFTEditorKit,但我们需要处理的许多RTF文档都包含\headerf或其他头字段,RTFEditorKit不会解析这些字段(默认忽略) 有没有另一种轻量级的解决方案可以将这些文档解析为纯文本?RTF格式非常简单;编写自己的解析器应该不会花太长时间。否则,只需从JDK复制源代码并添加对缺少元素的支持(我说是复制,因为根据经验,JDK中的许多有用类无法扩展) [编辑]为了确保这不会成为维护的噩梦,请将源代码复制到VCS上的不同项目中。相
有没有另一种轻量级的解决方案可以将这些文档解析为纯文本?RTF格式非常简单;编写自己的解析器应该不会花太长时间。否则,只需从JDK复制源代码并添加对缺少元素的支持(我说是复制,因为根据经验,JDK中的许多有用类无法扩展) [编辑]为了确保这不会成为维护的噩梦,请将源代码复制到VCS上的不同项目中。相应地标记版本(以便在下一个Java版本发布时可以轻松地将其取出) 然后根据第一个项目创建第二个项目。分支第一个项目,并进行扩展原始类所需的所有小更改。保持这些变化小。例如,将方法和字段设置为公共/受保护,并删除final。通过这种方式,很容易跟踪更改(因为您从不添加/删除行)
与下一个版本合并将很容易。所有繁重的工作都必须在您自己的项目中完成。这可能是您解决方案的一部分:使用(C++)方法检索纯文本的长度。您可以将字符复制到另一个字符串,而不是递增计数器 简短翻译:Klamern=括号
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;
}
int Global::GetRtfPlainLength(const CString str)
{
int-klammern=0;
bool命令=false;
整数长度=0;
int i=0;
//跟踪(“\n%s\n”,str);
而(i仅计数1
i+=3;
长度++;
打破
大小写“{”://转义括号
案例“}”:
长度++;
i++;
打破
默认值://命令的开始
命令=真;
i++;
打破
}//开关
}
打破
案例“”:
if(klammern==1)//在括号内,空格是命令的一部分
{
如果(命令)
命令=假;
其他的
长度++;
}
打破
案例10:
案例13:
打破
违约:
如果(!命令)
长度++;
打破
}//开关
i++;
}//而
//一些更正
长度+=FindCount(str,\\line)*2;
长度+=FindCount(str,“\\par”)*2;
返回长度;
}
HTH有一点。对于复制和粘贴,需要对几乎整个javax.swing.text.rtf包进行c&p,我不喜欢这样做,而且这些解决方案往往会返回并成为维护问题