在 swift 中解压 Epub
Unzipping Epub in swift
我需要在 swift 中解压缩一个 .epub 文件,以便我自己完整地阅读数据。如果可以的话,我知道如何解析 ePub 的输出(我已经在 python 中编写了一个工作示例),但 SSZipArchive 显然不会解压缩 .epubs。但是,它确实可以在虚拟 .zip 文件上正常工作;只有 .epub 是个问题。据我所知,在 S.O 上,毫无疑问询问如何实际手动执行此操作。除了简单地将人们指向在 objective-c 中为你做这件事的项目之外,还有很多开销(我不理解或不需要),这违背了我需要做的事情的目的。以下是我目前的尝试。请注意,有问题的 epub 可以在以下 link(古腾堡项目)http://www.gutenberg.org/ebooks/158.epub.noimages 中找到,当我 运行 打印语句发出时:"true, true, true, false"(即,文件和路径都存在,但不会解压):
import Foundation
class EpubExtractor: NSObject, SSZipArchiveDelegate {
init(fileName: String) {
fName = fileName
}
func getEpubInfo() {
var paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
let documentsDir = paths[0]
let zipPath = documentsDir.stringByAppendingString("/MyZipFiles") // My folder name in document directory
let fileManager = NSFileManager.defaultManager()
let success1 = fileManager.fileExistsAtPath(zipPath) as Bool
if success1 == false {
print("no directory")
do {
try! fileManager.createDirectoryAtPath(zipPath, withIntermediateDirectories: true, attributes: nil)
}
}
let archivePath = zipPath.stringByAppendingString("/emma.epub") // Sample folder is going to zip with name Demo.zip
let success2 = fileManager.fileExistsAtPath(archivePath) as Bool
let destPath = zipPath.stringByAppendingString("/Hello")
let success3 = fileManager.fileExistsAtPath(destPath) as Bool
let worked = SSZipArchive.unzipFileAtPath(archivePath, toDestination: destPath, delegate:self)
print(success1, success2, success3, worked)
}
}
编辑
下面是用 python 编写的概念验证代码,其中我可以将完全相同的 epub 识别为 zip 文件并读取其容器内容:
import zipfile
dir = "sampleData/epubs/"
fileName = "emma.epub"
print zipfile.is_zipfile(dir+fileName) # Check whether file is zip (this returns true, though in swift it fails)
zip = zipfile.ZipFile(dir+fileName)
txt = zip.read('META-INF/container.xml') # Print contents of container (this is what I need swift to be able to do)
print txt # This successfully prints the container content text
经过许多小时的阅读,我明白了。事实证明,如果不明显,解决方案非常简单。
"fileName.epub" 文件需要重命名为 "fileName.zip"。就是这样!
之后,SSZipArchive 或 Zip 会将文件解压缩到名为 "fileName"(至少是默认名称)的文件夹中的 META-Inf、mimetype 和 OEBPS 文件中。
希望这可以帮助任何为此苦苦挣扎的人。当然,如果有其他方法可以做到这一点,请在评论中告诉我。
我需要在 swift 中解压缩一个 .epub 文件,以便我自己完整地阅读数据。如果可以的话,我知道如何解析 ePub 的输出(我已经在 python 中编写了一个工作示例),但 SSZipArchive 显然不会解压缩 .epubs。但是,它确实可以在虚拟 .zip 文件上正常工作;只有 .epub 是个问题。据我所知,在 S.O 上,毫无疑问询问如何实际手动执行此操作。除了简单地将人们指向在 objective-c 中为你做这件事的项目之外,还有很多开销(我不理解或不需要),这违背了我需要做的事情的目的。以下是我目前的尝试。请注意,有问题的 epub 可以在以下 link(古腾堡项目)http://www.gutenberg.org/ebooks/158.epub.noimages 中找到,当我 运行 打印语句发出时:"true, true, true, false"(即,文件和路径都存在,但不会解压):
import Foundation
class EpubExtractor: NSObject, SSZipArchiveDelegate {
init(fileName: String) {
fName = fileName
}
func getEpubInfo() {
var paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
let documentsDir = paths[0]
let zipPath = documentsDir.stringByAppendingString("/MyZipFiles") // My folder name in document directory
let fileManager = NSFileManager.defaultManager()
let success1 = fileManager.fileExistsAtPath(zipPath) as Bool
if success1 == false {
print("no directory")
do {
try! fileManager.createDirectoryAtPath(zipPath, withIntermediateDirectories: true, attributes: nil)
}
}
let archivePath = zipPath.stringByAppendingString("/emma.epub") // Sample folder is going to zip with name Demo.zip
let success2 = fileManager.fileExistsAtPath(archivePath) as Bool
let destPath = zipPath.stringByAppendingString("/Hello")
let success3 = fileManager.fileExistsAtPath(destPath) as Bool
let worked = SSZipArchive.unzipFileAtPath(archivePath, toDestination: destPath, delegate:self)
print(success1, success2, success3, worked)
}
}
编辑
下面是用 python 编写的概念验证代码,其中我可以将完全相同的 epub 识别为 zip 文件并读取其容器内容:
import zipfile
dir = "sampleData/epubs/"
fileName = "emma.epub"
print zipfile.is_zipfile(dir+fileName) # Check whether file is zip (this returns true, though in swift it fails)
zip = zipfile.ZipFile(dir+fileName)
txt = zip.read('META-INF/container.xml') # Print contents of container (this is what I need swift to be able to do)
print txt # This successfully prints the container content text
经过许多小时的阅读,我明白了。事实证明,如果不明显,解决方案非常简单。
"fileName.epub" 文件需要重命名为 "fileName.zip"。就是这样!
之后,SSZipArchive 或 Zip 会将文件解压缩到名为 "fileName"(至少是默认名称)的文件夹中的 META-Inf、mimetype 和 OEBPS 文件中。
希望这可以帮助任何为此苦苦挣扎的人。当然,如果有其他方法可以做到这一点,请在评论中告诉我。