2011-02-01 3 views
1

내 프로그램이 PDF 파일을 처리하고 일부 스트림을 읽습니다. FlateEncoded 스트림도 있습니다. zlib의 "inflate()"메소드를 사용하여 압축을 해제합니다.zLib inflate가 일부 경우 빈 결과를 나타냅니다.

이것은 일반적으로 다음 코드를 정말 잘 작동합니다

static string FlateDecode(string s){ 

    int factor = 50; 
    z_stream stream; 
    while(true){ 
     char * out = new char[s.length()*factor];   

     stream.zalloc = Z_NULL; 
     stream.zfree = Z_NULL; 
     stream.opaque = Z_NULL; 
     stream.avail_in = s.length(); 
     stream.next_in = (Bytef*)s.c_str(); 
     stream.avail_out = s.length()*factor; 
     stream.next_out = (Bytef*)out; 
     inflateInit(&stream); 
     inflate(&stream, Z_FINISH); 
     inflateEnd(&stream); 


     if(stream.total_out >= factor*s.length()){ 
      delete[] out; 
      factor *= 2; 
      continue; 

     } 
     string result; 
     for(unsigned long i = 0; i < stream.total_out; i++){ 
      result += out[i]; 
     } 

     delete[] out; 
     return result; 
    } 
} 

을하지만, 팽창하는 일부 스트림 빈 결과가 있습니다. 자주는 아니지만 일어난다. 누군가 왜 그런 생각을 가지고 있습니까?

모든 PDF 리더가 PDF 파일을 올바르게 읽으므로 스트림을 확인해야합니다.

도움 주셔서 감사합니다.

자신에 의해 그것을 확인할 수 있도록 나는 PDF 및 스트림을 업로드 한

UPDATE.

PDF -> I 스트림이 압축 해제 될 수있는 스트림을 압축 해제 될 할수 없어 스트림 비해 43,296 바이트

Stream

UPDATE 2

에서 시작한다. 흥미로운 점을 발견했습니다. 작업 스트림은 모두 2 바이트 H %로 시작합니다. 문제가있는 스트림은 ö>로 시작합니다. 지금이 누군가는 무엇을 의미합니까?

도움 주셔서 감사합니다.

+0

"inflate does not empty result"란 무엇을 의미합니까? (나는 그것이 0을 반환 팽창했다 것,하지만 당신은 ** ** 반드시해야 ** inflate 통화의 반환 값을 확인하지 않습니다) – nos

+0

그것은 내가 어떤 데이터를 부풀려 때, 스트림의 가치를 의미합니다 .total_out은 0입니다. 즉, 출력이 없음을 의미합니다. -> 반환 된 문자열의 길이도 0입니다. –

+0

입력이 실제로 '팽창 식'인지 확실합니까? 파일로 출력 해보고 명령 행을 통해 입력이 실제로 유효하다는 것을 확인 했습니까? 또한,'inflate()'의 반환 값은 무엇입니까? – JaredC

답변

0

zlib은 단순히 PDF 파일에서 발견 된 모든 축축한 스트림을 지원하지 않는 것 같습니다.

+2

확실히 그렇게 간단 할 수는 없습니다! 내 말은, 당신의 질문입니다. 당신이 원하는대로 대답 할 수는 있지만 그것은 실제로 질문에 대답하지 않습니다 (즉, "왜?"). – patrickvacek

2

반복 할 때마다 스트림을 다시 초기화하면 안됩니다. 루프 전에 초기화하고 을 호출하여 Z_OK 또는 Z_STREAM_END을 반환합니다.

+0

당신이 맞습니다! 이 문제와 관련이없는 경우에도 팁을 보내 주셔서 감사합니다.) –

+0

@FlashFan : 귀하의 문제와 관련 있다고 확신합니다. 각 반복마다 동일한 데이터를 제공하려고합니다. – sharptooth

+0

나는 이미 해냈다. 그러나 먼저 호출 될 때 Z_DATA_ERROR를 반환합니다. –