Как, наверное, многие знают, в 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. Почему не работает мой тестовый пример?
Здравствуйте, 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???
Здравствуйте, bober_maniac, Вы писали:
_>Пробовал. Close автоматически закрывает все underlying streams и я не могу читать из MemoryStream — ObjectDisposedException.
Последний параметр в конструкторе DeflateStream = true.
... << RSDN@Home (RF) 1.2.0 alpha 5 rev. 67>>
Здравствуйте, 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();
Обратный код — симметричен.