如何使用System.IO.Compression.ZipArchive创建的ePub?(How t

2019-10-18 20:33发布

我已经写了一些代码生成使用.NET 4.5 System.IO.Compression.ZipArchive EPUB档案。 我需要这是一个可移植类库(PCL)的一部分,因此,使用.NET FX的子集。

我有一个包含magic“应用/ EPUB + zip中的MIME类型文件的问题。 读过的规格,我先补充一点,文件没有压缩。

尽管如此护理,所产生的EPUB档案不符合规格。 规格要求的MIME类型文件的内容应在矿开始于47位置的位置38开始。

没有上ZipArchive本身的任何参数和ZipArchiveEntry只能通过唯一的压缩模式被参数。 我有点困惑,因为我想Zip文件排在一个品种,我不明白是什么在影响这个特定的行为。

作为参考,这里有一个样品的ePub的第一比特(工作即):

这里是我的:

Answer 1:

你没有压缩方式设置为“无压缩”。 数据的字节9-10是压缩方法,为我们工作文件是00,因为它应该是,但在你的情况下,它们被设置为8 - “放气”。 压缩程度不压缩方法,并将其设置为0仍然使用放气。 你应该尝试另一个库,像SecureBlackbox,或DotNetZip。



Answer 2:

正如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);
    }
}*/


Answer 3:

我也跟着Nickolay的建议,我用DotNetZip创建只有在它的MIME类型文件的归档,并使用该文件作为一个起点,其他的ePub文件。

这种方法允许我使用ZipArchive和异步接口,同时尊重ePub格式的规格。



文章来源: How to create ePub with System.IO.Compression.ZipArchive?