.NET DeflateStream无法解码Word生成的PDF FlateDecode流问题
问题解决:FlateDecode压缩流解码时抛出InvalidDataException
核心原因
以文本方式读取PDF文件会导致原始字节丢失或篡改——PDF是二进制格式,文本读取会基于编码规则自动过滤/转换部分字节,直接破坏了FlateDecode压缩流的完整性(你遇到的字节数从344变为334就是典型表现),最终导致DeflateStream无法识别合法的压缩格式,抛出「不支持的压缩方法」错误。
解决方案
1. 强制以二进制模式读取PDF
必须读取PDF的原始字节流,避免任何编码转换:
- 直接用
File.ReadAllBytes()读取全部二进制数据; - 或通过
FileStream以二进制模式打开文件:use pdfStream = new FileStream("your-document.pdf", FileMode.Open, FileAccess.Read, FileShare.Read) let pdfBytes = Array.zeroCreate (int pdfStream.Length) pdfStream.Read(pdfBytes, 0, pdfBytes.Length) |> ignore
2. 提取完整的FlateDecode压缩字节
从二进制PDF数据中定位Stream对象的位置,严格按照PDF标注的流长度(344字节)提取完整的压缩字节数组,确保没有截断或修改。
3. 正确使用DeflateStream解码
用提取到的完整压缩字节初始化MemoryStream,再传入DeflateStream解压,无需手动跳过前2字节(PDF的FlateDecode是纯RFC1951格式,没有额外头):
use inputStream = new MemoryStream(flateCompressedBytes) use deflateStream = new DeflateStream(inputStream, CompressionMode.Decompress) use outputStream = new MemoryStream() deflateStream.CopyTo(outputStream) let decompressedData = outputStream.ToArray()
额外注意
如果解压后数据仍异常,检查PDF的Stream对象是否带有Predictor参数(比如/Predictor 12),这类参数对应PNG的过滤算法,需要先对解压后的数据执行对应的逆过滤操作,才能得到正确的原始内容。
内容的提问来源于stack exchange,提问作者Alex 75
相关产品推荐
相关产品推荐

