我們需要以純文本的形式獲取RTF文檔的內容。RTF到包括頁眉和頁腳的文本
我們使用的是RFTEditorKit,但我們需要處理的許多RTF文檔包含\ headerf或其他頭字段,而RTFEditorKit不解析這些(默默忽略)。
是否有另一種輕量級解決方案來將這些文檔解析爲純文本?
我們需要以純文本的形式獲取RTF文檔的內容。RTF到包括頁眉和頁腳的文本
我們使用的是RFTEditorKit,但我們需要處理的許多RTF文檔包含\ headerf或其他頭字段,而RTFEditorKit不解析這些(默默忽略)。
是否有另一種輕量級解決方案來將這些文檔解析爲純文本?
RTF格式非常簡單;編寫自己的解析器不需要很長時間。否則,只需複製JDK中的源代碼並添加對缺失元素的支持(我說複製是因爲從經驗來看,JDK中的許多有用的類無法擴展)。
[編輯]爲了確保這不會成爲維護的噩夢,請將源複製到VCS上的獨特項目中。相應地標記版本(以便在下一個Java版本發佈時輕鬆將其拉出)。
然後根據第一個創建第二個項目。分支你的第一個項目,並做所有你需要的小的改變來擴展原來的類。保持這些變化很小。例如,使方法和字段公開/保護並刪除最終。這樣,跟蹤更改變得很簡單(因爲您從不添加/刪除行)。
與下一個版本的合併將很容易。所有繁重的工作必須在你自己的項目中完成。
這可能是您的解決方案的一部分:一個(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一點。
複製和粘貼需要幾乎整個javax.swing.text.rtf包,我不喜歡這樣做,這些類型的解決方案往往會回來併成爲維護問題 – pvgoddijn 2009-10-21 15:39:24