DeflateStream и PDF
От: bober_maniac Россия http://bober-maniac.livejournal.com/
Дата: 04.01.13 18:27
Оценка:
Как, наверное, многие знают, в PDF одним из возможных кодеков для внутренних потоков является Deflate.

Я пытаюсь разжать внутренний поток с помощью DeflateStream из BCL, но в результате получаю исключение вида InvalidDataException.

Я пытаюсь понять, как работает DeflateStream и пишу такой код:

var streamd = "2 J\r\nBT\r\n/F1 12 Tf\r\n0 Tc\r\n0 Tw\r\n72.5 712 TD\r\n" +
                         "[(Unfiltered streams can be read easily) 65 (, )] TJ\r\n"+
                         "\r\n0 -14 TD[(b) 20 (ut generally tak) 10 (e more space than \\311)] TJ\r\n" +
                         "T* (compressed streams.) Tj\r\n" +
                         "0 -28 TD\r\n[(Se) 25 (v) 15 (eral encoding methods are a) 20 (v) 25 (ailable in PDF) 80 (.)] TJ"+
                         "0 -14 TD\r\n(Some are used for compression and others simply) Tj\r\n" +
                         "T* [(to represent binary data in an ) 55 (ASCII format.)] TJ\r\n"+
                         "T* (Some of the compression filters are \\\r\n" +
                         "suitable ) Tj\r\nT* (for both data and images, while others are \\\r\n"+
                         "suitable only ) Tj\r\nT* (for continuous-tone images.) Tj\r\nET";

            MemoryStream output = new MemoryStream();
            DeflateStream zip = new DeflateStream(output, CompressionMode.Compress);
            StreamWriter writer = new StreamWriter(zip);
            writer.Write(streamd);
            writer.Flush();
            zip.Flush();
            output.Flush();

            output.Seek(0, SeekOrigin.Begin);
            StreamReader reader = new StreamReader(output);
            Console.WriteLine(reader.ReadToEnd());
            Console.ReadLine();


В консоли пустота. Ставлю брекпоинт на output.Seek — в потоке 0 байт.

Может быть, кто-нибудь мне разъяснит три момента:
1. Где я мудак?
2. Почему DeflateStream не работает с PDF?
3. Почему не работает мой тестовый пример?
deflate deflatestream pdf
Re: DeflateStream и PDF
От: bober_maniac Россия http://bober-maniac.livejournal.com/
Дата: 04.01.13 18:47
Оценка:
Здравствуйте, bober_maniac, Вы писали:

_>Может быть, кто-нибудь мне разъяснит три момента:

_>1. Где я мудак?
_>2. Почему DeflateStream не работает с PDF?
_>3. Почему не работает мой тестовый пример?

4. Я подключил zlib.net — она прекрасно отработала. Что за имплементация DEFLATE используется в DeflateStream?
Re: DeflateStream и PDF
От: hardcase Пират http://nemerle.org
Дата: 04.01.13 20:16
Оценка:
Здравствуйте, bober_maniac, Вы писали:

_>Я пытаюсь понять, как работает DeflateStream и пишу такой код:


Не имел с ним дела, но возможно стоит вызвать Close/Dispose вместо Flush.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: DeflateStream и PDF
От: bober_maniac Россия http://bober-maniac.livejournal.com/
Дата: 05.01.13 11:32
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Не имел с ним дела, но возможно стоит вызвать Close/Dispose вместо Flush.


Пробовал. Close автоматически закрывает все underlying streams и я не могу читать из MemoryStream — ObjectDisposedException.
Re[2]: DeflateStream и PDF
От: Nikolay_Ch Россия  
Дата: 05.01.13 13:01
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Не имел с ним дела, но возможно стоит вызвать Close/Dispose вместо Flush.

Мне кааца, что как и с обычном ридере, пропуск Flush может привести к отсутствию данных в итоговом потоке...

По поводу кода, то длина потока "output" у меня 462 байта... Соответственно и на консоль все отправляется:

?`∟I?%&/m?{⌂J?J??t?`‼$?@►??????↔iG#)?*??eVe]f▬@????{???{???;?N'????\fd☺l??J??!??
?▼?~|▼?"??????7?qr??n????9???????????{???♥|??7N?????(??gi??y?h?i?L'yJ⌂??<k???N??
?tk???~???♥???>A????N???n???"_?uV??i??????y???<mV?4O?9??}???*?7?J???bU?M?z▼?I??4
w?w?(??☼?????☼t???i5+?↨?"o??I3?'‼\.?yV????b??|??Nz@_??o??o?l??▬9??♠♫?U?→??j?f?YZ
??n?X? G?⌂o???Bh?/?tR,??:?em??h?w??????3?]d??←7w[?‼M?C?♂↓???←'?hy♀??-?8!??/ X,??
?↓?W?Z*?] ??%?2??m?\W?f?????Q???

Re[3]: DeflateStream и PDF
От: _Raz_  
Дата: 05.01.13 14:51
Оценка:
Здравствуйте, bober_maniac, Вы писали:

_>Пробовал. Close автоматически закрывает все underlying streams и я не могу читать из MemoryStream — ObjectDisposedException.


Последний параметр в конструкторе DeflateStream = true.
... << RSDN@Home (RF) 1.2.0 alpha 5 rev. 67>>
Re: DeflateStream и PDF
От: GlebZ Россия  
Дата: 12.01.13 12:36
Оценка:
Здравствуйте, bober_maniac, Вы писали:

_>Может быть, кто-нибудь мне разъяснит три момента:

_>1. Где я мудак?
Промолчу
_>2. Почему DeflateStream не работает с PDF?
Работает. Я тебе об этом говорил. Все дело в двух байтах.
_>3. Почему не работает мой тестовый пример?

outFileStream.WriteByte(0x58);
outFileStream.WriteByte(0x85);
DeflateStream compressedStream = new DeflateStream(outFileStream, CompressionMode.Compress, true);
Byte[] textBuffer = ASCIIEncoding.ASCII.GetBytes(str1);
compressedStream.Write(textBuffer, 0, textBuffer.Length);
compressedStream.Close();

Обратный код — симметричен.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.