You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 23:34:53