KMBatchBaseParameter.swift 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. //
  2. // KMBatchBaseParameter.swift
  3. // PDF Master
  4. //
  5. // Created by kdanmobile on 2023/10/25.
  6. //
  7. import Cocoa
  8. @objcMembers class KMBatchBaseParameter: NSObject{
  9. var error: NSError?
  10. var operateFile: KMBatchOperateFile?
  11. var pageChoice: KMBatchOperatePageChoice = .All {
  12. willSet{
  13. }
  14. didSet {
  15. if pageChoice != oldValue {
  16. self.localPagesArray = nil
  17. }
  18. }
  19. }
  20. var pageRangeString: String? {
  21. willSet{
  22. }
  23. didSet {
  24. if pageRangeString != oldValue {
  25. self.localPagesArray = nil
  26. }
  27. }
  28. }
  29. var progress: Float?
  30. var status: KMBatchOperateStatus = .Waiting
  31. var savePath: String?
  32. var outPutPath: String?
  33. var pagesArray: [NSNumber]? {
  34. if self.localPagesArray == nil {
  35. self.localPagesArray = self.fetchUnlimitPagesArray()
  36. }
  37. return self.localPagesArray
  38. }
  39. private var localPagesArray: [NSNumber]?
  40. init(file:KMBatchOperateFile) {
  41. super.init()
  42. self.operateFile = file
  43. }
  44. func fetchUnlimitPagesArray() -> [NSNumber]? {
  45. let document = CPDFDocument(url: URL(fileURLWithPath: self.operateFile?.filePath ?? ""))
  46. let pageNumber = document?.pageCount ?? 0
  47. if self.pageChoice == .All {
  48. var selectPages: [NSNumber] = []
  49. for i in 1...pageNumber {
  50. selectPages.append(NSNumber(integerLiteral: Int(i)))
  51. }
  52. return selectPages
  53. } else if self.pageChoice == .Odd {
  54. var selectPages: [NSNumber] = []
  55. for i in stride(from: 1, through: pageNumber, by: 2) {
  56. selectPages.append(NSNumber(integerLiteral: Int(i)))
  57. }
  58. return selectPages
  59. } else if self.pageChoice == .Even {
  60. var selectPages: [NSNumber] = []
  61. for i in stride(from: 2, through: pageNumber, by: 2) {
  62. selectPages.append(NSNumber(integerLiteral: Int(i)))
  63. }
  64. return selectPages
  65. } else {
  66. var pageNumbers: [NSNumber] = []
  67. var isInvalid = false
  68. if self.pageRangeString?.count ?? 0 > 0{
  69. for c in self.pageRangeString! {
  70. if c != "0" && c != "1" && c != "2" && c != "3" && c != "4" && c != "5" && c != "6" && c != "7" && c != "8" && c != "9" && c != "," && c != "-" {
  71. isInvalid = true
  72. break
  73. } else {
  74. isInvalid = false
  75. }
  76. }
  77. }
  78. if !isInvalid {
  79. let array = self.pageRangeString!.components(separatedBy: ",")
  80. for s in array {
  81. if s.isEmpty {
  82. isInvalid = true
  83. break
  84. } else {
  85. let pages = s.components(separatedBy: "-")
  86. if pages.count > 2 {
  87. isInvalid = true
  88. break
  89. } else if pages.count == 1 {
  90. let p = pages[0]
  91. if p.isEmpty || Int(p)! > pageNumber || Int(p)! == 0 {
  92. isInvalid = true
  93. break
  94. } else {
  95. var isEqual = false
  96. for pageNumber in pageNumbers {
  97. if pageNumber.intValue == Int(p)! {
  98. isEqual = true
  99. isInvalid = true
  100. break
  101. }
  102. }
  103. if !isEqual {
  104. pageNumbers.append(NSNumber(integerLiteral: Int(p)!))
  105. }
  106. }
  107. } else if pages.count == 2 {
  108. let p1 = pages[0]
  109. let p2 = pages[1]
  110. if p1.isEmpty || p2.isEmpty || Int(p1)! >= Int(p2)! || Int(p2)! > pageNumber || Int(p1)! == 0 {
  111. isInvalid = true
  112. break
  113. } else {
  114. var isEqual = false
  115. for i in Int(p1)!...Int(p2)! {
  116. for pageNumber in pageNumbers {
  117. if pageNumber.intValue == i {
  118. isEqual = true
  119. isInvalid = true
  120. break
  121. }
  122. }
  123. }
  124. if !isEqual {
  125. for i in Int(p1)!...Int(p2)! {
  126. pageNumbers.append(NSNumber(integerLiteral: i))
  127. }
  128. }
  129. }
  130. }
  131. }
  132. }
  133. }
  134. if (self.pageRangeString!.isEmpty) {
  135. isInvalid = true
  136. }
  137. if isInvalid {
  138. return nil
  139. }
  140. QuickSort(list: pageNumbers as! NSMutableArray, startIndex: 0, endIndex: pageNumbers.count - 1)
  141. return pageNumbers
  142. }
  143. }
  144. func QuickSort(list: NSMutableArray, startIndex: NSInteger, endIndex: NSInteger) {
  145. if startIndex >= endIndex {
  146. return
  147. }
  148. let temp = list[startIndex] as! NSNumber
  149. var tempIndex = startIndex
  150. for i in (startIndex + 1)...endIndex {
  151. let t = list[i] as! NSNumber
  152. if temp.intValue > t.intValue {
  153. tempIndex = tempIndex + 1
  154. list.exchangeObject(at: tempIndex, withObjectAt: i)
  155. }
  156. }
  157. list.exchangeObject(at: tempIndex, withObjectAt: startIndex)
  158. QuickSort(list: list, startIndex: startIndex, endIndex: tempIndex-1)
  159. QuickSort(list: list, startIndex: tempIndex+1, endIndex: endIndex)
  160. }
  161. func getUniqueFilePath(filePath: String) -> String {
  162. var i = 0
  163. var isDirectory = ObjCBool(false)
  164. var uniqueFilePath = filePath
  165. let fileManager = FileManager.default
  166. fileManager.fileExists(atPath: uniqueFilePath, isDirectory: &isDirectory)
  167. if isDirectory.boolValue {
  168. while fileManager.fileExists(atPath: uniqueFilePath) {
  169. i += 1
  170. uniqueFilePath = "\(filePath)(\(i))"
  171. }
  172. } else {
  173. while fileManager.fileExists(atPath: uniqueFilePath) {
  174. i += 1
  175. let path = "\(filePath.deletingPathExtension)(\(i))"
  176. uniqueFilePath = path.stringByAppendingPathComponent(filePath.extension)
  177. }
  178. }
  179. return uniqueFilePath
  180. }
  181. func resetState() {
  182. status = .Waiting
  183. progress = 0
  184. error = nil
  185. savePath = nil
  186. outPutPath = nil
  187. }
  188. func fetchDestinationFilepath() -> String? {
  189. if self.isEqual(self.operateFile?.convertInfo) {
  190. // 在子类重写了这个方法,这里永远不会调用,所以不需要写
  191. } else if self.isEqual(self.operateFile?.addPasswordInfo) {
  192. if self.savePath?.count ?? 0 > 0 && self.operateFile?.filePath.count ?? 0 > 0 {
  193. let filePath1 = self.savePath?.stringByAppendingPathComponent(self.operateFile!.filePath.getLastComponentDeleteExtension + "_SetPassword")
  194. self.outPutPath = self.getUniqueFilePath(filePath: filePath1!.stringByAppendingPathExtension("pdf"))
  195. return self.outPutPath
  196. }
  197. } else if self.isEqual(self.operateFile?.removePasswordInfo) {
  198. if self.savePath?.count ?? 0 > 0 && self.operateFile?.filePath.count ?? 0 > 0 {
  199. let filePath1 = self.savePath?.stringByAppendingPathComponent(self.operateFile!.filePath.getLastComponentDeleteExtension + "_RemovePassword")
  200. self.outPutPath = self.getUniqueFilePath(filePath: filePath1!.stringByAppendingPathExtension("pdf"))
  201. return self.outPutPath
  202. }
  203. } else if self.isEqual(self.operateFile?.addWatermarkInfo) {
  204. if self.savePath?.count ?? 0 > 0 && self.operateFile?.filePath.count ?? 0 > 0 {
  205. let filePath1 = self.savePath?.stringByAppendingPathComponent(self.operateFile!.filePath.getLastComponentDeleteExtension + "_Watermark")
  206. self.outPutPath = self.getUniqueFilePath(filePath: filePath1!.stringByAppendingPathExtension("pdf"))
  207. return self.outPutPath
  208. }
  209. } else if self.isEqual(self.operateFile?.removeWatermarkInfo) {
  210. if self.savePath?.count ?? 0 > 0 && self.operateFile?.filePath.count ?? 0 > 0 {
  211. let filePath1 = self.savePath?.stringByAppendingPathComponent(self.operateFile!.filePath.getLastComponentDeleteExtension + "_RemoveWatermark")
  212. self.outPutPath = self.getUniqueFilePath(filePath: filePath1!.stringByAppendingPathExtension("pdf"))
  213. return self.outPutPath
  214. }
  215. } else if self.isEqual(self.operateFile?.addBackgroundInfo) {
  216. if self.savePath?.count ?? 0 > 0 && self.operateFile?.filePath.count ?? 0 > 0 {
  217. let filePath1 = self.savePath?.stringByAppendingPathComponent(self.operateFile!.filePath.getLastComponentDeleteExtension + "_AddBackground")
  218. self.outPutPath = self.getUniqueFilePath(filePath: filePath1!.stringByAppendingPathExtension("pdf"))
  219. return self.outPutPath
  220. }
  221. } else if self.isEqual(self.operateFile?.removeBackgroundInfo) {
  222. if self.savePath?.count ?? 0 > 0 && self.operateFile?.filePath.count ?? 0 > 0 {
  223. let filePath1 = self.savePath?.stringByAppendingPathComponent(self.operateFile!.filePath.getLastComponentDeleteExtension + "_RemoveBackground")
  224. self.outPutPath = self.getUniqueFilePath(filePath: filePath1!.stringByAppendingPathExtension("pdf"))
  225. return self.outPutPath
  226. }
  227. } else if self.isEqual(self.operateFile?.addHeaderFooterInfo) {
  228. if self.savePath?.count ?? 0 > 0 && self.operateFile?.filePath.count ?? 0 > 0 {
  229. let filePath1 = self.savePath?.stringByAppendingPathComponent(self.operateFile!.filePath.getLastComponentDeleteExtension + "_AddHeaderFooter")
  230. self.outPutPath = self.getUniqueFilePath(filePath: filePath1!.stringByAppendingPathExtension("pdf"))
  231. return self.outPutPath
  232. }
  233. } else if self.isEqual(self.operateFile?.removeHeaderFooterInfo) {
  234. if self.savePath?.count ?? 0 > 0 && self.operateFile?.filePath.count ?? 0 > 0 {
  235. let filePath1 = self.savePath?.stringByAppendingPathComponent(self.operateFile!.filePath.getLastComponentDeleteExtension + "_RemoveHeaderFooter")
  236. self.outPutPath = self.getUniqueFilePath(filePath: filePath1!.stringByAppendingPathExtension("pdf"))
  237. return self.outPutPath
  238. }
  239. } else if self.isEqual(self.operateFile?.addBatesInfo) {
  240. if self.savePath?.count ?? 0 > 0 && self.operateFile?.filePath.count ?? 0 > 0 {
  241. let filePath1 = self.savePath?.stringByAppendingPathComponent(self.operateFile!.filePath.getLastComponentDeleteExtension + "_AddBates")
  242. self.outPutPath = self.getUniqueFilePath(filePath: filePath1!.stringByAppendingPathExtension("pdf"))
  243. return self.outPutPath
  244. }
  245. } else if self.isEqual(self.operateFile?.removeBatesInfo) {
  246. if self.savePath?.count ?? 0 > 0 && self.operateFile?.filePath.count ?? 0 > 0 {
  247. let filePath1 = self.savePath?.stringByAppendingPathComponent(self.operateFile!.filePath.getLastComponentDeleteExtension + "_RemoveBates")
  248. self.outPutPath = self.getUniqueFilePath(filePath: filePath1!.stringByAppendingPathExtension("pdf"))
  249. return self.outPutPath
  250. }
  251. } else if self.isEqual(self.operateFile?.compressInfo) {
  252. if self.savePath?.count ?? 0 > 0 && self.operateFile?.filePath.count ?? 0 > 0 {
  253. let filePath1 = self.savePath?.stringByAppendingPathComponent(self.operateFile!.filePath.getLastComponentDeleteExtension + "_Compressed")
  254. self.outPutPath = self.getUniqueFilePath(filePath: filePath1!.stringByAppendingPathExtension("pdf"))
  255. return self.outPutPath
  256. }
  257. }
  258. return nil
  259. }
  260. }