KMBatchBaseParameter.swift 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  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? {
  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 = PDFDocument(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: 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: 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: i))
  63. }
  64. return selectPages
  65. } else {
  66. var pageNumbers: [NSNumber] = []
  67. var isInvalid = false
  68. for c in self.pageRangeString! {
  69. if c != "0" && c != "1" && c != "2" && c != "3" && c != "4" && c != "5" && c != "6" && c != "7" && c != "8" && c != "9" && c != "," && c != "-" {
  70. isInvalid = true
  71. break
  72. } else {
  73. isInvalid = false
  74. }
  75. }
  76. if !isInvalid {
  77. let array = self.pageRangeString!.components(separatedBy: ",")
  78. for s in array {
  79. if s.isEmpty {
  80. isInvalid = true
  81. break
  82. } else {
  83. let pages = s.components(separatedBy: "-")
  84. if pages.count > 2 {
  85. isInvalid = true
  86. break
  87. } else if pages.count == 1 {
  88. let p = pages[0]
  89. if p.isEmpty || Int(p)! > pageNumber || Int(p)! == 0 {
  90. isInvalid = true
  91. break
  92. } else {
  93. var isEqual = false
  94. for pageNumber in pageNumbers {
  95. if pageNumber.intValue == Int(p)! {
  96. isEqual = true
  97. isInvalid = true
  98. break
  99. }
  100. }
  101. if !isEqual {
  102. pageNumbers.append(NSNumber(integerLiteral: Int(p)!))
  103. }
  104. }
  105. } else if pages.count == 2 {
  106. let p1 = pages[0]
  107. let p2 = pages[1]
  108. if p1.isEmpty || p2.isEmpty || Int(p1)! >= Int(p2)! || Int(p2)! > pageNumber || Int(p1)! == 0 {
  109. isInvalid = true
  110. break
  111. } else {
  112. var isEqual = false
  113. for i in Int(p1)!...Int(p2)! {
  114. for pageNumber in pageNumbers {
  115. if pageNumber.intValue == i {
  116. isEqual = true
  117. isInvalid = true
  118. break
  119. }
  120. }
  121. }
  122. if !isEqual {
  123. for i in Int(p1)!...Int(p2)! {
  124. pageNumbers.append(NSNumber(integerLiteral: i))
  125. }
  126. }
  127. }
  128. }
  129. }
  130. }
  131. }
  132. if (self.pageRangeString!.isEmpty) {
  133. isInvalid = true
  134. }
  135. if isInvalid {
  136. return nil
  137. }
  138. QuickSort(list: pageNumbers as! NSMutableArray, startIndex: 0, endIndex: pageNumbers.count - 1)
  139. return pageNumbers
  140. }
  141. }
  142. func QuickSort(list: NSMutableArray, startIndex: NSInteger, endIndex: NSInteger) {
  143. if startIndex >= endIndex {
  144. return
  145. }
  146. let temp = list[startIndex] as! NSNumber
  147. var tempIndex = startIndex
  148. for i in (startIndex + 1)...endIndex {
  149. let t = list[i] as! NSNumber
  150. if temp.intValue > t.intValue {
  151. tempIndex = tempIndex + 1
  152. list.exchangeObject(at: tempIndex, withObjectAt: i)
  153. }
  154. }
  155. list.exchangeObject(at: tempIndex, withObjectAt: startIndex)
  156. QuickSort(list: list, startIndex: startIndex, endIndex: tempIndex-1)
  157. QuickSort(list: list, startIndex: tempIndex+1, endIndex: endIndex)
  158. }
  159. func getUniqueFilePath(filePath: String) -> String {
  160. var i = 0
  161. var isDirectory = ObjCBool(false)
  162. var uniqueFilePath = filePath
  163. let fileManager = FileManager.default
  164. fileManager.fileExists(atPath: uniqueFilePath, isDirectory: &isDirectory)
  165. if isDirectory.boolValue {
  166. while fileManager.fileExists(atPath: uniqueFilePath) {
  167. i += 1
  168. uniqueFilePath = "\(filePath)(\(i))"
  169. }
  170. } else {
  171. while fileManager.fileExists(atPath: uniqueFilePath) {
  172. i += 1
  173. let path = "\(filePath.deletingPathExtension)(\(i))"
  174. uniqueFilePath = path.stringByAppendingPathComponent(filePath.extension)
  175. }
  176. }
  177. return uniqueFilePath
  178. }
  179. func resetState() {
  180. status = .Waiting
  181. progress = 0
  182. error = nil
  183. savePath = nil
  184. outPutPath = nil
  185. }
  186. func fetchDestinationFilepath() -> String? {
  187. if self.isEqual(self.operateFile?.convertInfo) {
  188. // 在子类重写了这个方法,这里永远不会调用,所以不需要写
  189. } else if self.isEqual(self.operateFile?.addPasswordInfo) {
  190. if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
  191. var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_SetPassword"
  192. newfileName = newfileName.stringByAppendingPathExtension("pdf")
  193. self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
  194. return self.outPutPath
  195. }
  196. } else if self.isEqual(self.operateFile?.removePasswordInfo) {
  197. if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
  198. var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_RemovePassword"
  199. newfileName = newfileName.stringByAppendingPathExtension("pdf")
  200. self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
  201. return self.outPutPath
  202. }
  203. } else if self.isEqual(self.operateFile?.addWatermarkInfo) {
  204. if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
  205. var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_Watermark"
  206. newfileName = newfileName.stringByAppendingPathExtension("pdf")
  207. self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
  208. return self.outPutPath
  209. }
  210. } else if self.isEqual(self.operateFile?.removeWatermarkInfo) {
  211. if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
  212. var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_RemoveWatermark"
  213. newfileName = newfileName.stringByAppendingPathExtension("pdf")
  214. self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
  215. return self.outPutPath
  216. }
  217. } else if self.isEqual(self.operateFile?.addBackgroundInfo) {
  218. if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
  219. var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_AddBackground"
  220. newfileName = newfileName.stringByAppendingPathExtension("pdf")
  221. self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
  222. return self.outPutPath
  223. }
  224. } else if self.isEqual(self.operateFile?.removeBackgroundInfo) {
  225. if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
  226. var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_RemoveBackground"
  227. newfileName = newfileName.stringByAppendingPathExtension("pdf")
  228. self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
  229. return self.outPutPath
  230. }
  231. } else if self.isEqual(self.operateFile?.addHeaderFooterInfo) {
  232. if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
  233. var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_AddHeaderFooter"
  234. newfileName = newfileName.stringByAppendingPathExtension("pdf")
  235. self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
  236. return self.outPutPath
  237. }
  238. } else if self.isEqual(self.operateFile?.removeHeaderFooterInfo) {
  239. if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
  240. var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_RemoveHeaderFooter"
  241. newfileName = newfileName.stringByAppendingPathExtension("pdf")
  242. self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
  243. return self.outPutPath
  244. }
  245. } else if self.isEqual(self.operateFile?.addBatesInfo) {
  246. if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
  247. var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_AddBates"
  248. newfileName = newfileName.stringByAppendingPathExtension("pdf")
  249. self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
  250. return self.outPutPath
  251. }
  252. } else if self.isEqual(self.operateFile?.removeBatesInfo) {
  253. if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
  254. var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_RemoveBates"
  255. newfileName = newfileName.stringByAppendingPathExtension("pdf")
  256. self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
  257. return self.outPutPath
  258. }
  259. } else if self.isEqual(self.operateFile?.compressInfo) {
  260. if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
  261. var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_Compressed"
  262. newfileName = newfileName.stringByAppendingPathExtension("pdf")
  263. self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
  264. return self.outPutPath
  265. }
  266. }
  267. return nil
  268. }
  269. }