我试图压缩一个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的工作原理,请看下面接受的答案.
解决方法
你说你尝试过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("@R_502_338@-INF/container.xml"); WriteExistingFile(output,"@R_502_338@-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的文档.