KMWatermarkManager.swift 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606
  1. //
  2. // KMWatermarkManager.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by tangchao on 2022/12/19.
  6. //
  7. import Cocoa
  8. let KMWaterMarkDatasUpdateNotiName = NSNotification.Name("KMWaterMarkDatasUpdateNotiName")
  9. enum KMWatermarkKey: String {
  10. case watermarkType = "watermarkTypeKey"
  11. case text = "WatermarTextKey"
  12. case textFontSize = "WatermarkOfTextFontSizeKey"
  13. case textfontStyle = "WatermarkOfTextFontStyleKey"
  14. case textFontName = "textFontName"
  15. case textColor = "WatermarkTextColorKey"
  16. case red = "WatermarkOfRedKey"
  17. case green = "WatermarkOfGreenKey"
  18. case blue = "WatermarkOfBlueKey"
  19. case imagePath = "WatermarkOfImagePathKey"
  20. case rotate = "WatermarkOfRotationKey"
  21. case opacity = "WatermarkOfOpacityKey"
  22. case isScale = "WatermarkOfIsScaleKey"
  23. case scale = "WatermarkOfScaleKey"
  24. case verticalMode = "WatermarkOfVerticalModeKey"
  25. case verticalSpace = "WatermarkOfVerticalSpaceKey"
  26. case horizontalMode = "WatermarkOfHorizontalModeKey"
  27. case horizontalSpace = "WatermarkOfHorizontalSpaceKey"
  28. case isFront = "WatermarkOfIsFrontKey"
  29. case createDate = "WatermarkOfCreatTemplateDateKey"
  30. case pageRangeType = "WatermarkOfPageRangeTypeKey"
  31. case pageRangeString = "WatermarkOfPageStringKey"
  32. case tileVerticalSpace = "WatermarkTileVerticalSpaceKey"
  33. case tileHorizontalSpace = "WatermarkTileHorizontalSpaceKey"
  34. case isTile = "WatermarkOfIsTileKey"
  35. case lastAddData = "kAddLastWatermarkDataKey1"
  36. case id = "kWatermarkIDKey"
  37. case tag = "kWatermarkTagKey"
  38. case watermarkName = "watermarkNameKey"
  39. }
  40. class KMWatermarkManager: NSObject {
  41. let watermarkFolderPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.applicationSupportDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last?.stringByAppendingPathComponent(Bundle.main.bundleIdentifier!).stringByAppendingPathComponent("watermark")
  42. let watermarkPlistPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.applicationSupportDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last?.stringByAppendingPathComponent(Bundle.main.bundleIdentifier!).stringByAppendingPathComponent("watermark").stringByAppendingPathComponent("watermark.plist")
  43. let watermarkImageFolder = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.applicationSupportDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last?.stringByAppendingPathComponent(Bundle.main.bundleIdentifier!).stringByAppendingPathComponent("watermark").stringByAppendingPathComponent("image")
  44. static let defaultManager = KMWatermarkManager()
  45. var watermarks: Array<KMWatermarkModel> = []
  46. var defaultWatermarkData = KMWatermarkModel.defaultWDData()
  47. override init() {
  48. super.init()
  49. #if DEBUG
  50. print("watermarkPlistPath=\(watermarkPlistPath ?? "")")
  51. #endif
  52. if (!FileManager.default.fileExists(atPath: watermarkFolderPath!)) {
  53. try?FileManager.default.createDirectory(atPath: watermarkFolderPath!, withIntermediateDirectories: true, attributes: nil)
  54. }
  55. if (!FileManager.default.fileExists(atPath: watermarkImageFolder!)) {
  56. let create: ()? = try?FileManager.default.createDirectory(atPath: watermarkImageFolder!, withIntermediateDirectories: false)
  57. }
  58. if (FileManager.default.fileExists(atPath: watermarkPlistPath!)) {
  59. let dataDict = NSDictionary(contentsOfFile: watermarkPlistPath!)
  60. for keyIndex in 0 ..< (dataDict?.allKeys.count ?? 0) {
  61. let key: String = dataDict?.allKeys[keyIndex] as! String
  62. let watermarkDict: NSDictionary = dataDict?.object(forKey: key) as! NSDictionary
  63. let model = parseDictionary(dict: watermarkDict)
  64. watermarks.append(model)
  65. }
  66. watermarks.sort(){$0.tag > $1.tag}
  67. }
  68. }
  69. //MARK: - 增删改查
  70. func addWatermark(watermark: KMWatermarkModel) -> Bool {
  71. if (!FileManager.default.fileExists(atPath: watermarkFolderPath!)) {
  72. let create: ()? = try?FileManager.default.createDirectory(atPath: watermarkFolderPath!, withIntermediateDirectories: true, attributes: nil)
  73. if (create == nil) {
  74. return false
  75. }
  76. }
  77. if (!FileManager.default.fileExists(atPath: watermarkPlistPath!)) {
  78. FileManager.default.createFile(atPath: watermarkPlistPath!, contents: nil)
  79. }
  80. let dict = NSDictionary(contentsOfFile: watermarkPlistPath!)
  81. var newDict:NSMutableDictionary!
  82. if (dict != nil) {
  83. newDict = NSMutableDictionary(dictionary: dict!)
  84. } else {
  85. newDict = NSMutableDictionary()
  86. }
  87. let watermarkDict = self.parseWaterMark(model: watermark)
  88. if (watermarkDict.isEmpty) {
  89. return false
  90. }
  91. let key: String = watermark.tag
  92. if newDict.object(forKey: key) != nil {
  93. newDict.setObject(watermarkDict, forKey: key as NSCopying)
  94. } else {
  95. newDict.addEntries(from: [key : watermarkDict])
  96. }
  97. let result = newDict.write(toFile: watermarkPlistPath!, atomically: true)
  98. if (result) {
  99. if (self.watermarks.count < 1) {
  100. self.watermarks.append(watermark)
  101. } else {
  102. self.watermarks.insert(watermark, at: 0)
  103. }
  104. watermark.updatePreviewImage()
  105. }
  106. NotificationCenter.default.post(name: KMWaterMarkDatasUpdateNotiName, object: nil)
  107. return result
  108. }
  109. func updateWatermark(watermark: KMWatermarkModel) -> Bool {
  110. if (!FileManager.default.fileExists(atPath: watermarkFolderPath!)) {
  111. let create: ()? = try?FileManager.default.createDirectory(atPath: watermarkFolderPath!, withIntermediateDirectories: false)
  112. if (create == nil) {
  113. return false
  114. }
  115. }
  116. if (!FileManager.default.fileExists(atPath: watermarkPlistPath!)) {
  117. FileManager.default.createFile(atPath: watermarkPlistPath!, contents: nil)
  118. }
  119. var flagModel: KMWatermarkModel!
  120. for model in self.watermarks {
  121. if (model.tag == watermark.tag) {
  122. flagModel = model
  123. break
  124. }
  125. }
  126. if (flagModel == nil) {
  127. return false
  128. }
  129. let dict = NSDictionary(contentsOfFile: watermarkPlistPath!)
  130. var newDict:NSMutableDictionary!
  131. if (dict != nil) {
  132. newDict = NSMutableDictionary(dictionary: dict!)
  133. } else {
  134. newDict = NSMutableDictionary()
  135. }
  136. let watermarkDict = self.parseWaterMark(model: watermark)
  137. if (watermarkDict.isEmpty) {
  138. return false
  139. }
  140. newDict.setObject(watermarkDict, forKey: flagModel.tag as NSCopying)
  141. let result = newDict.write(toFile: watermarkPlistPath!, atomically: true)
  142. if (result) {
  143. if let index = self.watermarks.firstIndex(of: flagModel) {
  144. self.watermarks[index] = watermark
  145. }
  146. watermark.updatePreviewImage()
  147. }
  148. NotificationCenter.default.post(name: KMWaterMarkDatasUpdateNotiName, object: nil)
  149. return result
  150. }
  151. func removeWatermark(watermark: KMWatermarkModel) -> Bool {
  152. if (!FileManager.default.fileExists(atPath: watermarkPlistPath!)) {
  153. return false
  154. }
  155. let key: String = watermark.tag
  156. let dictionary = NSDictionary(contentsOfFile: watermarkPlistPath!)
  157. var newDictionary: NSMutableDictionary!
  158. if (dictionary != nil) {
  159. newDictionary = NSMutableDictionary(dictionary: dictionary!)
  160. } else {
  161. newDictionary = NSMutableDictionary()
  162. }
  163. newDictionary.removeObject(forKey: key)
  164. let result = newDictionary.write(toFile: watermarkPlistPath!, atomically: true)
  165. if (result) {
  166. if let filePath: String = watermark.imagePath {
  167. try?FileManager.default.removeItem(atPath: filePath)
  168. }
  169. if (self.watermarks.contains(watermark)) {
  170. self.watermarks.removeObject(watermark)
  171. }
  172. }
  173. NotificationCenter.default.post(name: KMWaterMarkDatasUpdateNotiName, object: nil)
  174. return result
  175. }
  176. func removeAllWatermark() -> Bool {
  177. if (!FileManager.default.fileExists(atPath: watermarkPlistPath!)) {
  178. return false
  179. }
  180. let dictionary = NSDictionary(contentsOfFile: watermarkPlistPath!)
  181. var newDictionary: NSMutableDictionary!
  182. if (dictionary != nil) {
  183. newDictionary = NSMutableDictionary(dictionary: dictionary!)
  184. } else {
  185. newDictionary = NSMutableDictionary()
  186. }
  187. newDictionary.removeAllObjects()
  188. let result = newDictionary.write(toFile: watermarkPlistPath!, atomically: true)
  189. if (result) {
  190. self.watermarks.removeAll()
  191. }
  192. NotificationCenter.default.post(name: KMWaterMarkDatasUpdateNotiName, object: nil)
  193. return result
  194. }
  195. //MARK: - private
  196. func setDictToWatermarK(dict: NSDictionary, _ model: KMWatermarkModel) {
  197. model.watermarkType = .text
  198. if let typeIndex = dict.object(forKey: KMWatermarkKey.watermarkType.rawValue) as? AnyObject {
  199. if let rawValue = typeIndex as? Int {
  200. model.watermarkType = CPDFWatermarkType(rawValue: rawValue) ?? .text
  201. } else if let rawValue = typeIndex as? String, let rawIndex = Int(rawValue) {
  202. model.watermarkType = CPDFWatermarkType(rawValue: rawIndex) ?? .text
  203. }
  204. }
  205. model.text = (dict.object(forKey: KMWatermarkKey.text.rawValue) as? String)
  206. model.fontName = (dict.object(forKey: KMWatermarkKey.textFontName.rawValue) as? String) ?? ""
  207. model.fontStyle = (dict.object(forKey: KMWatermarkKey.textfontStyle.rawValue) as? String) ?? ""
  208. model.fontSize = (dict.object(forKey: KMWatermarkKey.textFontSize.rawValue) as? CGFloat) ?? 12
  209. if let pathValue = dict.object(forKey: KMWatermarkKey.imagePath.rawValue) {
  210. let path = watermarkFolderPath?.stringByAppendingPathComponent(pathValue as! String)
  211. if (FileManager.default.fileExists(atPath: path!)) {
  212. model.imagePath = path ?? ""
  213. }
  214. }
  215. model.isScale = (dict.object(forKey: KMWatermarkKey.isScale.rawValue) as? Bool) ?? false
  216. model.scale = (dict.object(forKey: KMWatermarkKey.scale.rawValue) as? CGFloat) ?? 1
  217. model.rotation = dict.object(forKey: KMWatermarkKey.rotate.rawValue) as? CGFloat ?? 0
  218. model.opacity = (dict.object(forKey: KMWatermarkKey.opacity.rawValue) as? CGFloat) ?? 1
  219. model.verticalPosition = (dict.object(forKey: KMWatermarkKey.verticalMode.rawValue) as? CPDFWatermarkVerticalPosition) ?? .center
  220. model.ty = dict.object(forKey: KMWatermarkKey.verticalSpace.rawValue) as? CGFloat ?? 0
  221. model.horizontalPosition = (dict.object(forKey: KMWatermarkKey.horizontalMode.rawValue) as? CPDFWatermarkHorizontalPosition) ?? .center
  222. model.tx = dict.object(forKey: KMWatermarkKey.horizontalSpace.rawValue) as? CGFloat ?? 0
  223. if let textColorKey = dict.object(forKey: KMWatermarkKey.textColor.rawValue) as? String {
  224. model.textColor = NSColor.km_init(hex: textColorKey)
  225. } else {
  226. let red: CGFloat = dict.object(forKey: KMWatermarkKey.red.rawValue) as? CGFloat ?? 0
  227. let green: CGFloat = dict.object(forKey: KMWatermarkKey.green.rawValue) as? CGFloat ?? 0
  228. let blue: CGFloat = dict.object(forKey: KMWatermarkKey.blue.rawValue) as? CGFloat ?? 0
  229. model.textColor = NSColor(red: red, green: green, blue: blue, alpha: 1.0)
  230. }
  231. model.isFront = (dict.object(forKey: KMWatermarkKey.isFront.rawValue) as? Bool) ?? false
  232. model.isTilePage = (dict.object(forKey: KMWatermarkKey.isTile.rawValue) as? Bool) ?? false
  233. model.horizontalSpacing = (dict.object(forKey: KMWatermarkKey.tileHorizontalSpace.rawValue) as? CGFloat) ?? 0
  234. model.verticalSpacing = (dict.object(forKey: KMWatermarkKey.tileVerticalSpace.rawValue) as? CGFloat) ?? 0
  235. model.tag = (dict.object(forKey: KMWatermarkKey.tag.rawValue) as? String) ?? ""
  236. model.watermarkName = (dict.object(forKey: KMWatermarkKey.watermarkName.rawValue) as? String) ?? ""
  237. NotificationCenter.default.post(name: KMWaterMarkDatasUpdateNotiName, object: nil)
  238. }
  239. //MARK: - Parse
  240. func parseWaterMark(model: KMWatermarkModel) -> Dictionary<String, Any> {
  241. var dict: [String : Any] = [:]
  242. if model.watermarkType == .text {
  243. dict[KMWatermarkKey.watermarkType.rawValue] = NSNumber(value: 0)
  244. } else if model.watermarkType == .image {
  245. dict[KMWatermarkKey.watermarkType.rawValue] = NSNumber(value: 1)
  246. }
  247. if let text = model.text {
  248. dict[KMWatermarkKey.text.rawValue] = text
  249. }
  250. dict[KMWatermarkKey.textFontName.rawValue] = model.fontName
  251. dict[KMWatermarkKey.textfontStyle.rawValue] = model.fontStyle
  252. dict[KMWatermarkKey.textFontSize.rawValue] = model.fontSize
  253. if let imagePath = model.imagePath {
  254. dict[KMWatermarkKey.imagePath.rawValue] = imagePath
  255. }
  256. dict[KMWatermarkKey.isFront.rawValue] = model.isFront
  257. dict[KMWatermarkKey.isScale.rawValue] = model.isScale
  258. dict[KMWatermarkKey.scale.rawValue] = model.scale
  259. dict[KMWatermarkKey.opacity.rawValue] = model.opacity
  260. dict[KMWatermarkKey.rotate.rawValue] = model.rotation
  261. dict[KMWatermarkKey.verticalMode.rawValue] = model.verticalPosition.rawValue
  262. dict[KMWatermarkKey.verticalSpace.rawValue] = model.ty
  263. dict[KMWatermarkKey.horizontalMode.rawValue] = model.horizontalPosition.rawValue
  264. dict[KMWatermarkKey.horizontalSpace.rawValue] = model.tx
  265. dict[KMWatermarkKey.textColor.rawValue] = model.textColor.toHex()
  266. dict[KMWatermarkKey.isTile.rawValue] = model.isTilePage
  267. dict[KMWatermarkKey.tileVerticalSpace.rawValue] = model.verticalSpacing
  268. dict[KMWatermarkKey.tileHorizontalSpace.rawValue] = model.horizontalSpacing
  269. dict[KMWatermarkKey.tag.rawValue] = model.tag
  270. dict[KMWatermarkKey.watermarkName.rawValue] = model.watermarkName
  271. return dict
  272. }
  273. private func parseDictionary(dict: NSDictionary) -> KMWatermarkModel {
  274. let model = KMWatermarkModel()
  275. if let type = dict.object(forKey: KMWatermarkKey.watermarkType.rawValue) {
  276. if let data = type as? Int {
  277. model.watermarkType = CPDFWatermarkType(rawValue: data) ?? .text
  278. } else if let data = type as? String, let value = Int(data), value < 2 {
  279. model.watermarkType = CPDFWatermarkType(rawValue: value) ?? .text
  280. } else {
  281. model.watermarkType = .text
  282. }
  283. } else {
  284. model.watermarkType = .text
  285. }
  286. model.text = (dict.object(forKey: KMWatermarkKey.text.rawValue) as? String)
  287. model.fontName = (dict.object(forKey: KMWatermarkKey.textFontName.rawValue) as? String) ?? ""
  288. model.fontStyle = (dict.object(forKey: KMWatermarkKey.textfontStyle.rawValue) as? String) ?? ""
  289. model.fontSize = (dict.object(forKey: KMWatermarkKey.textFontSize.rawValue) as? CGFloat) ?? 12
  290. if let pathValue = dict.object(forKey: KMWatermarkKey.imagePath.rawValue) {
  291. model.imagePath = pathValue as? String
  292. }
  293. model.isScale = (dict.object(forKey: KMWatermarkKey.isScale.rawValue) as? Bool) ?? false
  294. model.scale = (dict.object(forKey: KMWatermarkKey.scale.rawValue) as? CGFloat) ?? 1
  295. model.rotation = dict.object(forKey: KMWatermarkKey.rotate.rawValue) as? CGFloat ?? 0
  296. model.opacity = (dict.object(forKey: KMWatermarkKey.opacity.rawValue) as? CGFloat) ?? 1
  297. model.verticalPosition = (dict.object(forKey: KMWatermarkKey.verticalMode.rawValue) as? CPDFWatermarkVerticalPosition) ?? .center
  298. model.ty = dict.object(forKey: KMWatermarkKey.verticalSpace.rawValue) as? CGFloat ?? 0
  299. model.horizontalPosition = (dict.object(forKey: KMWatermarkKey.horizontalMode.rawValue) as? CPDFWatermarkHorizontalPosition) ?? .center
  300. model.tx = dict.object(forKey: KMWatermarkKey.horizontalSpace.rawValue) as? CGFloat ?? 0
  301. if let textColorKey = dict.object(forKey: KMWatermarkKey.textColor.rawValue) as? String {
  302. model.textColor = NSColor.km_init(hex: textColorKey)
  303. } else {
  304. let red: CGFloat = dict.object(forKey: KMWatermarkKey.red.rawValue) as? CGFloat ?? 0
  305. let green: CGFloat = dict.object(forKey: KMWatermarkKey.green.rawValue) as? CGFloat ?? 0
  306. let blue: CGFloat = dict.object(forKey: KMWatermarkKey.blue.rawValue) as? CGFloat ?? 0
  307. model.textColor = NSColor(red: red, green: green, blue: blue, alpha: 1.0)
  308. }
  309. model.isFront = (dict.object(forKey: KMWatermarkKey.isFront.rawValue) as? Bool) ?? false
  310. model.isTilePage = (dict.object(forKey: KMWatermarkKey.isTile.rawValue) as? Bool) ?? false
  311. model.horizontalSpacing = (dict.object(forKey: KMWatermarkKey.tileHorizontalSpace.rawValue) as? CGFloat) ?? 0
  312. model.verticalSpacing = (dict.object(forKey: KMWatermarkKey.tileVerticalSpace.rawValue) as? CGFloat) ?? 0
  313. model.tag = (dict.object(forKey: KMWatermarkKey.tag.rawValue) as? String) ?? ""
  314. model.watermarkName = (dict.object(forKey: KMWatermarkKey.watermarkName.rawValue) as? String) ?? ""
  315. return model
  316. }
  317. // 水平位置枚举
  318. enum HorizontalPosition {
  319. case left
  320. case center
  321. case right
  322. }
  323. // 垂直位置枚举
  324. enum VerticalPosition {
  325. case top
  326. case center
  327. case bottom
  328. }
  329. //MARK: - Getter
  330. func drawImageAtpageRect(rect: NSRect, data: KMWatermarkModel) -> NSImage? {
  331. var size = CGSize(width: 177*3, height: 252*3)
  332. let text: String = data.text ?? ""
  333. var color = data.textColor
  334. var red: CGFloat = 0, green: CGFloat = 0, blue: CGFloat = 0
  335. color.usingColorSpaceName(.calibratedRGB)?.getRed(&red, green: &green, blue: &blue, alpha: nil)
  336. color = NSColor.init(calibratedRed: red, green: green, blue: blue, alpha: data.opacity)
  337. var returnImage: NSImage?
  338. if data.watermarkType == .image {
  339. guard let image = data.image() else {
  340. return returnImage
  341. }
  342. if data.isTilePage {
  343. returnImage = NSImage.createTileImageWithImage(imageToDraw: image,
  344. imageSize: size,
  345. rotationAngle: data.rotation * -1,
  346. horizontalPosition: data.horizontalPosition,
  347. verticalPosition: data.verticalPosition,
  348. alpha: data.opacity,
  349. sizeRatio: data.scale,
  350. horizontalSpacing: data.tx,
  351. verticalSpacing: data.ty)
  352. } else {
  353. returnImage = NSImage.createImageWithImage(imageToDraw: image,
  354. imageSize: size,
  355. rotationAngle: data.rotation * -1,
  356. horizontalPosition: data.horizontalPosition,
  357. verticalPosition: data.verticalPosition,
  358. alpha: data.opacity,
  359. sizeRatio: data.isScale ? data.scale : -1,
  360. horizontalSpacing: data.tx,
  361. verticalSpacing: data.ty)
  362. }
  363. } else if text.count > 0 {
  364. if data.isTilePage {
  365. returnImage = NSImage.createImageWithTileText(text: text,
  366. fontSize: data.fontSize,
  367. textColor: color,
  368. imageSize: size,
  369. rotationAngle: data.rotation * -1,
  370. verticalSpacing: data.verticalSpacing,
  371. horizontalSpacing: data.horizontalSpacing)
  372. } else {
  373. returnImage = NSImage.createImageWithText(text: text,
  374. fontSize: data.fontSize,
  375. textColor: color,
  376. imageSize: size,
  377. rotationAngle: data.rotation * -1,
  378. horizontalPosition: data.horizontalPosition,
  379. verticalPosition: data.verticalPosition,
  380. horizontalSpacing: data.tx,
  381. verticalSpacing: data.ty)
  382. }
  383. }
  384. return returnImage
  385. }
  386. class func getFontSize() -> [String] {
  387. return ["6","8","10","12","14",
  388. "16","18","20","22","24",
  389. "26","28","30","32","34",
  390. "36","40","48","64","80",
  391. "96","112"]
  392. }
  393. func fetchAvailableName() -> String {
  394. var availableIndex: Int = 0
  395. let watermark = "Watermark"
  396. for model in self.watermarks {
  397. let watermarkID = model.tag
  398. if (watermarkID.hasPrefix(watermark)) {
  399. let indexString: String = (watermarkID.components(separatedBy: watermark).last ?? "0")
  400. let index: Int = Int(indexString) ?? 0
  401. if (index >= availableIndex) {
  402. availableIndex = index + 1
  403. }
  404. }
  405. }
  406. return "\(watermark)\(availableIndex)"
  407. }
  408. //MARK: - Compare
  409. class func compareIsChangedModel(_ model: KMWatermarkModel, withDict dict: NSDictionary) -> Bool {
  410. if let value = dict["fontName"] {
  411. if model.fontName != (value as! String) {
  412. return true
  413. }
  414. }
  415. if let value = dict.object(forKey: KMWatermarkKey.text.rawValue) {
  416. if model.text != (value as! String) {
  417. return true
  418. }
  419. }
  420. if let value = dict.object(forKey: KMWatermarkKey.textFontName.rawValue) {
  421. if model.fontName != (value as! String) {
  422. return true
  423. }
  424. }
  425. if let value = dict.object(forKey: KMWatermarkKey.textfontStyle.rawValue) {
  426. if model.fontStyle != (value as! String) {
  427. return true
  428. }
  429. }
  430. if let value = dict.object(forKey: KMWatermarkKey.textFontSize.rawValue) {
  431. if model.fontSize != (value as! CGFloat) {
  432. return true
  433. }
  434. }
  435. if let value = dict.object(forKey: KMWatermarkKey.imagePath.rawValue) {
  436. if model.imagePath != (value as! String) {
  437. return true
  438. }
  439. }
  440. if let value = dict.object(forKey: KMWatermarkKey.isScale.rawValue) {
  441. if model.isScale != (value as! Bool) {
  442. return true
  443. }
  444. }
  445. if let value = dict.object(forKey: KMWatermarkKey.scale.rawValue) {
  446. if model.scale != (value as! CGFloat) {
  447. return true
  448. }
  449. }
  450. if let value = dict.object(forKey: KMWatermarkKey.rotate.rawValue) {
  451. if model.rotation != (value as! CGFloat) {
  452. return true
  453. }
  454. }
  455. if let value = dict.object(forKey: KMWatermarkKey.opacity.rawValue) {
  456. if model.opacity != (value as! CGFloat) {
  457. return true
  458. }
  459. }
  460. if let value = dict.object(forKey: KMWatermarkKey.verticalMode.rawValue) {
  461. if model.verticalPosition.rawValue != (value as! Int) {
  462. return true
  463. }
  464. }
  465. if let value = dict.object(forKey: KMWatermarkKey.verticalSpace.rawValue) {
  466. if model.ty != (value as! CGFloat) {
  467. return true
  468. }
  469. }
  470. if let value = dict.object(forKey: KMWatermarkKey.horizontalMode.rawValue) {
  471. if model.horizontalPosition.rawValue != (value as! Int) {
  472. return true
  473. }
  474. }
  475. if let value = dict.object(forKey: KMWatermarkKey.horizontalSpace.rawValue) {
  476. if model.tx != (value as! CGFloat) {
  477. return true
  478. }
  479. }
  480. if let value = dict.object(forKey: KMWatermarkKey.textColor.rawValue) {
  481. var modelColorText = model.textColor.colorToHexString()
  482. if modelColorText.count > 7 {
  483. modelColorText = modelColorText.substring(to: 7)
  484. }
  485. if var valueString = value as? String {
  486. if valueString.count > 7 {
  487. valueString = valueString.substring(to: 7)
  488. }
  489. if valueString != modelColorText {
  490. return true
  491. }
  492. }
  493. }
  494. if let value = dict.object(forKey: KMWatermarkKey.isFront.rawValue) {
  495. if model.isFront != (value as! Bool) {
  496. return true
  497. }
  498. }
  499. if let value = dict.object(forKey: KMWatermarkKey.isTile.rawValue) {
  500. if model.isTilePage != (value as! Bool) {
  501. return true
  502. }
  503. }
  504. if let value = dict.object(forKey: KMWatermarkKey.tileHorizontalSpace.rawValue) {
  505. if model.horizontalSpacing != (value as! CGFloat) {
  506. return true
  507. }
  508. }
  509. if let value = dict.object(forKey: KMWatermarkKey.tileVerticalSpace.rawValue) {
  510. if model.verticalSpacing != (value as! CGFloat) {
  511. return true
  512. }
  513. }
  514. return false
  515. }
  516. }