使用java.util.zip构建有效的epub

8
我编写了一个方法,它会递归地将文件夹的内容添加到zip文档中,并将文件扩展名命名为“epub”,这基本上就是一个epub,除了一件事情:存档中的第一个文档必须命名为“mimetype”,类型必须指定为application/epub+zip,并且必须以38个字节偏移量开头。有没有办法将mimetype添加到偏移量为38的存档中呢?
我编写的方法几乎可以使用。它构建了一个可以被大多数电子阅读器阅读的epub,但它无法验证。EpubCheck 给出了以下错误:
mimetype contains wrong type (application/epub+zip expected)

这是一个在原始测试epub中不存在的问题,但在重建的epub中出现了。我已经仔细检查了解压缩/重新压缩的mimetype文件的内容确保正确。

添加mimetype文件到归档文件的方法太长,在此无法贴出。但以下是我用来添加mimetype文件到归档文件的代码:

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?即使你最终不使用它,阅读源代码也会告诉你如何正确地完成。 - Kilian Foth
你能简要提供创建EPUB压缩包的步骤或建议一些教程吗? - GAMA
@GAMA,你的问题可能更适合在stackoverflow上开一个新话题。如果你发布问题,你很可能会得到你需要的信息。根据你尝试做什么,我可能有你需要的答案。但是它需要在一个新话题中发布。 - objectivesea
1个回答

10
根据维基百科对开放容器格式的描述,mimetype文件应该是ZIP文件中的第一个条目,并且它应该是未压缩的。
仅凭您的示例代码,无法确定您是否指定了mimetype文件应为STORED(即未压缩)。
以下内容似乎可以让我避开“mimetype包含错误类型”的错误:
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得到“mimetype 包含错误的类型”错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接