2009-10-21 96 views
0

我们需要以纯文本的形式获取RTF文档的内容。RTF到包括页眉和页脚的文本

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

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

回答

1

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

[编辑]为了确保这不会成为维护的噩梦,请将源复制到VCS上的独特项目中。相应地标记版本(以便在下一个Java版本发布时轻松将其拉出)。

然后根据第一个创建第二个项目。分支你的第一个项目,并做所有你需要的小的改变来扩展原来的类。保持这些变化很小。例如,使方法和字段公开/保护并删除最终。这样,跟踪更改变得很简单(因为您从不添加/删除行)。

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

+0

复制和粘贴需要几乎整个javax.swing.text.rtf包,我不喜欢这样做,这些类型的解决方案往往会回来并成为维护问题 – pvgoddijn 2009-10-21 15:39:24

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一点。