2013-08-26 5 views
4

나는 C# 코드를 통해 pdf 파일을 만들 수있는 능력을 가지고 놀고있다. 필자는 PDF 사양을 조사해 왔으며 데이터 문자열을 가져 와서 UTF8 인코딩을 사용하여 바이트 배열로 인코딩하여 작업 PDF 파일을 만들 수있었습니다. 나는 PDF 스트림 개체에 DeflateStream를 사용하려고하면.NET DeflateStream을 사용하여 PDF를 만들 수 있습니까?

내가으로 실행하는 문제입니다. 그냥 작동하지 않는 것 :

: 여기

질문에있는 PDF 객체 ( \ 연구 \ n 여기에, 각 행의 끝에서 바로 볼 수 없습니다)의 텍스트 버전입니다
5 0 obj 
<</Length 45>> 
stream 
BT 70 50 TD /F1 12 Tf (Hello, world!) Tj ET 
endstream 
endobj 

DeflateStream 클래스를 사용하여 BT 70 50 TD /F1 12 Tf (Hello, world!) Tj ET 줄을 압축하려고하면 PDF가 작동하지 않는 것 같습니다. 나는 iTextSharp와 같은 많은 다른 라이브러리가 Deflate 압축의 자체 구현을 사용한다는 것을 알아 챘다.

DeflateStream 클래스의 마이크로 소프트의 구현이 작동하지 않는 이유는 어떤 이유가 있나요? 내가 잘못 사용하고 있거나 잘못 구현 되었습니까?


는 그 PDF 파일 (텍스트가 아닌) 바이너리 알아,하지만 난 아무것도 암호화 아니에요 경우 다음 텍스트로 모든 것을 볼 수 있습니다. 여기에 참조 할 수 있도록 전체 PDF 파일입니다 (일반 텍스트로도 \ 연구 \ n 여기에, 각 행의 끝에서 바로 볼 수 없습니다) :

%PDF-1.7 
1 0 obj 
<</Type /Catalog /Pages 2 0 R>> 
endobj 
2 0 obj 
<</Type /Pages /MediaBox [ 0 0 200 200 ] /Count 1 /Kids [ 3 0 R ]>> 
endobj 
3 0 obj 
<</Type /Page /Parent 2 0 R /Resources <</Font <</F1 4 0 R>>>> /Contents 5 0 R>> 
endobj 
4 0 obj 
<</Type /Font /Subtype /Type1 /BaseFont /Times-Roman>> 
endobj 
5 0 obj 
<</Length 45>> 
stream 
BT 70 50 TD /F1 12 Tf (Hello, world!) Tj ET 
endstream 
endobj 
xref 
0 6 
0000000000 65535 f 
0000000017 00000 n 
0000000067 00000 n 
0000000153 00000 n 
0000000252 00000 n 
0000000325 00000 n 
trailer 
<</Size 6/Root 1 0 R>> 
startxref 
422 
%%EOF 

답변

10

어떤 이유가 있나요 이유는 마이크로 소프트의 구현 DeflateStream 클래스가 작동하지 않습니다? 내가 잘못 사용하고 있거나 잘못 구현 되었습니까?

DeflateStream 실제로 PDF가 RFC 1950와 호환되는 압축 방법을 사용하여 압축된다 RFC 1951 (DEFLATE)를 구현한다. 이에 대한 자세한 내용은 해결 방법과 함께 관련 Microsoft Connect bug report에 나와 있습니다.

간단한 해결 방법은 적당한 포맷을 지원하는 등 DotNetZip로서 타사 압축 라이브러리를 사용하는 것이다. 즉, Connect 보고서에 따르면 처음 두 바이트를 건너 뛰면 대부분의 경우이 문제가 발생할 수 있습니다.

+0

흠, 연결 기사가 재미 있습니다. 또한 ** 압축 해제 ** 프로세스 (** 압축 ** 프로세스가 아님)에 대해 이야기하고 있지만 압축에 부정적인 영향을 미친다고 생각합니다. 압축을 위해 DotNetZip을 사용해보고 도움이되는지 확인하겠습니다. –

+0

@ m-y 예 - 동일한 문제가 양쪽에서 발생합니다. 일반적으로 DotNetZip은 압축 라이브러리에 내장 된 것보다 훨씬 낫습니다. –

+0

DotNetZip ZlibStream은 제대로 작동합니다. DeflateStream (.NET-4.5)을 여전히 사용하고 압축 해제시 두 바이트가 건너 뛸 때 시작 부분에 누락 된 두 바이트를 앞에 붙일 수 있을지 궁금합니다. –