A powerful and modern Swift library for parsing EPUB documents
EPUBKit provides a comprehensive solution for parsing and extracting information from EPUB files in Swift. Built with modern Swift practices and designed for reliability, it supports both EPUB 2 and EPUB 3 specifications while maintaining a clean, intuitive API.
- π Complete EPUB Support: Full parsing of EPUB 2 and EPUB 3 documents
- ποΈ Modern Swift: Built with Swift 6+, leveraging modern language features
- π Rich Metadata: Extract comprehensive Dublin Core metadata
- ποΈ Manifest Parsing: Access all publication resources with media type detection
- π Reading Order: Parse spine for linear reading progression
- π§ Navigation: Extract table of contents and navigation structure
- π§ͺ Thoroughly Tested: Comprehensive test suite built with Swift Testing
- π― Thread Safe: Designed for concurrent parsing operations
Add EPUBKit to your project via Xcode or by adding it to your Package.swift
:
dependencies: [
.package(url: "https://github.com/witekbobrowski/EPUBKit.git", from: "1.0.0")
]
pod 'EPUBKit'
import EPUBKit
// Parse an EPUB file
guard let epubURL = Bundle.main.url(forResource: "book", withExtension: "epub"),
let document = EPUBDocument(url: epubURL) else {
print("Failed to load EPUB")
return
}
// Access document metadata
print("Title: \(document.title)")
print("Author: \(document.author)")
print("Publisher: \(document.publisher)")
print("Language: \(document.language)")
// Access document structure
print("Chapters: \(document.spine.items.count)")
print("Resources: \(document.manifest.items.count)")
// Access metadata details
if let creator = document.metadata.creator {
print("Author: \(creator.name)")
print("Role: \(creator.role)")
print("File as: \(creator.fileAs)")
}
// Iterate through spine items (reading order)
for spineItem in document.spine.items {
if let manifestItem = document.manifest.items[spineItem.idref] {
print("Chapter: \(manifestItem.path)")
print("Media Type: \(manifestItem.mediaType)")
}
}
// Access table of contents
func printTOC(_ toc: EPUBTableOfContents, level: Int = 0) {
let indent = String(repeating: " ", count: level)
print("\(indent)- \(toc.label)")
for child in toc.children {
printTOC(child, level: level + 1)
}
}
printTOC(document.tableOfContents)
EPUBKit supports the EPUB specification standards:
- β EPUB 3.3 - Full support for modern EPUB files
- β EPUB 2.0 - Backward compatibility with older EPUB files
- β Dublin Core Metadata - Complete metadata extraction
- β OCF (Open Container Format) - Proper ZIP archive handling
- β NCX Navigation - Table of contents parsing
- β Media Type Detection - Automatic resource type identification
Contributions are welcome! Please feel free to submit a Pull Request.
EPUBKit is available under the MIT license. See the LICENSE file for more info.