// // KMHeaderFooterManager.swift // PDF Master // // Created by tangchao on 2022/12/27. // import Cocoa let kHeaderFooterInfoSaveKey = "kHeaderFooterInfoSaveKey" class KMHeaderFooterManager: NSObject, NSCoding{ let kFolderPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.applicationSupportDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last?.stringByAppendingPathComponent(Bundle.main.bundleIdentifier!).stringByAppendingPathComponent("headerfooter") let kPlistPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.applicationSupportDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last?.stringByAppendingPathComponent(Bundle.main.bundleIdentifier!).stringByAppendingPathComponent("headerfooter").stringByAppendingPathComponent("headerfooter.plist") static let defaultManager = KMHeaderFooterManager() // = { // var manager = KMHeaderFooterManager() // if let storedData = UserDefaults.standard.value(forKey: kHeaderFooterInfoSaveKey) as? Data { // manager = NSKeyedUnarchiver.unarchiveObject(with: storedData) as! KMHeaderFooterManager // } else { // manager = KMHeaderFooterManager() //// if manager.headFooterObjects == nil { //// manager.headFooterObjects = [] //// } // } // return manager // }() func encode(with coder: NSCoder) { // coder.encode(self.headFooterObjects, forKey: "headFooterObjects") } required init?(coder: NSCoder) { // self.headFooterObjects = coder.decodeObject(forKey: "headFooterObjects") as? [KMHeaderFooterModel] } var datas: Array = [] // var headFooterObjects: [KMHeaderFooterModel]? lazy var dateFormatArray: Array = { let arr = [ "m/d", "m/d/yy", "m/d/yyyy", "mm/dd/yy", "mm/dd/yyyy", "d/m/yy", "d/m/yyyy", "dd/mm/yy", "dd/mm/yyyy", "mm/yy", "mm/yyyy", "m.d.yy", "m.d.yyyy", "mm.dd.yy", "mm.dd.yyyy", "mm.yy", "mm.yyyy", "d.m.yy", "d.m.yyyy", "dd.mm.yy", "dd.mm.yyyy", "yy-mm-dd", "yyyy-mm-dd" ] return arr }() func onlyBatesObjects() -> [KMHeaderFooterModel] { var arr: [KMHeaderFooterModel] = Array() for i in 0.. [KMHeaderFooterModel]{ var arr: [KMHeaderFooterModel] = Array() for i in 0.. $1.id} } } func store() { let encodedObject = NSKeyedArchiver.archivedData(withRootObject: self) let defaults = UserDefaults.standard defaults.set(encodedObject, forKey: kHeaderFooterInfoSaveKey) defaults.synchronize() } func fetchBatesAvailableName() -> String { var availableIndex = 0 let nameArray = converArrType(arr: onlyBatesObjects(), keyString: "id") for i in 0..= availableIndex { availableIndex = index + 1 } } } return String(format: "Bates%ld", availableIndex) } func fetchHeaderFooterAvailableName() -> String { var availableIndex = 0 let nameArray = converArrType(arr: onlyHeaderFooterObjects(), keyString: "id") for i in 0..= availableIndex { availableIndex = index + 1 } } } return String(format: "HeaderFooter%ld", availableIndex) } func converArrType(arr: Array, keyString: String) -> [String] { let newArr = NSMutableArray() for item in arr { newArr.add(item.id) } return newArr as! [String] } func addTemplate(_ model: KMHeaderFooterModel) -> Bool { if (!FileManager.default.fileExists(atPath: kFolderPath!)) { let create: ()? = try?FileManager.default.createDirectory(atPath: kFolderPath!, withIntermediateDirectories: false) if (create == nil) { return false } } if (!FileManager.default.fileExists(atPath: kPlistPath!)) { let create = try?FileManager.default.createFile(atPath: kPlistPath!, contents: nil) if (create == nil) { return false } } let dict = NSDictionary(contentsOfFile: kPlistPath!) var newDict:NSMutableDictionary! if (dict != nil) { newDict = NSMutableDictionary(dictionary: dict!) } else { newDict = NSMutableDictionary() } let modelDict = self.parseModel(model: model) let tag = model.id newDict.addEntries(from: [tag : modelDict]) model.id = tag let result = newDict.write(toFile: kPlistPath!, atomically: true) if (result) { if (self.datas.count < 1) { self.datas.append(model) } else { self.datas.insert(model, at: 0) } } return result } func deleteTemplate(_ model: KMHeaderFooterModel) -> Bool { if (model.id.isEmpty) { return false } if (!FileManager.default.fileExists(atPath: kPlistPath!)) { return false } let key: String = model.id let dictionary = NSDictionary(contentsOfFile: kPlistPath!) var newDictionary: NSMutableDictionary! if (dictionary != nil) { newDictionary = NSMutableDictionary(dictionary: dictionary!) } else { newDictionary = NSMutableDictionary() } newDictionary.removeObject(forKey: key) let result = newDictionary.write(toFile: kPlistPath!, atomically: true) if (result) { if (self.datas.contains(model)) { self.datas.removeObject(model) } } return result } func deleteAllTemplate() -> Bool { if (!FileManager.default.fileExists(atPath: kPlistPath!)) { return false } let dictionary = NSDictionary(contentsOfFile: kPlistPath!) var newDictionary: NSMutableDictionary! if (dictionary != nil) { newDictionary = NSMutableDictionary(dictionary: dictionary!) } else { newDictionary = NSMutableDictionary() } newDictionary.removeAllObjects() let result = newDictionary.write(toFile: kPlistPath!, atomically: true) if (result) { self.datas.removeAll() } return result } func updateTemplate(_ model: KMHeaderFooterModel) -> Bool { if (!FileManager.default.fileExists(atPath: kFolderPath!)) { let create = try?FileManager.default.createDirectory(atPath: kFolderPath!, withIntermediateDirectories: false) if (create == nil) { return false } } if (!FileManager.default.fileExists(atPath: kPlistPath!)) { let create = try?FileManager.default.createFile(atPath: kPlistPath!, contents: nil) if (create == nil) { return false } } var flagModel: KMHeaderFooterModel! for model_ in self.datas { if (model_.id == model.id) { flagModel = model_ break } } if (flagModel == nil) { return false } let dict = NSDictionary(contentsOfFile: kPlistPath!) var newDict:NSMutableDictionary! if (dict != nil) { newDict = NSMutableDictionary(dictionary: dict!) } else { newDict = NSMutableDictionary() } let modelDict = self.parseModel(model: model) newDict.setObject(modelDict, forKey: flagModel.id as NSCopying) let result = newDict.write(toFile: kPlistPath!, atomically: true) if (result) { let index = self.datas.index(of: flagModel) self.datas[index!] = model } return result } func removeHeaderFooter(_ obj: KMHeaderFooterModel) { if (obj.id.count < 1) { return } if (!FileManager.default.fileExists(atPath: kPlistPath!)) { return } let key: String = obj.id let dictionary = NSDictionary(contentsOfFile: kPlistPath!) var newDictionary: NSMutableDictionary! if (dictionary != nil) { newDictionary = NSMutableDictionary(dictionary: dictionary!) } else { newDictionary = NSMutableDictionary() } newDictionary.removeObject(forKey: key) let result = newDictionary.write(toFile: kPlistPath!, atomically: true) if (result) { self.datas.removeObject(obj) } } /** `Private Methods` */ private func parseModel(model: KMHeaderFooterModel) -> Dictionary { var dict: [String : Any] = [:] /// 字体相关 switch model.textFont { case .font(name: var name, size: var size): dict["fontName"] = name dict["fontSize"] = size default: break } switch model.textColor { case .color(red: var red, green: var green, blue: var blue, alpha: var alpha): dict["red"] = red dict["green"] = green dict["blue"] = blue dict["alpha"] = alpha default: break } /// 页边距 dict["leftMargin"] = model.leftMargin dict["rightMargin"] = model.rightMargin dict["bottomMargin"] = model.bottomMargin dict["topMargin"] = model.topMargin dict["isBates"] = model.isBates ? "1" : "0" /// 内容 dict["topLeftString"] = model.topLeftString dict["topCenterString"] = model.topCenterString dict["topRightString"] = model.topRightString dict["bottomLeftString"] = model.bottomLeftString dict["bottomCenterString"] = model.bottomCenterString dict["bottomRightString"] = model.bottomRightString /// 日期 dict["dateFormatString"] = model.dateFormatString /// 页面 dict["pageRangeString"] = model.pageRangeString dict["startString"] = model.startString /// 页面范围 dict["pageRangeType"] = model.pageRangeType.rawValue dict["pageRangeString"] = model.pageRangeString return dict } private func parseDictionary(dict: NSDictionary) -> KMHeaderFooterModel { let model = KMHeaderFooterModel() /// 字体相关 model.textFont = .font(name: dict["fontName"] as! String, size: dict["fontSize"] as! CGFloat) model.textColor = .color(red: dict["red"] as! CGFloat, green: dict["green"] as! CGFloat, blue: dict["blue"] as! CGFloat, alpha: dict["alpha"] as! CGFloat) /// 页边距 model.leftMargin = dict["leftMargin"] as! CGFloat model.rightMargin = dict["rightMargin"] as! CGFloat model.bottomMargin = dict["bottomMargin"] as! CGFloat model.topMargin = dict["topMargin"] as! CGFloat /// 内容 model.topLeftString = dict["topLeftString"] as! String model.topCenterString = dict["topCenterString"] as! String model.topRightString = dict["topRightString"] as! String model.bottomLeftString = dict["bottomLeftString"] as! String model.bottomCenterString = dict["bottomCenterString"] as! String model.bottomRightString = dict["bottomRightString"] as! String model.isBates = false if (dict["isBates"] != nil) { model.isBates = (dict["isBates"] as! String == "1") } /// 日期 model.dateFormatString = dict["dateFormatString"] as! String /// 页面 model.pageRangeString = dict["pageRangeString"] as! String model.startString = dict["startString"] as! String /// 页面范围 model.pageRangeType = KMWatermarkeModelPageRangeType.init(rawValue: dict["pageRangeType"] as! Int)! model.pageRangeString = dict["pageRangeString"] as! String return model } private func tagString() -> String { var result: String = "" let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyMMddHHmmss" result.append(dateFormatter.string(from: Date())) result = result.appendingFormat("%04d", arc4random()%10000) return result } }