2009-10-21 5 views
0

우리는 RTF 문서의 내용을 일반 텍스트로 가져와야합니다.rtf에서 머리글과 바닥 글을 포함한 텍스트로

우리는 그것을 위해 RFTEditorKit을 사용하고 있지만, 우리는 \ headerf 또는 다른 헤더 필드를 포함 처리 할 필요가있는 RTF 문서의 많은, 그리고 RTFEditorKit이 (자동으로 무시) 구문 분석 나던.

일반 텍스트로 구문 분석 된이 문서를 가져 오는 또 다른 간단한 솔루션이 있습니까?

답변

1

RTF 형식은 매우 간단합니다. 자신의 파서를 작성하는 데 시간이 오래 걸리지 않아야합니다. 그렇지 않으면 JDK에서 소스 코드를 복사하고 누락 된 요소에 대한 지원을 추가하면됩니다 (경험으로 인해 복사하기 때문에 JDK의 많은 유용한 클래스를 확장 할 수 없습니다).

[편집] 유지 보수가 악몽에 들지 않도록하려면 원본을 VCS의 고유 한 프로젝트에 복사하십시오. 이에 따라 버전에 태그를 붙이십시오 (Java의 다음 릴리스가 나오면 쉽게 풀 수 있습니다).

그런 다음 첫 번째 프로젝트에 의존하는 두 번째 프로젝트를 만듭니다. 첫 번째 프로젝트를 시작하고 원래 클래스를 확장하는 데 필요한 모든 작은 변화를 만듭니다. 이 변경 사항을 작게 유지하십시오. 예를 들어 메소드 및 필드를 public/protected로 설정하고 final을 제거합니다. 이렇게하면 변경 사항을 추적하는 것이 간단합니다 (선을 추가/제거하지 않으므로).

다음 버전으로 병합하는 것은 쉽습니다. 모든 무거운 짐을 싣는 작업은 반드시 자신의 프로젝트에서 수행해야합니다.

+0

복사 및 붙여 넣기를 수행하려면 거의 모든 javax.swing.text.rtf 패키지를 c & p해야합니다.이 패키지는 다시 돌아와 유지 관리 문제가되는 경향이 있습니다. – 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 조금 괄호.

관련 문제