2009-10-21 95 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一點。