2011-08-15 8 views
6

フォルダの内容をzip文書にファイル拡張子 "epub"で再帰的に追加するメソッドを作成しました。これは基本的には1つのものを除いてepubと同じものです:java.util.zipを使って有効なepubを構築する

アーカイブの最初のドキュメントの名前は "mimetype"でなければなりません。タイプはapplication/epub + zipで指定する必要があります。バイトオフセットは38で始まる必要があります。オフセット付きアーカイブにmimetypeを追加する方法はありますか38?

私が作った方法はほとんど動作します。ほとんどのeリーダーが読むことができるepubを構築しますが、検証はしません。 EpubCheckは、このエラーを与える:

mimetype contains wrong type (application/epub+zip expected) 

これは、元のテストEPUBに存在しない問題ですが、再構築されたEPUBに表示されます。そして私は、解凍された/再圧縮されたmimetypeファイルの内容が正しいことを再度確認しました。

ここに投稿する方法が多すぎます。しかし、これは私がアーカイブにMIMEタイプファイルを追加するために使用しているものです:

out = new ZipOutputStream(new FileOutputStream(outFilename)); 

FileInputStream in = new FileInputStream(mimeTypePath); 
out.putNextEntry(new ZipEntry("mimetype")); 

int len; 
while ((len = in.read(buf)) > 0) { 
    out.write(buf, 0, len); 
} 

out.closeEntry(); 
in.close(); 
out.close(); 
+2

http://www.siegmann.nl/epublibのような既存のライブラリを使用するのではなく、ホイールを再発明している理由は何ですか?たとえそれを使用し終わっていなくても、ソースを読むことで、それがどのように正しく行われたかがわかります。 –

+0

epub zipを簡単に作成する手順を説明したり、チュートリアルを提案したりできますか? – GAMA

+0

@GAMA、あなたの質問は、ここでstackoverflowの新しいトピックに適しているかもしれません。質問を投稿すると、必要な情報を得ることができます。何をしようとしているかに応じて、私はあなたが必要とする答えを持っているかもしれません。しかし、それは新しいトピックにする必要があります。 – objectivesea

答えて

7

Open Container FormatのWikipediaの説明によると、mimetypeファイルは、ZIPファイルの最初のエントリであるべきであり、それは、非圧縮する必要があります。

サンプルコードのみに基づいて、mimetypeファイルがSTORED(非圧縮)になるように指定しているかどうかは不明です。

以下は、エラー「MIMEタイプが間違った型が含まれている」過去に私を取得しているようだ:

private void writeMimeType(ZipOutputStream zip) throws IOException { 
    byte[] content = "application/epub+zip".getBytes("UTF-8"); 
    ZipEntry entry = new ZipEntry("mimetype"); 
    entry.setMethod(ZipEntry.STORED); 
    entry.setSize(20); 
    entry.setCompressedSize(20); 
    entry.setCrc(0x2CAB616F); // pre-computed 
    zip.putNextEntry(entry); 
    zip.write(content); 
    zip.closeEntry(); 
} 

確認:setMethod()setSize()setCompressedSize()setCrc()行を削除することはepubcheckから「MIMEタイプが間違った型が含まれています」というエラーが生成さ。

関連する問題