KMHeaderFooterManager.swift 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. //
  2. // KMHeaderFooterManager.swift
  3. // PDF Master
  4. //
  5. // Created by tangchao on 2022/12/27.
  6. //
  7. import Cocoa
  8. let kHeaderFooterInfoSaveKey = "kHeaderFooterInfoSaveKey"
  9. class KMHeaderFooterManager: NSObject, NSCoding{
  10. let kFolderPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.applicationSupportDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last?.stringByAppendingPathComponent(Bundle.main.bundleIdentifier!).stringByAppendingPathComponent("headerfooter")
  11. let kPlistPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.applicationSupportDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last?.stringByAppendingPathComponent(Bundle.main.bundleIdentifier!).stringByAppendingPathComponent("headerfooter").stringByAppendingPathComponent("headerfooter.plist")
  12. static let defaultManager = KMHeaderFooterManager()
  13. // = {
  14. // var manager = KMHeaderFooterManager()
  15. // if let storedData = UserDefaults.standard.value(forKey: kHeaderFooterInfoSaveKey) as? Data {
  16. // manager = NSKeyedUnarchiver.unarchiveObject(with: storedData) as! KMHeaderFooterManager
  17. // } else {
  18. // manager = KMHeaderFooterManager()
  19. //// if manager.headFooterObjects == nil {
  20. //// manager.headFooterObjects = []
  21. //// }
  22. // }
  23. // return manager
  24. // }()
  25. func encode(with coder: NSCoder) {
  26. // coder.encode(self.headFooterObjects, forKey: "headFooterObjects")
  27. }
  28. required init?(coder: NSCoder) {
  29. // self.headFooterObjects = coder.decodeObject(forKey: "headFooterObjects") as? [KMHeaderFooterModel]
  30. }
  31. var datas: Array<KMHeaderFooterModel> = []
  32. // var headFooterObjects: [KMHeaderFooterModel]?
  33. lazy var dateFormatArray: Array = {
  34. let arr = [
  35. "m/d",
  36. "m/d/yy",
  37. "m/d/yyyy",
  38. "mm/dd/yy",
  39. "mm/dd/yyyy",
  40. "d/m/yy",
  41. "d/m/yyyy",
  42. "dd/mm/yy",
  43. "dd/mm/yyyy",
  44. "mm/yy",
  45. "mm/yyyy",
  46. "m.d.yy",
  47. "m.d.yyyy",
  48. "mm.dd.yy",
  49. "mm.dd.yyyy",
  50. "mm.yy",
  51. "mm.yyyy",
  52. "d.m.yy",
  53. "d.m.yyyy",
  54. "dd.mm.yy",
  55. "dd.mm.yyyy",
  56. "yy-mm-dd",
  57. "yyyy-mm-dd"
  58. ]
  59. return arr
  60. }()
  61. func onlyBatesObjects() -> [KMHeaderFooterModel] {
  62. var arr: [KMHeaderFooterModel] = Array<KMHeaderFooterModel>()
  63. for i in 0..<datas.count {
  64. let obj = self.datas[i]
  65. if KMDataVersionManager.updateBatesData() {
  66. KMDataVersionManager.refrshBatesData(bates: obj)
  67. store()
  68. }
  69. if obj.isBates {
  70. arr.append(obj)
  71. }
  72. }
  73. return arr
  74. }
  75. func onlyHeaderFooterObjects() -> [KMHeaderFooterModel]{
  76. var arr: [KMHeaderFooterModel] = Array<KMHeaderFooterModel>()
  77. for i in 0..<self.datas.count {
  78. let obj = self.datas[i]
  79. if !obj.isBates {
  80. arr.append(obj)
  81. }
  82. }
  83. return arr
  84. }
  85. override init() {
  86. super.init()
  87. if (FileManager.default.fileExists(atPath: kPlistPath!)) {
  88. let dataDict = NSDictionary(contentsOfFile: kPlistPath!)
  89. if (dataDict == nil) {
  90. return
  91. }
  92. for keyIndex in 0 ..< (dataDict?.allKeys.count ?? 0) {
  93. let key: String = dataDict?.allKeys[keyIndex] as! String
  94. let backgroundDict: NSDictionary = dataDict?.object(forKey: key) as! NSDictionary
  95. let model = parseDictionary(dict: backgroundDict)
  96. /// 赋值id
  97. model.id = key
  98. self.datas.append(model)
  99. }
  100. /// 根据id进行排序(升序)
  101. self.datas.sort(){$0.id > $1.id}
  102. }
  103. }
  104. func store() {
  105. let encodedObject = NSKeyedArchiver.archivedData(withRootObject: self)
  106. let defaults = UserDefaults.standard
  107. defaults.set(encodedObject, forKey: kHeaderFooterInfoSaveKey)
  108. defaults.synchronize()
  109. }
  110. func fetchBatesAvailableName() -> String {
  111. var availableIndex = 0
  112. let nameArray = converArrType(arr: onlyBatesObjects(), keyString: "id")
  113. for i in 0..<nameArray.count {
  114. let string = nameArray[i]
  115. if string.hasPrefix("Bates") {
  116. let index = Int(string.substring(from: "Bates".endIndex))!
  117. if index >= availableIndex {
  118. availableIndex = index + 1
  119. }
  120. }
  121. }
  122. return String(format: "Bates%ld", availableIndex)
  123. }
  124. func fetchHeaderFooterAvailableName() -> String {
  125. var availableIndex = 0
  126. let nameArray = converArrType(arr: onlyHeaderFooterObjects(), keyString: "id")
  127. for i in 0..<nameArray.count {
  128. let string = nameArray[i]
  129. if string.hasPrefix("HeaderFooter") {
  130. let index = Int(string.substring(from: "HeaderFooter".endIndex))!
  131. if index >= availableIndex {
  132. availableIndex = index + 1
  133. }
  134. }
  135. }
  136. return String(format: "HeaderFooter%ld", availableIndex)
  137. }
  138. func converArrType(arr: Array<KMHeaderFooterModel>, keyString: String) -> [String] {
  139. let newArr = NSMutableArray()
  140. for item in arr {
  141. newArr.add(item.id)
  142. }
  143. return newArr as! [String]
  144. }
  145. func addTemplate(_ model: KMHeaderFooterModel) -> Bool {
  146. if (!FileManager.default.fileExists(atPath: kFolderPath!)) {
  147. let create: ()? = try?FileManager.default.createDirectory(atPath: kFolderPath!, withIntermediateDirectories: false)
  148. if (create == nil) {
  149. return false
  150. }
  151. }
  152. if (!FileManager.default.fileExists(atPath: kPlistPath!)) {
  153. let create = try?FileManager.default.createFile(atPath: kPlistPath!, contents: nil)
  154. if (create == nil) {
  155. return false
  156. }
  157. }
  158. let dict = NSDictionary(contentsOfFile: kPlistPath!)
  159. var newDict:NSMutableDictionary!
  160. if (dict != nil) {
  161. newDict = NSMutableDictionary(dictionary: dict!)
  162. } else {
  163. newDict = NSMutableDictionary()
  164. }
  165. let modelDict = self.parseModel(model: model)
  166. let tag = model.id
  167. newDict.addEntries(from: [tag : modelDict])
  168. model.id = tag
  169. let result = newDict.write(toFile: kPlistPath!, atomically: true)
  170. if (result) {
  171. if (self.datas.count < 1) {
  172. self.datas.append(model)
  173. } else {
  174. self.datas.insert(model, at: 0)
  175. }
  176. }
  177. return result
  178. }
  179. func deleteTemplate(_ model: KMHeaderFooterModel) -> Bool {
  180. if (model.id.isEmpty) {
  181. return false
  182. }
  183. if (!FileManager.default.fileExists(atPath: kPlistPath!)) {
  184. return false
  185. }
  186. let key: String = model.id
  187. let dictionary = NSDictionary(contentsOfFile: kPlistPath!)
  188. var newDictionary: NSMutableDictionary!
  189. if (dictionary != nil) {
  190. newDictionary = NSMutableDictionary(dictionary: dictionary!)
  191. } else {
  192. newDictionary = NSMutableDictionary()
  193. }
  194. newDictionary.removeObject(forKey: key)
  195. let result = newDictionary.write(toFile: kPlistPath!, atomically: true)
  196. if (result) {
  197. if (self.datas.contains(model)) {
  198. self.datas.removeObject(model)
  199. }
  200. }
  201. return result
  202. }
  203. func deleteAllTemplate() -> Bool {
  204. if (!FileManager.default.fileExists(atPath: kPlistPath!)) {
  205. return false
  206. }
  207. let dictionary = NSDictionary(contentsOfFile: kPlistPath!)
  208. var newDictionary: NSMutableDictionary!
  209. if (dictionary != nil) {
  210. newDictionary = NSMutableDictionary(dictionary: dictionary!)
  211. } else {
  212. newDictionary = NSMutableDictionary()
  213. }
  214. newDictionary.removeAllObjects()
  215. let result = newDictionary.write(toFile: kPlistPath!, atomically: true)
  216. if (result) {
  217. self.datas.removeAll()
  218. }
  219. return result
  220. }
  221. func updateTemplate(_ model: KMHeaderFooterModel) -> Bool {
  222. if (!FileManager.default.fileExists(atPath: kFolderPath!)) {
  223. let create = try?FileManager.default.createDirectory(atPath: kFolderPath!, withIntermediateDirectories: false)
  224. if (create == nil) {
  225. return false
  226. }
  227. }
  228. if (!FileManager.default.fileExists(atPath: kPlistPath!)) {
  229. let create = try?FileManager.default.createFile(atPath: kPlistPath!, contents: nil)
  230. if (create == nil) {
  231. return false
  232. }
  233. }
  234. var flagModel: KMHeaderFooterModel!
  235. for model_ in self.datas {
  236. if (model_.id == model.id) {
  237. flagModel = model_
  238. break
  239. }
  240. }
  241. if (flagModel == nil) {
  242. return false
  243. }
  244. let dict = NSDictionary(contentsOfFile: kPlistPath!)
  245. var newDict:NSMutableDictionary!
  246. if (dict != nil) {
  247. newDict = NSMutableDictionary(dictionary: dict!)
  248. } else {
  249. newDict = NSMutableDictionary()
  250. }
  251. let modelDict = self.parseModel(model: model)
  252. newDict.setObject(modelDict, forKey: flagModel.id as NSCopying)
  253. let result = newDict.write(toFile: kPlistPath!, atomically: true)
  254. if (result) {
  255. let index = self.datas.index(of: flagModel)
  256. self.datas[index!] = model
  257. }
  258. return result
  259. }
  260. func removeHeaderFooter(_ obj: KMHeaderFooterModel) {
  261. if (obj.id.count < 1) {
  262. return
  263. }
  264. if (!FileManager.default.fileExists(atPath: kPlistPath!)) {
  265. return
  266. }
  267. let key: String = obj.id
  268. let dictionary = NSDictionary(contentsOfFile: kPlistPath!)
  269. var newDictionary: NSMutableDictionary!
  270. if (dictionary != nil) {
  271. newDictionary = NSMutableDictionary(dictionary: dictionary!)
  272. } else {
  273. newDictionary = NSMutableDictionary()
  274. }
  275. newDictionary.removeObject(forKey: key)
  276. let result = newDictionary.write(toFile: kPlistPath!, atomically: true)
  277. if (result) {
  278. self.datas.removeObject(obj)
  279. }
  280. }
  281. /**
  282. `Private Methods`
  283. */
  284. private func parseModel(model: KMHeaderFooterModel) -> Dictionary<String, Any> {
  285. var dict: [String : Any] = [:]
  286. /// 字体相关
  287. switch model.textFont {
  288. case .font(name: var name, size: var size):
  289. dict["fontName"] = name
  290. dict["fontSize"] = size
  291. default: break
  292. }
  293. switch model.textColor {
  294. case .color(red: var red, green: var green, blue: var blue, alpha: var alpha):
  295. dict["red"] = red
  296. dict["green"] = green
  297. dict["blue"] = blue
  298. dict["alpha"] = alpha
  299. default: break
  300. }
  301. /// 页边距
  302. dict["leftMargin"] = model.leftMargin
  303. dict["rightMargin"] = model.rightMargin
  304. dict["bottomMargin"] = model.bottomMargin
  305. dict["topMargin"] = model.topMargin
  306. dict["isBates"] = model.isBates ? "1" : "0"
  307. /// 内容
  308. dict["topLeftString"] = model.topLeftString
  309. dict["topCenterString"] = model.topCenterString
  310. dict["topRightString"] = model.topRightString
  311. dict["bottomLeftString"] = model.bottomLeftString
  312. dict["bottomCenterString"] = model.bottomCenterString
  313. dict["bottomRightString"] = model.bottomRightString
  314. /// 日期
  315. dict["dateFormatString"] = model.dateFormatString
  316. /// 页面
  317. dict["pageRangeString"] = model.pageRangeString
  318. dict["startString"] = model.startString
  319. /// 页面范围
  320. dict["pageRangeType"] = model.pageRangeType.rawValue
  321. dict["pageRangeString"] = model.pageRangeString
  322. return dict
  323. }
  324. private func parseDictionary(dict: NSDictionary) -> KMHeaderFooterModel {
  325. let model = KMHeaderFooterModel()
  326. /// 字体相关
  327. model.textFont = .font(name: dict["fontName"] as! String, size: dict["fontSize"] as! CGFloat)
  328. model.textColor = .color(red: dict["red"] as! CGFloat, green: dict["green"] as! CGFloat, blue: dict["blue"] as! CGFloat, alpha: dict["alpha"] as! CGFloat)
  329. /// 页边距
  330. model.leftMargin = dict["leftMargin"] as! CGFloat
  331. model.rightMargin = dict["rightMargin"] as! CGFloat
  332. model.bottomMargin = dict["bottomMargin"] as! CGFloat
  333. model.topMargin = dict["topMargin"] as! CGFloat
  334. /// 内容
  335. model.topLeftString = dict["topLeftString"] as! String
  336. model.topCenterString = dict["topCenterString"] as! String
  337. model.topRightString = dict["topRightString"] as! String
  338. model.bottomLeftString = dict["bottomLeftString"] as! String
  339. model.bottomCenterString = dict["bottomCenterString"] as! String
  340. model.bottomRightString = dict["bottomRightString"] as! String
  341. model.isBates = false
  342. if (dict["isBates"] != nil) {
  343. model.isBates = (dict["isBates"] as! String == "1")
  344. }
  345. /// 日期
  346. model.dateFormatString = dict["dateFormatString"] as! String
  347. /// 页面
  348. model.pageRangeString = dict["pageRangeString"] as! String
  349. model.startString = dict["startString"] as! String
  350. /// 页面范围
  351. model.pageRangeType = KMWatermarkeModelPageRangeType.init(rawValue: dict["pageRangeType"] as! Int)!
  352. model.pageRangeString = dict["pageRangeString"] as! String
  353. return model
  354. }
  355. private func tagString() -> String {
  356. var result: String = ""
  357. let dateFormatter = DateFormatter()
  358. dateFormatter.dateFormat = "yyMMddHHmmss"
  359. result.append(dateFormatter.string(from: Date()))
  360. result = result.appendingFormat("%04d", arc4random()%10000)
  361. return result
  362. }
  363. }