0

RTF ドキュメントのコンテンツをプレーン テキストとして取得する必要があります。

そのために RFTEditorKit を使用していましたが、処理する必要がある RTF ドキュメントの多くには\headerfやその他のヘッダー フィールドが含まれており、RTFEditorKit はこれらを解析しません (静かに無視します)。

これらのドキュメントをプレーンテキストに解析するための別の軽量ソリューションはありますか?

4

2 に答える 2

1

RTF 形式は非常に単純です。独自のパーサーを作成するのにそれほど時間はかかりません。それ以外の場合は、JDK からソース コードをコピーして、欠落している要素のサポートを追加します (経験上、JDK の多くの有用なクラスは拡張できないため、コピーと言いました)。

[編集] これが維持するのに悪夢にならないようにするために、ソースを VCS の別のプロジェクトにコピーします。それに応じてバージョンにタグを付けます (Java の次のリリースが来たときに簡単に取り出せるようにします)。

次に、最初のプロジェクトに依存する 2 番目のプロジェクトを作成します。最初のプロジェクトを分岐し、元のクラスを拡張するために必要なすべての小さな変更を行います。これらの変更は小さくしてください。たとえば、メソッドとフィールドを public/protected にして、final を削除します。このようにして、変更を追跡するのは簡単です (行を追加/削除しないため)。

その後、次のバージョンとのマージは簡単になります。すべての面倒な作業は、独自のプロジェクトで行う必要があります。

于 2009-10-21T15:07:33.597 に答える
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。

于 2009-11-03T12:14:11.790 に答える