我已经写了一些代码生成使用.NET 4.5 System.IO.Compression.ZipArchive EPUB档案。 我需要这是一个可移植类库(PCL)的一部分,因此,使用.NET FX的子集。
我有一个包含magic“应用/ EPUB + zip中的MIME类型文件的问题。 读过的规格,我先补充一点,文件没有压缩。
尽管如此护理,所产生的EPUB档案不符合规格。 规格要求的MIME类型文件的内容应在矿开始于47位置的位置38开始。
没有上ZipArchive本身的任何参数和ZipArchiveEntry只能通过唯一的压缩模式被参数。 我有点困惑,因为我想Zip文件排在一个品种,我不明白是什么在影响这个特定的行为。
作为参考,这里有一个样品的ePub的第一比特(工作即):
这里是我的:
你没有压缩方式设置为“无压缩”。 数据的字节9-10是压缩方法,为我们工作文件是00,因为它应该是,但在你的情况下,它们被设置为8 - “放气”。 压缩程度不压缩方法,并将其设置为0仍然使用放气。 你应该尝试另一个库,像SecureBlackbox,或DotNetZip。
正如Nickolay所指出的,被用来代替“存储”的“放气”的方法。 这对我是一个真正的痛苦,找出如何解决这个问题,而对于其他人谁发现这个话题,我用ZipStorer类由Jaime奥利瓦雷斯添加使用“存储”的MIME类型。
https://github.com/jaime-olivares/zipstorer
人们很容易将此代码添加到C#项目(它不是一个DLL),并可以很容易地添加使用,而不是“放气”“存储”文件。 这是我做的代码:
Dictionary<string, string> FilesToZip = new Dictionary<string, string>()
{
{ ConfigPath + @"mimetype", @"mimetype"},
{ ConfigPath + @"container.xml", @"META-INF/container.xml" },
{ OutputFolder + Name.Output_OPF_Name, @"OEBPS/" + Name.Output_OPF_Name},
{ OutputFolder + Name.Output_XHTML_Name, @"OEBPS/" + Name.Output_XHTML_Name},
{ ConfigPath + @"style.css", @"OEBPS/style.css"},
{ OutputFolder + Name.Output_NCX_Name, @"OEBPS/" + Name.Output_NCX_Name}
};
using (ZipStorer EPUB = ZipStorer.Create(OutputFolder + "book.epub", ""))
{
bool First = true;
foreach (KeyValuePair<string, string> File in FilesToZip)
{
if (First) { EPUB.AddFile(ZipStorer.Compression.Store, File.Key, File.Value, ""); First = false; }
else EPUB.AddFile(ZipStorer.Compression.Deflate, File.Key, File.Value, "");
}
}
此代码创建一个完全有效的EPUB文件。 但是,如果你不需要担心验证,它似乎大多数电子阅读器将接受一个“放气”的MIME类型的EPUB。 所以我以前使用.NET的ZipArchive代码生成,在Adobe Digital Editions的和钱袋工作的EPUB。 例如:
/*using (ZipArchive EPUB = ZipFile.Open(OutputFolder + Name.Output_EPUB_Name, ZipArchiveMode.Create))
{
foreach (KeyValuePair<string, string> AddFile in AddFiles)
{
if (AddFile.Key.Contains("mimetype"))
{
EPUB.CreateEntryFromFile(AddFile.Key, AddFile.Value, CompressionLevel.NoCompression);
}
else EPUB.CreateEntryFromFile(AddFile.Key, AddFile.Value, CompressionLevel.Optimal);
}
}*/
我也跟着Nickolay的建议,我用DotNetZip创建只有在它的MIME类型文件的归档,并使用该文件作为一个起点,其他的ePub文件。
这种方法允许我使用ZipArchive和异步接口,同时尊重ePub格式的规格。