10

こんにちは、みんな、

C# を使用して作成した Epub ファイルを圧縮しようとしています。

私が試したこと

  • ドット ネット ジップ http://dotnetzip.codeplex.com/
  • - DotNetZip は機能しますが、epubcheck は結果のファイルに失敗します (**以下の編集を参照)
  • ZipStorer zipstorer.codeplex.com
  • - 検証に合格する epub ファイルを作成しますが、ファイルは Adob​​e Digital Editions で開きません
  • 7ジップ
  • - C# を使用してこれを試したことはありませんが、そのインターフェイスを使用してファイルを圧縮すると、MIME タイプ ファイル名の長さが 9 であり、8 である必要があることがわかります。

いずれの場合も、mimetype ファイルはアーカイブに追加される最初のファイルであり、圧縮されません。

私が使用している Epub バリデーターは epubcheck http://code.google.com/p/epubcheck/です。

誰かがこれらのライブラリのいずれかで epub ファイルを正常に圧縮した場合は、他のオープン ソースの圧縮 API を使用して epub ファイルを正常に圧縮した方法や方法を教えてください。


編集

DotNetZip は機能します。以下の受け入れられた回答を参照してください。

4

3 に答える 3

13

ZIP ファイル内のエントリの順序を制御する必要がある場合は、DotNetZip と ZipOutputStream を使用できます。

あなたは DotNetZip を試したと言っていましたが、それ (epub バリデーター) は MIME タイプについて不平を言うエラーを出しました。これはおそらく、DotNetZip 内で ZipFile タイプを使用したためです。ZipOutputStream を使用すると、zip エントリの順序を制御できます。これは明らかに epub にとって重要です (フォーマットはわかりませんが、推測です)。


編集

確認したところ、ウィキペディアの epub ページに.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,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 のドキュメントはこちらを参照してください。

于 2011-05-05T13:57:40.320 に答える
7

生活を楽にしませんか?

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();
    }
}
于 2012-09-06T11:49:56.300 に答える