C#decode(解压缩)缩小PDF文件的数据

我想在C#中解压缩一些DeflateCoded数据(PDF提取)。 不幸的是,我每次都遇到exception“解码时发现无效数据”。 但数据是有效的。

private void Decompress() { FileStream fs = new FileStream(@"S:\Temp\myFile.bin", FileMode.Open); //First two bytes are irrelevant fs.ReadByte(); fs.ReadByte(); DeflateStream d_Stream = new DeflateStream(fs, CompressionMode.Decompress); StreamToFile(d_Stream, @"S:\Temp\myFile1.txt", FileMode.OpenOrCreate); d_Stream.Close(); fs.Close(); } private static void StreamToFile(Stream inputStream, string outputFile, FileMode fileMode) { if (inputStream == null) throw new ArgumentNullException("inputStream"); if (String.IsNullOrEmpty(outputFile)) throw new ArgumentException("Argument null or empty.", "outputFile"); using (FileStream outputStream = new FileStream(outputFile, fileMode, FileAccess.Write)) { int cnt = 0; const int LEN = 4096; byte[] buffer = new byte[LEN]; while ((cnt = inputStream.Read(buffer, 0, LEN)) != 0) outputStream.Write(buffer, 0, cnt); } } 

有人有想法吗? 谢谢。

我为测试数据添加了这个: –

 private static void Compress() { FileStream fs = new FileStream(@"C:\Temp\myFile.bin", FileMode.Create); DeflateStream d_Stream = new DeflateStream(fs, CompressionMode.Compress); for (byte n = 0; n < 255; n++) d_Stream.WriteByte(n); d_Stream.Close(); fs.Close(); } 

修改后的解压缩如下: -

 private static void Decompress() { FileStream fs = new FileStream(@"C:\Temp\myFile.bin", FileMode.Open); //First two bytes are irrelevant // fs.ReadByte(); // fs.ReadByte(); DeflateStream d_Stream = new DeflateStream(fs, CompressionMode.Decompress); StreamToFile(d_Stream, @"C:\Temp\myFile1.txt", FileMode.OpenOrCreate); d_Stream.Close(); fs.Close(); } 

就像这样: -

 static void Main(string[] args) { Compress(); Decompress(); } 

并没有错误。

我得出结论,前两个字节是相关的(显然它们与我的特定测试数据有关。)或者您的数据有问题。

我们可以提供一些测试数据吗?

(显然不要,如果它是敏感的)

 private static string decompress(byte[] input) { byte[] cutinput = new byte[input.Length - 2]; Array.Copy(input, 2, cutinput, 0, cutinput.Length); var stream = new MemoryStream(); using (var compressStream = new MemoryStream(cutinput)) using (var decompressor = new DeflateStream(compressStream, CompressionMode.Decompress)) decompressor.CopyTo(stream); return Encoding.Default.GetString(stream.ToArray()); } 

感谢user159335和user1011394让我走上正轨! 只需将流的所有字节传递给上述函数的输入。 确保bytecount与指定的长度相同。