【发布时间】:2019-10-01 19:44:45
【问题描述】:
我正在尝试从 file 中的 PDF 对象解压缩流:
4 0 obj
<<
/Filter /FlateDecode
/Length 64
>>
stream
xœs
QÐw34V02UIS0´0P030PIQÐpÉÏKIUH-.ITH.-*Ê··×TÉRp
á T‰
Ê
endstream
endobj
我将此流以与原始文件相同的格式复制粘贴到名为Stream.file 的文件中
xœs
QÐw34V02UIS0´0P030PIQÐpÉÏKIUH-.ITH.-*Ê··×TÉRp
á T‰
Ê
此流应转换为:Donde esta curro??。在 C# 控制台应用程序中将该流添加到 Stream.file。
using System.IO;
using System.IO.Compression;
namespace Filters
{
public static class FiltersLoader
{
public static void Parse()
{
var bytes = File.ReadAllBytes("Stream.file");
var originalFileStream = new MemoryStream(bytes);
using (var decompressedFileStream = new MemoryStream())
using (var decompressionStream = new DeflateStream(originalFileStream, CompressionMode.Decompress))
{
decompressionStream.CopyTo(decompressedFileStream);
}
}
}
}
但是在尝试复制它时会产生异常:
The archive entry was compressed using an unsupported compression method.
如果可能的话,我想知道如何用 .net 代码解码这个流。
谢谢。
【问题讨论】:
-
您不能复制粘贴二进制数据,如果它是文本并期望它顺利进行。那里有很多可能出错的地方,即使幸运的是,您使用的编码包含所有字符的单个代码点。你需要更狡猾一点,编写一个小程序来读取文件,直到它到达
>>stream(或者只是尝试直到你得到正确的偏移量)并将字节提取为真正的二进制内容。 (除了您是否可以在此处实际使用DeflateStream之外;我对 PDF 的了解还不够,无法说出这是否正确。) -
你说的有一部分是对的,我没有意识到在复制它时添加了 Windows 返回行,但是在将其更改为 Unix LF 并确保两个流在 mh-nexus.de/en/hxd 中看起来相同并且仍然具有相同问题。
-
错误消息对我来说似乎很不言自明。您正在尝试解压缩
DeflateStream()类无法识别为受支持的压缩方法的数据。数据已损坏或使用了不同的压缩方法。 -
嗨,我也看到了。但是,正如您从 PDF 文件中看到的那样,我使用 FlateDecode 算法将其中的流压缩了一次,这与我在尝试解压缩时在 c# 中使用的相同(Deflate)
标签: c# pdf .net-core deflatestream