加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 06:55:18 所属栏目:百科 来源:网络整理
导读:大家好, 我试图压缩一个Epub文件我已经使用c# 我试过的事情 Dot Net Zip http://dotnetzip.codeplex.com/ – DotNetZip工作,但epubcheck失败的结果文件(**参见下面的编辑) ZipStorer zipstorer.codeplex.com – 创建一个通过验证的epub文件,但该文件不会在Ad
大家好,

我试图压缩一个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的文档.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读