2009-10-21 2 views
0

Нам нужно получить содержимое документов RTF в виде обычного текста.rtf в текст, включая верхние и нижние колонтитулы

мы использовали RFTEditorKit для него, но многие из документов в формате RTF мы должны обращаться содержать \ headerf или других поля заголовка, и RTFEditorKit оленьей кожи разбор этих (молча игнорирует).

есть ли еще одно облегченное решение для анализа этих документов на простой текст?

ответ

1

Формат RTF довольно прост; не нужно долго писать собственный парсер. В противном случае просто скопируйте исходный код из JDK и добавьте поддержку отсутствующих элементов (я говорю, что копирование, потому что из опыта многие полезные классы из JDK не могут быть расширены).

[EDIT] Чтобы убедиться, что это не станет кошмаром для сохранения, скопируйте источники в отдельный проект на вашем VCS. Пометьте версию соответствующим образом (так что вы можете легко ее вытащить, когда появится следующий выпуск Java).

Затем создайте второй проект, который зависит от первого. Отделите свой первый проект и внесите все небольшие изменения, которые вам необходимы для расширения исходных классов. Не изменяйте эти изменения. Например, создайте методы и поля public/protected и удалите final. Таким образом, легко отслеживать изменения (поскольку вы никогда не добавляете/не удаляете строки).

Слияние с следующей версией будет легким. Весь тяжелый подъем должен быть сделан в вашем собственном проекте.

+0

для копирования и вставки потребуется c & p почти весь пакет javax.swing.text.rtf, который я не люблю делать, также такие решения, как правило, возвращаются и становятся проблемами обслуживания – pvgoddijn

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 немного.