Создание файлов epub с zip библиотека


Привет всем,

Я пытаюсь заархивировать файл Epub, созданный с помощью c#

Вещи, которые я пробовал

  • Dot Net Zip http://dotnetzip.codeplex.com/
  • - DotNetZip работает, но epubcheck не удается получить результирующий файл (**смотрите правку ниже)
  • ZipStorer zipstorer.codeplex.com
  • - создает файл epub, который проходит проверку, но не открывается в Adobe Digital Editions
  • 7 zip
  • - Я не пробовал это с помощью c#, но когда я заархивирую файл, используя интерфейс there, он говорит: мне этот тип файла имеет длину 9, а надо 8

Во всех случаях файл mimetype является первым файлом, добавленным в архив, и не сжимается

Валидатор Epub, который я использую, - это epubcheck http://code.google.com/p/epubcheck/

Если кто-то успешно сжал файл epub с одной из этих библиотек, пожалуйста, сообщите мне, как или если кто-то успешно сжал файл epub с любым другим открытым исходным кодом zipping api, который будет также работать.


EDIT

DotNetZip работает, см. принятый ответ ниже.

2 9

2 ответа:

Если вам нужно контролировать порядок записей в ZIP-файле, вы можете использовать DotNetZip и ZipOutputStream.

Вы сказали, что пробовали DotNetZip, и он (валидатор epub) дал вам ошибку, жалуясь на тип mime. Это, вероятно, потому, что вы использовали тип ZipFile в DotNetZip. Если вы используете ZipOutputStream, вы можете контролировать порядок записей zip, что, по-видимому, важно для epub (я не знаю формат, просто предположение).


EDIT

Я только что проверил, и страница epub в Википедии описывает, как вам нужно отформатировать .файл epub. Он говорит, что файл mimetype должен содержать определенный текст, должен быть несжатым и незашифрованным и должен отображаться как первый файл в ZIP-архиве.

Используя ZipOutputStream, вы бы сделали это, установив CompressionLevel = None на этом конкретном ZipEntry - это значение не является значением по умолчанию.

Вот несколько примеров код:

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,0,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,0,buffer.Length)) > 0)
        {
            output.Write(buffer,0,n);
        }
    }
}

Смотрите документацию для ZipOutputStreamздесь .

Почему бы не сделать жизнь проще?

private void IonicZip()
{
    string sourcePath = "C:\\pulications\\";
    string fileName = "filename.epub";

    // Creating ZIP file and writing mimetype
    using (ZipOutputStream zs = new ZipOutputStream(sourcePath + fileName))
    {
        var o = zs.PutNextEntry("mimetype");
        o.CompressionLevel = CompressionLevel.None;

        byte[] mimetype = System.Text.Encoding.ASCII.GetBytes("application/epub+zip");
        zs.Write(mimetype, 0, mimetype.Length);
    }

    // Adding META-INF and OEPBS folders including files     
    using (ZipFile zip = new ZipFile(sourcePath + fileName))
    {
        zip.AddDirectory(sourcePath  + "META-INF", "META-INF");
        zip.AddDirectory(sourcePath  + "OEBPS", "OEBPS");
        zip.Save();
    }
}