2016-04-15 12 views
0

Ich muss eine .epub-Datei in Swift entpacken, um die Daten vollständig zu lesen. Ich kann die Ausgabe eines ePubs parsen, wenn ich es bekomme (ich habe ein funktionierendes Beispiel in Python geschrieben), aber SSZipArchive wird offenbar keine .epubs entpacken. Es funktioniert jedoch gut für eine Dummy-ZIP-Datei; nur .epub ist ein Problem. Soweit ich das beurteilen kann, gab es keine Frage zu stellen, wie man dies von Hand auf S.O. darüber hinaus, Leute einfach auf Projekte zu verweisen, die das für Sie in objective-c tun, mit viel Overhead (was ich nicht verstehe oder brauche), das den Zweck dessen, was ich tun muss, zunichte macht. Unten ist mein aktueller Versuch. Beachten Sie, dass der fragliche epub unter dem folgenden Link (Projekt Gutenberg) http://www.gutenberg.org/ebooks/158.epub.noimages gefunden werden kann und dass, wenn ich das ausführe, die print-Anweisung "true, true, true, false" ausgibt (dh die Dateien und Pfade existieren alle, aber wird entpacken nicht):Unpacking 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

unten in python geschrieben Konzept Code Beweis, in dem ich die gleiche epub bekommen als Zip-Datei erkannt werden und deren Behälterinhalt gelesen :

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 

Antwort

3

Ich habe es nach vielen Stunden gelesen. Stellt sich heraus, die Lösung ist sehr einfach, wenn nicht offensichtlich.

Die Datei "fileName.epub" muss in "fileName.zip" umbenannt werden. Das ist es!

Danach entpackt entweder SSZipArchive oder Zip die Datei in ihre META-Inf-, Mimetype- und OEBPS-Dateien in einem Ordner namens "fileName" (zumindest als Standardname).

Hoffe das hilft jedem, der damit zu kämpfen hat. Natürlich, wenn es einen anderen Weg gibt, lass es mich bitte in Kommentaren wissen.