KMBatchBaseParameter.swift 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  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?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
  193. var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_SetPassword"
  194. newfileName = newfileName.stringByAppendingPathExtension("pdf")
  195. self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
  196. return self.outPutPath
  197. }
  198. } else if self.isEqual(self.operateFile?.removePasswordInfo) {
  199. if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
  200. var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_RemovePassword"
  201. newfileName = newfileName.stringByAppendingPathExtension("pdf")
  202. self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
  203. return self.outPutPath
  204. }
  205. } else if self.isEqual(self.operateFile?.addWatermarkInfo) {
  206. if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
  207. var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_Watermark"
  208. newfileName = newfileName.stringByAppendingPathExtension("pdf")
  209. self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
  210. return self.outPutPath
  211. }
  212. } else if self.isEqual(self.operateFile?.removeWatermarkInfo) {
  213. if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
  214. var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_RemoveWatermark"
  215. newfileName = newfileName.stringByAppendingPathExtension("pdf")
  216. self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
  217. return self.outPutPath
  218. }
  219. } else if self.isEqual(self.operateFile?.addBackgroundInfo) {
  220. if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
  221. var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_AddBackground"
  222. newfileName = newfileName.stringByAppendingPathExtension("pdf")
  223. self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
  224. return self.outPutPath
  225. }
  226. } else if self.isEqual(self.operateFile?.removeBackgroundInfo) {
  227. if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
  228. var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_RemoveBackground"
  229. newfileName = newfileName.stringByAppendingPathExtension("pdf")
  230. self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
  231. return self.outPutPath
  232. }
  233. } else if self.isEqual(self.operateFile?.addHeaderFooterInfo) {
  234. if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
  235. var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_AddHeaderFooter"
  236. newfileName = newfileName.stringByAppendingPathExtension("pdf")
  237. self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
  238. return self.outPutPath
  239. }
  240. } else if self.isEqual(self.operateFile?.removeHeaderFooterInfo) {
  241. if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
  242. var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_RemoveHeaderFooter"
  243. newfileName = newfileName.stringByAppendingPathExtension("pdf")
  244. self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
  245. return self.outPutPath
  246. }
  247. } else if self.isEqual(self.operateFile?.addBatesInfo) {
  248. if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
  249. var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_AddBates"
  250. newfileName = newfileName.stringByAppendingPathExtension("pdf")
  251. self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
  252. return self.outPutPath
  253. }
  254. } else if self.isEqual(self.operateFile?.removeBatesInfo) {
  255. if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
  256. var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_RemoveBates"
  257. newfileName = newfileName.stringByAppendingPathExtension("pdf")
  258. self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
  259. return self.outPutPath
  260. }
  261. } else if self.isEqual(self.operateFile?.compressInfo) {
  262. if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
  263. var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_Compressed"
  264. newfileName = newfileName.stringByAppendingPathExtension("pdf")
  265. self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
  266. return self.outPutPath
  267. }
  268. }
  269. return nil
  270. }
  271. }