2016-04-15 4 views
0

Мне нужно разархивировать файл .epub в swift, чтобы полностью прочитать данные. Я знаю, как анализировать вывод ePub, если я могу его получить (я написал рабочий пример в python), но SSZipArchive, по-видимому, не будет распаковывать .epubs. Тем не менее, он отлично работает с манекеном .zip-файл; только .epub - проблема. Насколько я могу судить, не возникало вопросов о том, как на самом деле это сделать вручную на С.О. помимо простого указания людей проектам, которые делают это для вас в объективном c с большим количеством накладных расходов (которые я не понимаю или не нуждаюсь), что побеждает цель того, что мне нужно делать. Ниже моя текущая попытка. Обратите внимание, что рассматриваемый epub можно найти по следующей ссылке (проект gutenberg) http://www.gutenberg.org/ebooks/158.epub.noimages и что при запуске этого утверждения print испускает: «true, true, true, false» (то есть файлы и пути все существуют, но не разархивировать):Unzipping Epub in swift

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) 

    } 
} 

EDIT

Ниже доказательство концепции код, написанный на Python, в котором я могу получить тот же EPUB, чтобы быть признанным в качестве почтового файла и прочитать его содержимое контейнера :

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 

ответ

3

Я понял это после многих часов чтения. Оказывается, решение чрезвычайно просто, если это не очевидно.

Файл «fileName.epub» необходимо переименовать в «fileName.zip». Это оно!

После этого SSZipArchive или Zip распакуют файл в файлы META-Inf, mimetype и OEBPS в папке с именем «имя_файла» (по крайней мере, как имя по умолчанию).

Надеюсь, это поможет любому, кто борется с этим. Конечно, если есть другой способ сделать это, пожалуйста, дайте мне знать в комментариях.