c# – 使用Zip库创建Epub文件

前端之家收集整理的这篇文章主要介绍了c# – 使用Zip库创建Epub文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
大家好,

我试图压缩一个Epub文件我已经使用c#

我试过的事情

> Dot Net Zip http://dotnetzip.codeplex.com/
– DotNetZip工作,但epubcheck失败的结果文件(**参见下面的编辑)
> ZipStorer zipstorer.codeplex.com
– 创建一个通过验证的epub文件,但该文件不会在Adobe Digital Editions中打开
> 7拉链
– 我没有尝试过使用c#,但是当我使用该界面压缩该文件告诉我,mimetype文件名的长度为9,应该是8

在所有情况下,mimetype文件添加到存档并且未压缩的第一个文件

我使用的Epub验证器是epubcheck http://code.google.com/p/epubcheck/

如果任何人成功地使用这些库之一压缩了一个epub文件,请让我知道如何或者如果有人将任何其他开放源代码压缩api也可以工作的压缩文件成功地压缩一个epub文件.

编辑

DotNetZip的工作原理,请看下面接受的答案.

解决方法

如果您需要控制ZIP文件中条目的顺序,可以使用DotNetZip和ZipOutputStream.

你说你尝试过DotNetZip,它(epub验证器)给你一个错误的抱怨mime类型的东西.这可能是因为您在DotNetZip中使用ZipFile类型.如果您使用ZipOutputStream,您可以控制zip条目的顺序,这对epub显然很重要(我不知道格式,只是猜测).

编辑

我刚刚检查,epub page on Wikipedia描述了如何格式化.epub文件.它说,mimetype文件必须包含特定的文本,必须是未压缩和未加密的,并且必须显示为ZIP存档中的第一个文件.

使用ZipOutputStream,您可以通过在特定ZipEntry上设置CompressionLevel = None来实现此功能,该值不是默认值.

以下是一些示例代码

private void Zipup()
{
    string _outputFileName = "Fargle.epub";
    using (FileStream fs = File.Open(_outputFileName,FileMode.Create,FileAccess.ReadWrite ))
    {
        using (var output= new ZipOutputStream(fs))
        {
            var e = output.PutNextEntry("mimetype");
            e.CompressionLevel = CompressionLevel.None;

            byte[] buffer= System.Text.Encoding.ASCII.GetBytes("application/epub+zip");
            output.Write(buffer,buffer.Length);

            output.PutNextEntry("Meta-INF/container.xml");
            WriteExistingFile(output,"Meta-INF/container.xml");
            output.PutNextEntry("OPS/");  // another directory
            output.PutNextEntry("OPS/whatever.xhtml");
            WriteExistingFile(output,"OPS/whatever.xhtml");
            // ...
        }
    }
}

private void WriteExistingFile(Stream output,string filename)
{
    using (FileStream fs = File.Open(fileName,FileMode.Read))
    {
        int n = -1;
        byte[] buffer = new byte[2048];
        while ((n = fs.Read(buffer,buffer.Length)) > 0)
        {
            output.Write(buffer,n);
        }
    }
}

请参阅ZipOutputStream here的文档.

猜你在找的C#相关文章