KMConvertBaseWindowController.swift 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013
  1. //
  2. // KMConvertBaseWindowController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by tangchao on 2022/12/5.
  6. //
  7. import PDFKit
  8. import KMComponentLibrary
  9. typealias KMConvertBaseWindowControllerItemClick = (Int) -> ()
  10. class KMConvertBaseWindowController: KMNBaseWindowController {
  11. @IBOutlet weak var titleLabel: NSTextField!
  12. @IBOutlet weak var leftBox: NSBox!
  13. @IBOutlet weak var prePDFView: KMNPDFPreView?
  14. @IBOutlet weak var numberBox: NSView!
  15. @IBOutlet weak var numberTextField: NSTextField!
  16. @IBOutlet weak var perLabel: NSTextField!
  17. @IBOutlet weak var totalNumberLabel: NSTextField!
  18. @IBOutlet weak var backBox: NSBox!
  19. @IBOutlet weak var nextBox: NSBox!
  20. @IBOutlet weak var rightScrollView: NSScrollView!
  21. @IBOutlet weak var batchButton: NSButton!
  22. @IBOutlet weak var canelBox: NSBox!
  23. @IBOutlet weak var convertBox: NSBox!
  24. @IBOutlet weak var rightBoxHeightConst: NSLayoutConstraint!
  25. private var cancelButton_: ComponentButton?
  26. // var convertButtonVC: KMDesignButton?
  27. private var convertButton_: ComponentButton?
  28. var backButtonVC: KMDesignButton?
  29. var nextButtonVC: KMDesignButton?
  30. var itemClick: KMConvertBaseWindowControllerItemClick?
  31. var documentModel: KMDocumentModel?
  32. var currentPageIndex: Int = 1
  33. var pageRange = KMPageRange.all
  34. var pageRangeString: String = ""
  35. var settingView: KMConvertSettingView?
  36. var subType: Int = 0
  37. var fileExtension: String {
  38. get {
  39. return ""
  40. }
  41. }
  42. var progressController: SKProgressController?
  43. var pdfPreView: KMNPreView?
  44. private var convert: KMPDFConvert?
  45. var limit = true
  46. // 是否限制次数
  47. var limitCount = true
  48. var oriDocumentUrl: URL?
  49. var subscribeWaterMarkType: KMSubscribeWaterMarkType?
  50. deinit {
  51. KMPrint("KMConvertBaseWindowController 已释放")
  52. self.prePDFView?.removeFromSuperview()
  53. self.prePDFView = nil
  54. #if VERSION_DMG
  55. NotificationCenter.default.removeObserver(self)
  56. #endif
  57. }
  58. convenience init() {
  59. self.init(windowNibName: "KMConvertBaseWindowController")
  60. }
  61. override func awakeFromNib() {
  62. super.awakeFromNib()
  63. DispatchQueue.main.async {
  64. self.window?.makeFirstResponder(nil)
  65. }
  66. }
  67. override func windowDidLoad() {
  68. super.windowDidLoad()
  69. // if (self.convertCountIsReach()) {
  70. // Swift.debugPrint("转档次数已达到限制. count: \(self.getConvertCount())")
  71. // }
  72. // #if VERSION_DMG
  73. NotificationCenter.default.addObserver(self, selector: #selector(km_windowWillCloseNotifation), name: NSWindow.willCloseNotification, object: nil)
  74. // #endif
  75. let view = KMNPreView.createFromNib()
  76. leftBox.contentView = view
  77. self.pdfPreView = view
  78. if (self.documentModel != nil) {
  79. // let document = CPDFDocument(url: self.documentModel!.documentURL)
  80. // if (document!.isLocked) {
  81. // document?.unlock(withPassword: self.documentModel!.password)
  82. // }
  83. // self.prePDFView?.document = document!
  84. // self.prePDFView?.setFileUrl(self.documentModel!.documentURL, password: self.documentModel?.password)
  85. pdfPreView?.setFileUrl(self.documentModel!.documentURL, password: self.documentModel?.password)
  86. // let number: Int = Int((self.prePDFView?.document.pageCount)!)
  87. // let string = "\(number)"
  88. // totalNumberLabel.stringValue = string
  89. // self.prePDFView?.go(toPageIndex: self.documentModel!.currentIndex, animated: false)
  90. }
  91. // if (self.prePDFView?.documentView() != nil) {
  92. // self.prePDFView?.documentView().enclosingScrollView?.hasVerticalScroller = false
  93. // self.prePDFView?.documentView().enclosingScrollView?.hasHorizontalScroller = false
  94. // }
  95. // if let pageCount = self.prePDFView?.document.pageCount {
  96. // self.settingView?.pageCount = Int(pageCount)
  97. // }
  98. batchButton.title = NSLocalizedString("Batch", comment: "")
  99. batchButton.isBordered = false
  100. batchButton.wantsLayer = true
  101. batchButton.layer?.borderWidth = 1
  102. batchButton.layer?.cornerRadius = 4
  103. batchButton.target = self
  104. batchButton.action = #selector(batchButtonAction)
  105. batchButton.isHidden = true
  106. self.prePDFView?.currentPageDidChanged = { [weak self] preView, idx in
  107. guard let pdfView = preView?.pdfView else {
  108. return
  109. }
  110. let currentIndex = pdfView.currentPageIndex
  111. self?.currentPageIndex = currentIndex + 1
  112. self?.numberTextField.stringValue = "\(currentIndex+1)"
  113. self?.updateBackAndNextButtonState()
  114. }
  115. self.updateBackAndNextButtonState()
  116. }
  117. override func initSubViews() {
  118. super.initSubViews()
  119. let view = self.initSettingView()
  120. // view?.frame = self.rightScrollView.bounds
  121. // view?.autoresizingMask = [.width, .height]
  122. self.settingView = view
  123. self.rightScrollView.documentView = view
  124. self.rightScrollView.verticalScrollElasticity = .none
  125. self.rightScrollView.horizontalScrollElasticity = .none
  126. view?.km_add_inset_constraint()
  127. view?.currentLanguage = self.getCurrentLanguage()
  128. view?.lanugageDidSelected = { [weak self] value, _ in
  129. guard let index = value as? Int else {
  130. return
  131. }
  132. self?.saveLanugageSelectedIndex(index: index)
  133. }
  134. view?.pageRangeDidChange = { [weak self] pageRange in
  135. self?.pageRange = pageRange
  136. if (pageRange != .custom) {
  137. self?.updatePreView(pageRange: pageRange)
  138. }
  139. }
  140. view?.pageRangeDidInputFinishCallback = { [unowned self] string in
  141. self.pageRangeString = string
  142. let array = self.findSelectPage(pageRangeString: string)
  143. if array.count == 0 {
  144. let alert = NSAlert()
  145. alert.alertStyle = .warning
  146. alert.messageText = NSLocalizedString("Invalid page range or the page number is out of range. Please try again.", comment: "")
  147. alert.runModal()
  148. self.settingView?.pageRangeItemView?.pageSizeVC?.stringValue = ""
  149. } else {
  150. self.updatePreView(pageRange: .custom, pageString: string)
  151. }
  152. }
  153. view?.tipView?.itemClick = { [unowned self] _, _ in
  154. #if VERSION_DMG
  155. KMTools.openPurchaseProductWebsite()
  156. #else
  157. Task { @MainActor in
  158. if await (KMLightMemberManager.manager.canPayFunction() == false) {
  159. let _ = KMSubscribeWaterMarkWindowController.show(window: self.window!) { isSubscribeSuccess, isWaterMarkExport, isClose in
  160. if (isSubscribeSuccess) {
  161. self.refreshUI()
  162. }
  163. }
  164. }
  165. }
  166. #endif
  167. }
  168. self.settingView?.tipView?.isHidden = true
  169. Task { @MainActor in
  170. if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
  171. self.limitCount = true
  172. } else {
  173. self.limitCount = false
  174. }
  175. if await (KMLightMemberManager.manager.canPayFunction() == false) {
  176. #if VERSION_DMG
  177. if (self.limitCount) { // 未登录
  178. self.settingView?.tipView?.isHidden = true
  179. } else {
  180. self.settingView?.tipView?.isHidden = false
  181. }
  182. #else
  183. self.settingView?.tipView?.isHidden = false
  184. #endif
  185. } else {
  186. self.limit = false
  187. }
  188. }
  189. self.backButtonVC = KMDesignButton.init(withType: .Image)
  190. self.backBox.contentView = self.backButtonVC!.view
  191. self.nextButtonVC = KMDesignButton.init(withType: .Image)
  192. self.nextBox.contentView = self.nextButtonVC!.view
  193. cancelButton_ = ComponentButton()
  194. cancelButton_?.properties = ComponentButtonProperty(type: .default_tertiary, size: .s, state: .normal, buttonText: KMLocalizedString("Cancel"))
  195. cancelButton_?.setTarget(self, action: #selector(cancelButtonAction))
  196. self.canelBox.contentView = self.cancelButton_
  197. // self.convertButtonVC = KMDesignButton.init(withType: .Text)
  198. // self.convertBox.contentView = self.convertButtonVC!.view
  199. convertButton_ = ComponentButton()
  200. convertBox.contentView = convertButton_
  201. }
  202. override func initDefaultValue() {
  203. super.initDefaultValue()
  204. self.totalNumberLabel.lineBreakMode = .byTruncatingTail
  205. // self.prePDFView?.setDisplay(.singlePage)
  206. // self.prePDFView?.layoutDocumentView()
  207. // self.prePDFView?.autoScales = true
  208. // self.prePDFView?.delegate = self
  209. self.backBox.fillColor = .clear
  210. self.backButtonVC?.target = self
  211. self.backButtonVC?.action = #selector(backButtonAction)
  212. self.backButtonVC?.image = NSImage(named: "KMImageNamePreviousPageImage")!
  213. self.backButtonVC?.image_disabled = NSImage(named: "KMImageNamePreviousPageImageDisable")!
  214. self.backButtonVC?.pagination()
  215. self.numberBox.wantsLayer = true
  216. self.numberBox.layer?.backgroundColor = NSColor.white.cgColor
  217. self.numberBox.layer?.borderWidth = 1
  218. self.numberBox.layer?.cornerRadius = 4
  219. self.numberTextField.focusRingType = .none
  220. self.numberTextField.delegate = self
  221. self.numberTextField.isBordered = false
  222. self.nextBox.fillColor = .clear
  223. self.nextButtonVC?.target = self
  224. self.nextButtonVC?.action = #selector(nextButtonAction)
  225. self.nextButtonVC?.image = NSImage(named: "KMImageNameNextPageImage")!
  226. self.nextButtonVC?.image_disabled = NSImage(named: "KMImageNameNextPageImageDisable")!
  227. self.nextButtonVC?.pagination()
  228. self.canelBox.fillColor = .clear
  229. // self.canelButtonVC?.button.keyEquivalent = KMKeyEquivalent.esc.string()
  230. self.convertBox.fillColor = .clear
  231. // self.convertButtonVC?.target = self
  232. // self.convertButtonVC?.action = #selector(convertButtonAction)
  233. // self.convertButtonVC?.stringValue = NSLocalizedString("Convert", comment: "")
  234. // self.convertButtonVC?.button(type: .Cta, size: .m)
  235. // convertButtonVC.button.keyEquivalent = KMKeyEquivalent.enter
  236. convertButton_?.properties = ComponentButtonProperty(type: .primary,
  237. size: .s,
  238. state: .normal,
  239. isDisable: false,
  240. buttonText: KMLocalizedString("Convert"))
  241. convertButton_?.setTarget(self, action: #selector(convertButtonAction))
  242. self.rightScrollView.hasVerticalScroller = false
  243. self.rightScrollView.hasHorizontalScroller = false
  244. self.initUIProperty()
  245. }
  246. private func initUIProperty() {
  247. self.titleLabel.textColor = NSColor.titleColor()
  248. self.titleLabel.font = .SFProTextSemiboldFont(16)
  249. self.leftBox.fillColor = NSColor.km_init(hex: "#F7F8FA")
  250. // self.prePDFView?.backgroundColor = NSColor.km_init(hex: "#F7F8FA")
  251. self.numberBox.layer?.borderColor = NSColor.km_init(hex: "#DFE1E5").cgColor
  252. self.perLabel.textColor = NSColor.titleColor()
  253. self.perLabel.font = .SFProTextRegularFont(12)
  254. self.totalNumberLabel.textColor = NSColor.titleColor()
  255. self.totalNumberLabel.font = .SFProTextRegularFont(12)
  256. self.batchButton.setTitleColor(NSColor.buttonTitleColor())
  257. self.batchButton.layer?.borderColor = NSColor.buttonBorderColor().cgColor
  258. self.batchButton.font = .SFProTextRegularFont(14)
  259. }
  260. func initSettingView() -> KMConvertSettingView? {
  261. let settingView = KMConvertSettingView.createFromNib()
  262. return settingView
  263. }
  264. public func initConvert() -> KMPDFConvert {
  265. return KMPDFConvert()
  266. }
  267. func setupContentHeight(height: CGFloat, animated: Bool = false) {
  268. if (animated) {
  269. self.rightBoxHeightConst.animator().constant = height
  270. } else {
  271. self.rightBoxHeightConst.constant = height
  272. }
  273. }
  274. func refreshUI() {
  275. }
  276. @objc func backButtonAction() {
  277. // if let _ = self.prePDFView?.canGoToPreviousPage() {
  278. // self.currentPageIndex -= 1
  279. // self.prePDFView?.goToPreviousPage(nil)
  280. //
  281. // self.numberTextField.stringValue = "\(self.prePDFView!.currentPageIndex+1)"
  282. // self.updateBackAndNextButtonState()
  283. // }
  284. }
  285. @objc func nextButtonAction() {
  286. // if let _ = self.prePDFView?.canGoToNextPage() {
  287. // self.currentPageIndex += 1
  288. // self.prePDFView?.goToNextPage(nil)
  289. //
  290. // self.numberTextField.stringValue = "\(self.prePDFView!.currentPageIndex+1)"
  291. // self.updateBackAndNextButtonState()
  292. // }
  293. }
  294. @objc func batchButtonAction() {
  295. guard let callback = itemClick else {
  296. return
  297. }
  298. callback(1)
  299. }
  300. @objc func cancelButtonAction() {
  301. self._clearData()
  302. guard let callback = itemClick else {
  303. return
  304. }
  305. callback(2)
  306. }
  307. @objc func convertButtonAction() {
  308. self.window?.makeFirstResponder(nil)
  309. if (self.pageRange == .custom) {
  310. let array = self.findSelectPage(pageRangeString: self.pageRangeString)
  311. if (array.count <= 0) {
  312. self.window?.makeFirstResponder(self.settingView?.pageRangeItemView?.pageSizeVC?.textField)
  313. return
  314. }
  315. }
  316. var pages: [Int] = []
  317. let filePath = self.getConvertFileSavePath()
  318. if (FileManager.default.fileExists(atPath: filePath)) {
  319. try?FileManager.default.removeItem(atPath: filePath)
  320. }
  321. // if ((self.prePDFView?.document?.writeDecrypt(to: URL(fileURLWithPath: filePath)))!) {
  322. // for i in 0 ..< self.prePDFView!.document.pageCount {
  323. // pages.append(Int(i)+1)
  324. // }
  325. // }
  326. if (pages.count <= 0) {
  327. let alert = NSAlert()
  328. alert.alertStyle = .warning
  329. alert.messageText = NSLocalizedString("Invalid page range or the page number is out of range. Please try again.", comment: "")
  330. alert.runModal()
  331. return
  332. }
  333. Task { @MainActor in
  334. #if VERSION_DMG
  335. if (await (KMLightMemberManager.manager.canUseAdvanced() == false)) {
  336. let _ = KMComparativeTableViewController.show(window: self.window!, .convert)
  337. return
  338. }
  339. #endif
  340. if await (KMLightMemberManager.manager.canPayFunction() == false) {
  341. var isContinue = false
  342. if pages.count <= 10 {
  343. isContinue = true
  344. }
  345. var limit = self.convertCountIsReach()
  346. if (!self.limitCount) { // 登录
  347. limit = false
  348. }
  349. if (limit) {
  350. isContinue = false
  351. }
  352. let _ = KMSubscribeWaterMarkWindowController.show(window: self.window!, isContinue: isContinue, limit: limit, type: self.subscribeWaterMarkType!) { isSubscribeSuccess, isWaterMarkExport, isClose in
  353. if (isClose) {
  354. return
  355. }
  356. if (isSubscribeSuccess) {
  357. self._convertButtonAction()
  358. return
  359. }
  360. if (isWaterMarkExport && !limit) {
  361. self._convertButtonAction(limit: true)
  362. return
  363. }
  364. }
  365. return
  366. }
  367. self._convertButtonAction()
  368. }
  369. }
  370. func convertModelAppendParams(convert: KMPDFConvert) -> () {
  371. if let isAllowOCR = self.settingView?.ocrEnabled {
  372. convert.isAllowOCR = isAllowOCR
  373. if let idx = self.settingView?.ocrItemView?.languageIndex {
  374. // convert.ocrLanguage = KMPDFConvertManager.defaultManager.languages_asc[idx]
  375. }
  376. } else {
  377. convert.isAllowOCR = false
  378. }
  379. }
  380. func getConvertFileSavePath() -> String {
  381. var path = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.applicationSupportDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last
  382. path?.append("/")
  383. path?.append(Bundle.main.bundleIdentifier!)
  384. if (FileManager.default.fileExists(atPath: path!) == false) {
  385. try?FileManager.default.createDirectory(atPath: path!, withIntermediateDirectories: false)
  386. }
  387. path?.append("/")
  388. path?.append("convert.pdf")
  389. return path!
  390. }
  391. func isValidPagesString(pagesString: String)-> Bool {
  392. var valid = false
  393. for ch in pagesString {
  394. if ch != "0" && ch != "1" && ch != "2" && ch != "3" && ch != "4" && ch != "5" && ch != "6" && ch != "7" && ch != "8" && ch != "9" && ch != "," && ch != "-" {
  395. valid = false
  396. break
  397. } else {
  398. valid = true
  399. }
  400. }
  401. return valid
  402. }
  403. func findSelectPage(pageRangeString: String) -> ([Int]) {
  404. if !isValidPagesString(pagesString: pageRangeString) {
  405. return []
  406. }
  407. var result: [Int] = []
  408. let array = pageRangeString.components(separatedBy: ",")
  409. for string in array {
  410. if string.isEmpty {
  411. return []
  412. } else {
  413. let pages = string .components(separatedBy: "-")
  414. if pages.count > 2 {
  415. return []
  416. } else if pages.count == 1 {
  417. let page = pages[0]
  418. if page.isEmpty || Int(page)! > self.documentModel!.pageCount || Int(page)! == 0 {
  419. return []
  420. } else {
  421. var hasSame: Bool = false
  422. for i in result {
  423. if i == Int(page)! {
  424. hasSame = true
  425. return []
  426. }
  427. }
  428. if !hasSame {
  429. result.append(Int(page)!)
  430. }
  431. }
  432. } else if pages.count == 2 {
  433. let page1 = pages[0]
  434. let page2 = pages[1]
  435. if page1.isEmpty || page2.isEmpty || Int(page1)! >= Int(page2)! || Int(page2)! > self.documentModel!.pageCount || Int(page1)! == 0 {
  436. return []
  437. } else {
  438. var hasSame: Bool = false
  439. for i in Int(page1)! ... Int(page2)! {
  440. for j in result {
  441. if j == i {
  442. hasSame = true
  443. return []
  444. }
  445. }
  446. }
  447. if !hasSame {
  448. for i in Int(page1)! ... Int(page2)! {
  449. result.append(i)
  450. }
  451. }
  452. }
  453. }
  454. }
  455. }
  456. return result
  457. }
  458. // MARK: -
  459. // MARK: Private Methods
  460. private func updateBackAndNextButtonState() {
  461. var nextEnabled = false
  462. // if let result = self.prePDFView?.canGoToNextPage() {
  463. // nextEnabled = result
  464. // }
  465. var backEnabled = false
  466. // if let result = self.prePDFView?.canGoToPreviousPage() {
  467. // backEnabled = result
  468. // }
  469. if (Thread.isMainThread) {
  470. self.backButtonVC?.state = backEnabled ? .Norm : .Disabled
  471. self.nextButtonVC?.state = nextEnabled ? .Norm : .Disabled
  472. } else {
  473. DispatchQueue.main.async {
  474. self.backButtonVC?.state = backEnabled ? .Norm : .Disabled
  475. self.nextButtonVC?.state = nextEnabled ? .Norm : .Disabled
  476. }
  477. }
  478. }
  479. internal func updatePreView(pageRange: KMPageRange, pageString: String = "") {
  480. // let pages = self.getPages(pageRange, pageString: pageString)
  481. // if (pages == nil || pages!.isEmpty) {
  482. // let alert = NSAlert()
  483. // alert.alertStyle = .warning
  484. // alert.messageText = NSLocalizedString("Invalid page range or the page number is out of range. Please try again.", comment: "")
  485. // alert.runModal()
  486. // return
  487. // }
  488. // var indexs = IndexSet()
  489. // for i in 0 ..< self.prePDFView!.document.pageCount {
  490. // indexs.insert(IndexSet.Element(i))
  491. // }
  492. // self.prePDFView?.document.removePage(at: indexs)
  493. //
  494. // #if DEBUG
  495. // let pageIndexs = self.getPageIndexs(pageRange, pageString: pageString)
  496. // if (pageIndexs != nil) {
  497. // for i in pageIndexs! {
  498. //
  499. // KMPrint(i)
  500. // }
  501. // }
  502. // #endif
  503. //// self.prePDFView.document?.importPages(pageIndexs!, from: self.documentModel.document, at: 0)
  504. // for page in pages! {
  505. // self.prePDFView?.document.insertPageObject(page, at: self.prePDFView!.document.pageCount)
  506. // }
  507. // DispatchQueue.main.async {
  508. // self.prePDFView?.layoutDocumentView()
  509. // self.prePDFView?.setNeedsDisplayForVisiblePages()
  510. // self.prePDFView?.goToFirstPage(nil)
  511. //
  512. // let number: Int = Int(self.prePDFView!.document!.pageCount)
  513. // self.totalNumberLabel.stringValue = "\(number)"
  514. // self.currentPageIndex = 1
  515. // self.numberTextField.stringValue = "1"
  516. //
  517. // self.updateBackAndNextButtonState()
  518. // }
  519. }
  520. private func getPageIndexs(_ pageRange: KMPageRange, pageString: String = "") -> IndexSet? {
  521. guard let pageCount = self.documentModel?.pageCount, pageCount > 0 else {
  522. return nil
  523. }
  524. var indexs = IndexSet()
  525. if (pageRange == .all) {
  526. for i in 0 ..< pageCount {
  527. indexs.insert(i)
  528. }
  529. } else if (pageRange == .odd) {
  530. for i in 0 ..< pageCount {
  531. if ((i % 2) == 1) {
  532. continue
  533. }
  534. indexs.insert(i)
  535. }
  536. } else if (pageRange == .even) {
  537. for i in 0 ..< pageCount {
  538. if ((i % 2) == 0) {
  539. continue
  540. }
  541. indexs.insert(i)
  542. }
  543. } else if (pageRange == .current) {
  544. if (self.currentPageIndex >= 1 && self.currentPageIndex <= pageCount) {
  545. indexs.insert(self.currentPageIndex-1)
  546. }
  547. } else if (pageRange == .custom) {
  548. let array = self.findSelectPage(pageRangeString: pageString)
  549. if array.count == 0 {
  550. } else {
  551. for i in 0 ..< array.count {
  552. let index = array[i]
  553. if (index > pageCount || index < 1) {
  554. continue
  555. }
  556. indexs.insert(index-1)
  557. }
  558. }
  559. }
  560. return indexs
  561. }
  562. private func getPages(_ pageRange: KMPageRange, pageString: String = "") -> [CPDFPage]? {
  563. guard let pageCount = self.documentModel?.pageCount, pageCount > 0 else {
  564. return nil
  565. }
  566. var pages: [CPDFPage] = []
  567. if (pageRange == .all) {
  568. for i in 0 ..< pageCount {
  569. let page = self.documentModel!.document?.page(at: UInt(i))
  570. if (page == nil) {
  571. continue
  572. }
  573. pages.append(page!)
  574. }
  575. } else if (pageRange == .odd) {
  576. for i in 0 ..< pageCount {
  577. if ((i % 2) == 1) {
  578. continue
  579. }
  580. let page = self.documentModel!.document?.page(at: UInt(i))
  581. if (page == nil) {
  582. continue
  583. }
  584. pages.append(page!)
  585. }
  586. } else if (pageRange == .even) {
  587. for i in 0 ..< pageCount {
  588. if ((i % 2) == 0) {
  589. continue
  590. }
  591. let page = self.documentModel!.document?.page(at: UInt(i))
  592. if (page == nil) {
  593. continue
  594. }
  595. pages.append(page!)
  596. }
  597. } else if (pageRange == .current) {
  598. // let page = self.prePDFView?.currentPage()
  599. // if (page != nil) {
  600. // pages.append(page!)
  601. // }
  602. } else if (pageRange == .custom) {
  603. let array = self.findSelectPage(pageRangeString: pageString)
  604. if array.count == 0 {
  605. } else {
  606. for i in 0 ..< array.count {
  607. let index = array[i]
  608. if (index > pageCount || index < 1) {
  609. continue
  610. }
  611. let page = self.documentModel?.document?.page(at: UInt(index-1))
  612. if (page == nil) {
  613. continue
  614. }
  615. pages.append(page!)
  616. }
  617. }
  618. }
  619. return pages
  620. }
  621. private func _convertButtonAction(limit: Bool = false) {
  622. var pages: [Int] = []
  623. let filePath = self.getConvertFileSavePath()
  624. if (FileManager.default.fileExists(atPath: filePath)) {
  625. try?FileManager.default.removeItem(atPath: filePath)
  626. }
  627. if (limit) {
  628. // if let _ = KMTools.saveWatermarkDocument(document: self.prePDFView!.document, to: URL(fileURLWithPath: filePath), removePWD: true) {
  629. // for i in 0 ..< self.prePDFView!.document.pageCount {
  630. // if (i >= 10) {
  631. // break
  632. // }
  633. // pages.append(Int(i)+1)
  634. // }
  635. // }
  636. } else {
  637. // if ((self.prePDFView?.document?.writeDecrypt(to: URL(fileURLWithPath: filePath)))!) {
  638. // for i in 0 ..< self.prePDFView!.document.pageCount {
  639. // pages.append(Int(i)+1)
  640. // }
  641. // }
  642. }
  643. if (pages.count <= 0) {
  644. let alert = NSAlert()
  645. alert.alertStyle = .warning
  646. alert.messageText = NSLocalizedString("Invalid page range or the page number is out of range. Please try again.", comment: "")
  647. alert.runModal()
  648. return
  649. }
  650. DispatchQueue.main.async {
  651. NSPanel.savePanel(self.window!) { panel in
  652. // var url: URL = self.prePDFView!.document.documentURL
  653. // if (self.oriDocumentUrl != nil) {
  654. // url = self.oriDocumentUrl!
  655. // }
  656. // let name = url.deletingPathExtension().lastPathComponent
  657. // panel.nameFieldStringValue = name
  658. // panel.allowedFileTypes = [self.fileExtension]
  659. } completion: { response, url in
  660. if (response == .cancel) {
  661. return
  662. }
  663. let outputFolderPath = url!.deletingLastPathComponent().path
  664. let convert = self.initConvert()
  665. self.convert = convert
  666. convert.password = self.documentModel!.password
  667. convert.outputFolderPath = outputFolderPath
  668. convert.filePath = filePath
  669. convert.pages = pages
  670. var fileName = url!.deletingPathExtension().lastPathComponent
  671. if (self.fileExtension.isEmpty) {
  672. fileName = url!.lastPathComponent
  673. }
  674. // if (fileName.isEmpty) {
  675. // fileName = NSLocalizedString("Untitled", comment: "")
  676. // }
  677. convert.outputFileName = fileName
  678. self.convertModelAppendParams(convert: convert)
  679. DispatchQueue.main.async {
  680. self.showProgressWindow()
  681. self.progressController?.maxValue = Double(convert.pages.count)
  682. }
  683. #if VERSION_DMG
  684. if self.settingView?.ocrItemView?.checkVC?.state == .Checked {
  685. let bundlePath = kResourcePath?.stringByAppendingPathComponent("DocumentAI.bundle")
  686. CPDFConvertKit.setOCRModelPath(bundlePath)
  687. }
  688. #else
  689. let bundlePath = Bundle.main.path(forResource: "DocumentAI", ofType: "bundle")
  690. CPDFConvertKit.setOCRModelPath(bundlePath)
  691. #endif
  692. DispatchQueue.global().async {
  693. KMPDFConvertManager.defaultManager.convert(convert: convert, progress: { index in
  694. DispatchQueue.main.async {
  695. self.progressController?.increment(by: 1.0)
  696. }
  697. }) { [unowned self] finished, error in
  698. self.hiddenProgressWindow()
  699. // 清除临时文件
  700. if (FileManager.default.fileExists(atPath: filePath)) {
  701. try?FileManager.default.removeItem(atPath: filePath)
  702. }
  703. if finished {
  704. self._clearData()
  705. self.recordConvertCount()
  706. cancelButtonAction()
  707. if FileManager.default.fileExists(atPath: convert.outputFilePath) {
  708. NSWorkspace.shared.activateFileViewerSelecting([URL(fileURLWithPath: convert.outputFilePath)])
  709. }
  710. } else {
  711. var errorString = ""
  712. let myError: NSError? = error as? NSError
  713. if myError?.code == 1 {
  714. errorString = NSLocalizedString("Password required or incorrect password. Please re-enter your password and try again", comment: "")
  715. } else if myError?.code == 2 {
  716. errorString = NSLocalizedString("The license doesn't allow the permission", comment: "")
  717. } else if myError?.code == 3 {
  718. errorString = NSLocalizedString("Malloc failure", comment: "")
  719. } else if myError?.code == 4 {
  720. errorString = NSLocalizedString("Unknown error in processing conversion. Please try again later", comment: "")
  721. } else if myError?.code == 5 {
  722. errorString = NSLocalizedString("Unknown error in processing PDF. Please try again later", comment: "")
  723. } else if myError?.code == 6 {
  724. errorString = NSLocalizedString("File not found or could not be opened. Check if your file exists or choose another file to convert", comment: "")
  725. } else if myError?.code == 7 {
  726. errorString = NSLocalizedString("File not in PDF format or corruptead. Change a PDF file and try again", comment: "")
  727. } else if myError?.code == 8 {
  728. errorString = NSLocalizedString("Unsupported security scheme", comment: "")
  729. } else if myError?.code == 9 {
  730. errorString = NSLocalizedString("Page not found or content error", comment: "")
  731. } else {
  732. errorString = NSLocalizedString("Table not found", comment: "")
  733. }
  734. let alert = NSAlert()
  735. alert.alertStyle = .critical
  736. alert.messageText = NSLocalizedString("Conversion Failed", comment: "")
  737. alert.informativeText = errorString
  738. alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
  739. alert.runModal()
  740. }
  741. }
  742. }
  743. }
  744. }
  745. }
  746. // MARK: - Notifation Methods
  747. @objc private func km_windowWillCloseNotifation() {
  748. Task { @MainActor in
  749. if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
  750. self.limitCount = true
  751. } else {
  752. self.limitCount = false
  753. }
  754. if await (KMLightMemberManager.manager.canPayFunction() == false) {
  755. #if VERSION_DMG
  756. if (self.limitCount) { // 未登录
  757. self.settingView?.tipView?.isHidden = true
  758. } else {
  759. self.settingView?.tipView?.isHidden = false
  760. }
  761. #else
  762. self.settingView?.tipView?.isHidden = false
  763. #endif
  764. } else {
  765. self.limit = false
  766. }
  767. }
  768. }
  769. // MARK: Progress
  770. func showProgressWindow() {
  771. self.hiddenProgressWindow()
  772. let progress = SKProgressController()
  773. progress.window?.backgroundColor = NSColor.km_init(hex: "#36383B")
  774. progress.window?.contentView?.wantsLayer = true
  775. progress.window?.contentView?.layer?.backgroundColor = NSColor.km_init(hex: "#36383B").cgColor
  776. progress.progressField.textColor = NSColor.white
  777. progress.message = NSLocalizedString("Converting...", comment: "")
  778. progress.closeBlock = { [weak self] in
  779. if let convert = self?.convert {
  780. KMPDFConvertManager.defaultManager.cancel(convert: convert)
  781. }
  782. }
  783. self.progressController = progress
  784. self.window?.beginSheet(progress.window!)
  785. }
  786. func hiddenProgressWindow() {
  787. if (self.progressController != nil) {
  788. self.window?.endSheet((self.progressController?.window)!)
  789. self.progressController = nil
  790. }
  791. }
  792. func getCurrentLanguage() -> String {
  793. // return Bundle.main.preferredLocalizations.first!
  794. let array: [String] = UserDefaults.standard.object(forKey: "AppleLanguages") as! [String]
  795. return array.first!
  796. }
  797. /// 存储用户的选择的语言
  798. func saveLanugageSelectedIndex(index: Int) {
  799. UserDefaults.standard.setValue("\(index)", forKey: kKMConvertLanugageSelectedIndex)
  800. UserDefaults.standard.synchronize()
  801. }
  802. private func _clearData() {
  803. if let _ = self.oriDocumentUrl {
  804. // if let data = self.prePDFView?.document.documentURL.path, FileManager.default.fileExists(atPath: data) {
  805. // try?FileManager.default.removeItem(atPath: data)
  806. // }
  807. }
  808. }
  809. }
  810. extension KMConvertBaseWindowController: NSTextFieldDelegate {
  811. func controlTextDidChange(_ obj: Notification) {
  812. if numberTextField.isEqual(to: obj.object) {
  813. let textField: NSTextField = obj.object as! NSTextField
  814. var value: String = ""
  815. for ch in textField.stringValue {
  816. if ch != "0" && ch != "1" && ch != "2" && ch != "3" && ch != "4" && ch != "5" && ch != "6" && ch != "7" && ch != "8" && ch != "9" {
  817. } else {
  818. if value.isEmpty && ch == "0" {
  819. } else {
  820. value.append(ch)
  821. }
  822. }
  823. }
  824. if value.isEmpty {
  825. value.append("1")
  826. } else {
  827. // if Int(value)! <= 0 {
  828. // value = "1"
  829. // } else if Int(value)! > self.prePDFView!.document!.pageCount {
  830. // let number: Int = Int(self.prePDFView!.document!.pageCount)
  831. // value = "\(number)"
  832. // }
  833. }
  834. numberTextField.stringValue = value
  835. }
  836. }
  837. func controlTextDidEndEditing(_ obj: Notification) {
  838. if numberTextField.isEqual(to: obj.object) {
  839. if (numberTextField.stringValue.isEmpty) {
  840. numberTextField.stringValue = "1"
  841. // self.prePDFView?.go(toPageIndex: 0, animated: false)
  842. self.currentPageIndex = 1
  843. self.updateBackAndNextButtonState()
  844. return
  845. }
  846. let number: Int = Int(numberTextField.stringValue)!
  847. // if number > 0 && number <= self.prePDFView!.document!.pageCount {
  848. // guard let page = self.prePDFView?.document?.page(at: UInt(number-1)) else {
  849. // return
  850. // }
  851. // self.prePDFView?.go(to: page)
  852. // currentPageIndex = number
  853. //
  854. // self.updateBackAndNextButtonState()
  855. // }
  856. }
  857. }
  858. }
  859. let kKMConvertCountKey = "KMConvertCountKey"
  860. let kKMConvertCountMax = 2
  861. extension KMConvertBaseWindowController {
  862. func convertCountIsReach() -> Bool {
  863. #if VERSION_DMG
  864. return false
  865. #else
  866. let cnt = self.getConvertCount()
  867. if (cnt >= kKMConvertCountMax) {
  868. return true
  869. }
  870. return false
  871. #endif
  872. }
  873. func recordConvertCount() {
  874. let cnt = self.getConvertCount()
  875. UserDefaults.standard.setValue(cnt+1, forKey: kKMConvertCountKey)
  876. UserDefaults.standard.synchronize()
  877. }
  878. func clearConvertRecordCount() {
  879. UserDefaults.standard.setValue(0, forKey: kKMConvertCountKey)
  880. UserDefaults.standard.synchronize()
  881. }
  882. private func getConvertCount() -> Int {
  883. return UserDefaults.standard.integer(forKey: kKMConvertCountKey)
  884. }
  885. }