RTF к тексту, включая верхние и нижние колонтитулы - PullRequest
0 голосов
/ 21 октября 2009

нам нужно получить содержимое документов RTF в виде простого текста.

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

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

Ответы [ 2 ]

1 голос
/ 21 октября 2009

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

[РЕДАКТИРОВАТЬ] Чтобы это не стало кошмаром для обслуживания, скопируйте источники в отдельный проект на вашей VCS. Пометьте версию соответствующим образом (чтобы ее можно было легко достать, когда появится следующий выпуск Java).

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

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

0 голосов
/ 03 ноября 2009

Это может быть частью вашего решения: метод (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 немного.

...