KMConvertWindowController.swift 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033
  1. //
  2. // KMConvertWindowController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by liujiajie on 2023/11/8.
  6. //
  7. import Cocoa
  8. typealias convertBatchCallBack = () -> Void
  9. let kPreviewMaxWidth = 237.0
  10. let kPreviewMaxHeight = 325.0
  11. let kConvertFileSavePath = (kTempSavePath?.stringByAppendingPathComponent("convert.pdf"))
  12. @objcMembers class KMConvertWindowController: NSWindowController, NSTextFieldDelegate, NSWindowDelegate{
  13. @IBOutlet var prePDFViewHeight: NSLayoutConstraint!
  14. @IBOutlet var prePDFViewWidth: NSLayoutConstraint!
  15. var prePDFView: CPDFView!
  16. @IBOutlet var prePdfBGView: NSView!
  17. @IBOutlet var currentPageIndexTextField: NSTextField!
  18. @IBOutlet var totalPageCountLabel: NSTextField!
  19. @IBOutlet var formatLabel: NSTextField!
  20. @IBOutlet var formatSelectButton: NSPopUpButton!
  21. @IBOutlet var imageDPISelectButton: NSPopUpButton!
  22. @IBOutlet var moreButton: NSButton!
  23. @IBOutlet var buttonBottemOffset: NSLayoutConstraint!
  24. @IBOutlet var buttonTopOffset: NSLayoutConstraint!
  25. @IBOutlet var moreConvertBox: NSBox!
  26. @IBOutlet var moreConvertLabel: NSTextField!
  27. @IBOutlet var pageRangLabel: NSTextField!
  28. @IBOutlet var allPageButton: NSButton!
  29. @IBOutlet var currentPageButton: NSButton!
  30. @IBOutlet var oddPageButton: NSButton!
  31. @IBOutlet var evenPageButton: NSButton!
  32. @IBOutlet var handInputButton: NSButton!
  33. @IBOutlet var pageRangeTextField: NSTextField!
  34. @IBOutlet var convertButton: NSButton!
  35. @IBOutlet var cancelButton: NSButton!
  36. @IBOutlet var batchButton: NSButton!
  37. @IBOutlet var upgradeButton: NSButton!
  38. @IBOutlet var separateStypeTopOffset: NSLayoutConstraint!
  39. @IBOutlet var separateButton: NSButton!
  40. @IBOutlet var singleButton: NSButton!
  41. @IBOutlet var separateStypeBox: NSBox!
  42. @IBOutlet var extractTableButton: NSButton!
  43. @IBOutlet var extractTableTopOffset: NSLayoutConstraint!
  44. @IBOutlet var separateStypeLabel: NSTextField!
  45. @IBOutlet var excelStyleBox: NSBox!
  46. @IBOutlet var onlyTextBtn: NSButton!
  47. @IBOutlet var onlyTableBtn: NSButton!
  48. @IBOutlet var allContentBtn: NSButton!
  49. @IBOutlet var tableMenu1: NSMenuItem!
  50. @IBOutlet var tableMenu2: NSMenuItem!
  51. @IBOutlet var tableMenu3: NSMenuItem!
  52. @IBOutlet var allContentMenu2: NSMenuItem!
  53. @IBOutlet var allContentMenu3: NSMenuItem!
  54. @IBOutlet var tableMenu: NSPopUpButton!
  55. @IBOutlet var allContentMenu: NSPopUpButton!
  56. @IBOutlet var box: NSBox!
  57. var isAllInOneSheet = false
  58. var modalSession: NSApplication.ModalSession?
  59. var pdfDocument: CPDFDocument?
  60. var maskView: KMBookletMaskView?
  61. var convertType: KMConvertType = .Word
  62. var imageDPINumber: Int = 0
  63. var callBackBlock: convertBatchCallBack?
  64. var currentPage: CPDFPage?
  65. var savePath: String = ""
  66. var lockPassword: String = ""
  67. var tempPDFDocument: CPDFDocument?
  68. var excelContentOption: CPDFConvertExcelContentOptions?
  69. var excelWorksheetOption: CPDFConvertExcelWorksheetOptions?
  70. private var fileAttri_: KMFileAttribute?
  71. convenience init(documemtV:CPDFDocument, currentPage:CPDFPage, convertT:KMConvertType, handle:@escaping convertBatchCallBack) {
  72. self.init(windowNibName: "KMConvertWindowController")
  73. if (documemtV.documentURL != nil) {
  74. let pageIndex = documemtV.index(for: currentPage)
  75. self.pdfDocument = CPDFDocument(url: documemtV.documentURL)
  76. let isLoc: Bool = self.pdfDocument!.isLocked
  77. if (!documemtV.isLocked && isLoc) {
  78. self.lockPassword = documemtV.password
  79. self.pdfDocument?.unlock(withPassword: self.lockPassword)
  80. }
  81. self.currentPage = self.pdfDocument?.page(at: pageIndex )
  82. } else {
  83. self.pdfDocument = documemtV
  84. self.currentPage = currentPage
  85. }
  86. self.callBackBlock = handle
  87. if convertT.rawValue > 15 || convertT.rawValue < 0 {
  88. self.convertType = .Word
  89. } else {
  90. self.convertType = convertT
  91. }
  92. }
  93. convenience init(localPath:String, handle:@escaping convertBatchCallBack) {
  94. self.init(windowNibName: "KMConvertWindowController")
  95. self.pdfDocument = CPDFDocument(url: URL(fileURLWithPath: localPath))
  96. self.callBackBlock = handle
  97. let isLoc: Bool = self.pdfDocument!.isLocked
  98. if (isLoc) {
  99. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.5) {
  100. let url = self.pdfDocument?.documentURL
  101. KMBaseWindowController.checkPassword(url: url!, type: .owner) { [unowned self] success, resultPassword in
  102. if success {
  103. self.lockPassword = resultPassword
  104. self.pdfDocument?.unlock(withPassword: resultPassword)
  105. self.currentPage = self.pdfDocument?.page(at: 0)
  106. self.convertType = .Word
  107. }
  108. }
  109. }
  110. }
  111. }
  112. override func windowDidLoad() {
  113. super.windowDidLoad()
  114. let preView: CPDFView = CPDFView(frame: self.prePdfBGView.bounds)
  115. self.prePdfBGView.addSubview(preView)
  116. self.prePDFView = preView
  117. self.box.fillColor = .gridColor
  118. localizedLanguage()
  119. self.currentPageIndexTextField.delegate = self;
  120. self.pageRangeTextField.delegate = self;
  121. let isLoc: Bool = self.pdfDocument!.isLocked
  122. if (isLoc) {
  123. self.showWaitting()
  124. DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
  125. let url = URL(fileURLWithPath: self.pdfDocument!.documentURL.path)
  126. KMBaseWindowController.checkPassword(url: url, type: .owner) { result, password in
  127. self.hideWaitting()
  128. if password.count > 0 {
  129. let unlockSuccess: Bool = ((self.pdfDocument?.unlock(withPassword: password)) != nil)
  130. self.lockPassword = password
  131. if unlockSuccess {
  132. self.currentPage = self.pdfDocument?.page(at: 0)
  133. }
  134. self.configuView()
  135. } else {
  136. self.buttonClicked_Cancel(self.cancelButton)
  137. }
  138. }
  139. }
  140. } else {
  141. self.configuView()
  142. }
  143. if #available(macOS 10.14, *) {
  144. let appearanceName = NSApp.effectiveAppearance.bestMatch(from: [.aqua, .darkAqua])
  145. if appearanceName == .darkAqua {
  146. moreConvertLabel.textColor = NSColor.white
  147. }
  148. }
  149. isAllInOneSheet = false
  150. separateButton.state = .on
  151. singleButton.state = .off
  152. allPageButton.state = .on
  153. allContentBtn.state = .on
  154. allContentMenu.isEnabled = true
  155. tableMenu.isEnabled = false
  156. excelContentOption = .allContent
  157. excelWorksheetOption = .forEachPage
  158. }
  159. func windowShouldClose(_ sender: NSWindow) -> Bool {
  160. self.dismissSheet(self.cancelButton)
  161. return true
  162. }
  163. func localizedLanguage() {
  164. formatLabel.stringValue = KMLocalizedString("Format:", nil)
  165. separateButton.title = KMLocalizedString("Convert each page to a separate worksheet", nil)
  166. singleButton.title = KMLocalizedString("Convert all pages to a single worksheet", nil)
  167. box.title = KMLocalizedString("Page Range:", nil)
  168. separateStypeLabel.stringValue = KMLocalizedString("Excel Worksheet Settings", nil)
  169. extractTableButton.title = KMLocalizedString("Extract Tables Only", nil)
  170. allPageButton.title = KMLocalizedString("All Pages", nil)
  171. currentPageButton.title = KMLocalizedString("Current Page", nil)
  172. oddPageButton.title = KMLocalizedString("Odd Pages Only", nil)
  173. evenPageButton.title = KMLocalizedString("Even Pages Only", nil)
  174. pageRangeTextField.placeholderString = KMLocalizedString("e.g. 1,3-5,10", nil)
  175. batchButton.title = KMLocalizedString("Batch", nil)
  176. cancelButton.title = KMLocalizedString("Cancel", nil)
  177. convertButton.title = KMLocalizedString("Convert", nil)
  178. upgradeButton.title = KMLocalizedString("Upgrade", nil)
  179. onlyTextBtn.title = KMLocalizedString("Only Text", nil)
  180. onlyTableBtn.title = KMLocalizedString("Only Table", nil)
  181. allContentBtn.title = KMLocalizedString("All Content", nil)
  182. tableMenu1.title = KMLocalizedString("Create Sheet for each Table", nil)
  183. tableMenu2.title = KMLocalizedString("Create Sheet for each Page", nil)
  184. allContentMenu2.title = KMLocalizedString("Create Sheet for each Page", nil)
  185. tableMenu3.title = KMLocalizedString("Create single Sheet for File", nil)
  186. allContentMenu3.title = KMLocalizedString("Create single Sheet for File", nil)
  187. }
  188. func hideWaitting() {
  189. maskView?.removeFromSuperview()
  190. }
  191. func showWaitting() {
  192. if maskView == nil {
  193. maskView = KMBookletMaskView(frame: CGRect(x: 0, y: 0, width: self.window?.frame.size.width ?? 0, height: self.window?.frame.size.height ?? 0))
  194. }
  195. self.window?.contentView?.addSubview(maskView!)
  196. }
  197. func configuView() {
  198. self.prePDFView.autoScales = true
  199. self.prePDFView.wantsLayer = true
  200. self.prePDFView.document = self.pdfDocument
  201. self.imageDPISelectButton.removeAllItems()
  202. self.formatSelectButton.removeAllItems()
  203. let dpiArray = ["50 dpi", "72 dpi", "96 dpi", "150 dpi", "300 dpi", "600 dpi"]
  204. let formArray = ["Excel (.xlsx)", "PowerPoint (.pptx)", "RTF (.rtf)", "CSV (.csv)", "Html (.html)", "Text (.txt)", "JPEG (.jpeg)", "JPG (.jpg)", "PNG (.png)", "GIF (.gif)", "TIFF (.tiff)", "TGA (.tga)", "BMP (.bmp)", "JPEG-2000 (.jp2)"]
  205. for (index, string) in formArray.enumerated() {
  206. let item = NSMenuItem()
  207. item.title = string
  208. item.target = self
  209. item.tag = index + 1
  210. self.formatSelectButton.menu?.addItem(item)
  211. }
  212. var isShowAdvanced = false
  213. let wordItem = NSMenuItem()
  214. wordItem.title = "Word (.docx)"
  215. wordItem.target = self
  216. var isShowUpgrade = false
  217. var convertSample: KMConvertType = .Word
  218. #if VERSION_FREE
  219. #if VERSION_DMG
  220. // 桌机版
  221. wordItem.tag = convertSample.rawValue
  222. isShowAdvanced = true
  223. if IAPProductsManager.default().isAvailableAllFunction() {
  224. if IAPProductsManager.default().isAvailableAdvancedPDFToOffice() {
  225. convertSample = .AdvancedWord
  226. wordItem.tag = convertSample.rawValue
  227. isShowAdvanced = false
  228. } else {
  229. isShowUpgrade = true
  230. }
  231. } else {
  232. isShowUpgrade = true
  233. }
  234. #else
  235. // 免费版
  236. convertSample = .Word
  237. wordItem.tag = convertSample.rawValue
  238. isShowAdvanced = true
  239. if IAPProductsManager.default().isAvailableAllFunction() {
  240. if IAPProductsManager.default().isAvailableAdvancedPDFToOffice() {
  241. convertSample = .AdvancedWord
  242. wordItem.tag = convertSample.rawValue
  243. isShowAdvanced = false
  244. } else {
  245. isShowUpgrade = true
  246. }
  247. } else {
  248. isShowUpgrade = true
  249. }
  250. #endif
  251. #else
  252. convertSample = .Word
  253. wordItem.tag = convertSample.rawValue
  254. // 付费版
  255. isShowAdvanced = true
  256. if IAPProductsManager.default().isAvailableAdvancedPDFToOffice() {
  257. isShowAdvanced = false
  258. convertSample = .AdvancedWord
  259. wordItem.tag = convertSample.rawValue
  260. } else {
  261. isShowUpgrade = true
  262. }
  263. #endif
  264. if wordItem.title != "" {
  265. if isShowAdvanced {
  266. let originStr = " \(KMLocalizedString("Standard", nil)) "
  267. let str = KMLocalizedString("Word (.docx)", nil)
  268. let attributedStr = NSMutableAttributedString(string: "\(str) \(originStr)")
  269. attributedStr.addAttribute(NSAttributedString.Key.backgroundColor, value: NSColor(red: 40/255.0, green: 193.0/255.0, blue: 107.0/255.0, alpha: 1.0), range: NSMakeRange(str.count + 2, originStr.count))
  270. attributedStr.addAttribute(NSAttributedString.Key.foregroundColor, value: NSColor.white, range: NSMakeRange(str.count + 2, originStr.count))
  271. let item = NSMenuItem()
  272. item.attributedTitle = attributedStr
  273. item.target = self
  274. item.tag = wordItem.tag
  275. self.formatSelectButton.menu?.insertItem(item, at: 0)
  276. } else {
  277. self.formatSelectButton.menu?.insertItem(wordItem, at: 0)
  278. }
  279. }
  280. if !isShowUpgrade {
  281. self.upgradeButton.isHidden = true
  282. }
  283. var selectIndex = 0
  284. if isShowAdvanced {
  285. let originStr = " \(NSLocalizedString("Advanced", comment: "")) "
  286. let str = NSLocalizedString("Word (.docx)", comment: "")
  287. let attributedStr = NSMutableAttributedString(string: "\(str) \(originStr)")
  288. attributedStr.addAttribute(NSAttributedString.Key.backgroundColor, value: NSColor(red: 245.0/255.0, green: 142.0/255.0, blue: 38.0/255.0, alpha: 1.0), range: NSMakeRange(str.count + 2, originStr.count))
  289. attributedStr.addAttribute(NSAttributedString.Key.foregroundColor, value: NSColor.white, range: NSMakeRange(str.count + 2, originStr.count))
  290. let item = NSMenuItem()
  291. item.attributedTitle = attributedStr
  292. item.target = self
  293. convertSample = .AdvancedWord
  294. item.tag = convertSample.rawValue
  295. self.formatSelectButton.menu?.insertItem(item, at: 0)
  296. }
  297. if self.convertType == .Word {
  298. selectIndex = 0
  299. } else {
  300. selectIndex = self.convertType.rawValue
  301. if isShowAdvanced {
  302. selectIndex += 1
  303. }
  304. if wordItem.title == "" {
  305. selectIndex -= 1
  306. }
  307. }
  308. self.formatSelectButton.selectItem(at: selectIndex)
  309. let item = self.formatSelectButton.selectedItem
  310. self.convertType = KMConvertType(rawValue: item?.tag ?? 0) ?? .Word
  311. self.imageDPISelectButton.isHidden = true
  312. self.buttonTopOffset.constant = -26
  313. self.imageDPISelectButton.addItems(withTitles: dpiArray)
  314. self.imageDPISelectButton.selectItem(at: 3)
  315. self.imageDPINumber = 150
  316. self.totalPageCountLabel.stringValue = " / \(self.pdfDocument?.pageCount ?? 1)"
  317. self.totalPageCountLabel.textColor = KMAppearance.Layout.h2Color()
  318. self.updataView()
  319. self.prePDFView.go(to: currentPage)
  320. let pageIndex = self.prePDFView.currentPageIndex+1
  321. self.currentPageIndexTextField.stringValue = "\(pageIndex)"
  322. if let documentURL = self.pdfDocument?.documentURL{
  323. self.pdfDocument = CPDFDocument(url: documentURL)
  324. if !lockPassword.isEmpty && lockPassword.count > 0{
  325. self.pdfDocument?.unlock(withPassword: lockPassword)
  326. }
  327. self.prePDFView.document = self.pdfDocument
  328. self.fileAttri_ = KMFileAttribute()
  329. self.fileAttri_?.filePath = documentURL.path
  330. }
  331. self.prePDFView.setDisplay(.singlePage)
  332. self.prePDFView.layoutDocumentView()
  333. }
  334. func updataView() {
  335. var moreLabelString: String = ""
  336. var offset: CGFloat = 0
  337. excelStyleBox.isHidden = true
  338. #if VERSION_FREE
  339. // 座机版
  340. if !IAPProductsManager.default().isAvailableAllFunction() {
  341. moreLabelString = String(format: "%@ %@", KMLocalizedString("The first 10 pages for free"), KMLocalizedString("Unlimited Convert"))
  342. } else {
  343. if !IAPProductsManager.default().isAvailableAdvancedPDFToOffice() {
  344. if .Word == self.convertType ||
  345. self.convertType == .AdvancedWord ||
  346. .Excel == self.convertType ||
  347. .PPT == self.convertType ||
  348. .CSV == self.convertType ||
  349. .RTF == self.convertType ||
  350. .GIF == self.convertType ||
  351. .TIFF == self.convertType ||
  352. .JP2 == self.convertType ||
  353. .BMP == self.convertType ||
  354. .TGA == self.convertType {
  355. moreLabelString = String(format: "%@ %@", KMLocalizedString("The first 10 pages for free"), KMLocalizedString("Unlimited Convert"))
  356. }
  357. }
  358. }
  359. #else
  360. // 付费版
  361. if !(IAPProductsManager.default().isAvailableAdvancedPDFToOffice()) {
  362. if .Word == self.convertType ||
  363. self.convertType == .AdvancedWord ||
  364. .Excel == self.convertType ||
  365. .PPT == self.convertType ||
  366. .CSV == self.convertType ||
  367. .RTF == self.convertType ||
  368. .GIF == self.convertType ||
  369. .TIFF == self.convertType ||
  370. .JP2 == self.convertType ||
  371. .BMP == self.convertType ||
  372. .TGA == self.convertType {
  373. moreLabelString = String(format: "%@ %@", KMLocalizedString("The first 10 pages for free"), KMLocalizedString("Unlimited Convert"))
  374. }
  375. }
  376. #endif
  377. if convertType.rawValue >= 7 && convertType.rawValue <= 14 {
  378. offset += imageDPISelectButton.frame.size.height
  379. imageDPISelectButton.isHidden = false
  380. buttonTopOffset.constant = 5
  381. } else {
  382. imageDPISelectButton.isHidden = true
  383. buttonTopOffset.constant = -26
  384. }
  385. if moreLabelString.count < 1 {
  386. offset += 5
  387. moreConvertBox.isHidden = true
  388. moreButton.isHidden = true
  389. } else {
  390. offset += (moreButton.frame.size.height + 5)
  391. moreConvertBox.isHidden = false
  392. moreButton.isHidden = false
  393. moreConvertLabel.stringValue = moreLabelString
  394. if let range = moreLabelString.range(of: NSLocalizedString("Unlimited Convert", comment: "")) {
  395. let newR: NSRange = moreLabelString.nsRange(from: range)!
  396. let attributedStr = NSMutableAttributedString(string: moreLabelString)
  397. attributedStr.addAttribute(.foregroundColor, value: NSColor.labelColor, range: NSRange(location: 0, length: newR.location - 1))
  398. attributedStr.addAttribute(.foregroundColor, value: NSColor(red: 8/255, green: 124/255, blue: 1, alpha: 1), range: newR)
  399. attributedStr.addAttribute(.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: newR)
  400. moreConvertLabel.attributedStringValue = attributedStr
  401. }
  402. }
  403. if .Excel == convertType {
  404. separateStypeTopOffset.constant = separateStypeBox.frame.size.height + 58 + 16
  405. extractTableTopOffset.constant = separateStypeBox.frame.size.height + 50
  406. separateStypeBox.isHidden = true
  407. extractTableButton.isHidden = true
  408. excelStyleBox.isHidden = false
  409. separateStypeLabel.isHidden = false
  410. separateStypeLabel.stringValue = NSLocalizedString("Excel Worksheet Settings", comment: "")
  411. separateButton.title = NSLocalizedString("Convert each page to a separate worksheet", comment: "")
  412. singleButton.title = NSLocalizedString("Convert all pages to a single worksheet", comment: "")
  413. buttonClicked_extractTable(extractTableButton)
  414. } else if .AdvancedWord == convertType {
  415. singleButton.setTitleColor(NSColor.labelColor)
  416. separateButton.setTitleColor(NSColor.labelColor)
  417. separateStypeLabel.textColor = NSColor.labelColor
  418. separateButton.state = NSControl.StateValue.on
  419. singleButton.isEnabled = true
  420. separateButton.isEnabled = true
  421. isAllInOneSheet = false
  422. separateStypeTopOffset.constant = separateStypeBox.frame.size.height + 40
  423. extractTableButton.isHidden = true
  424. separateStypeBox.isHidden = false
  425. separateStypeLabel.isHidden = false
  426. separateStypeLabel.stringValue = NSLocalizedString("Layout Settings", comment: "")
  427. separateButton.title = NSLocalizedString("Retain Flowing Text", comment: "")
  428. singleButton.title = NSLocalizedString("Retain Page Layout", comment: "")
  429. } else if .CSV == convertType {
  430. separateStypeTopOffset.constant = extractTableButton.frame.size.height + 30
  431. extractTableTopOffset.constant = 12
  432. extractTableButton.isHidden = false
  433. separateStypeBox.isHidden = true
  434. separateStypeLabel.isHidden = true
  435. } else {
  436. separateStypeTopOffset.constant = 15
  437. separateStypeBox.isHidden = true
  438. extractTableButton.isHidden = true
  439. separateStypeLabel.isHidden = true
  440. }
  441. buttonBottemOffset.constant = offset
  442. }
  443. @IBAction func buttonClicked_extractTable(_ sender: NSButton) {
  444. if extractTableButton.state == .on {
  445. singleButton.setTitleColor(KMAppearance.Layout.b15_1Color())
  446. separateButton.setTitleColor(KMAppearance.Layout.b15_1Color())
  447. separateStypeLabel.textColor = KMAppearance.Layout.b15_1Color()
  448. singleButton.isEnabled = false
  449. separateButton.isEnabled = false
  450. separateButton.state = .off
  451. singleButton.state = .off
  452. } else {
  453. singleButton.setTitleColor(NSColor.labelColor)
  454. separateButton.setTitleColor(NSColor.labelColor)
  455. separateStypeLabel.textColor = NSColor.labelColor
  456. separateButton.state = .on
  457. singleButton.isEnabled = true
  458. separateButton.isEnabled = true
  459. isAllInOneSheet = false
  460. }
  461. }
  462. @IBAction func buttonClicked_Cancel(_ sender: NSButton) {
  463. if FileManager.default.fileExists(atPath: kConvertFileSavePath ?? "") {
  464. do {
  465. try FileManager.default.removeItem(atPath: kConvertFileSavePath ?? "")
  466. } catch {
  467. print("Error removing item at path: (error.localizedDescription)")
  468. }
  469. }
  470. dismissSheet(sender)
  471. }
  472. func dismissSheet(_ sender: NSButton) {
  473. // if #available(macOS 10.13, *) {
  474. // self.window?.endSheet(sender.window!)
  475. // } else {
  476. // NSApp.endSheet(self.window!)
  477. // }
  478. // self.window?.orderOut(self)
  479. self.km_quick_endSheet()
  480. }
  481. func showCriticalAlert(_ alertMsg: String?) {
  482. let alert = NSAlert()
  483. alert.alertStyle = .critical
  484. if let msg = alertMsg {
  485. alert.informativeText = msg
  486. } else {
  487. let st = self.pdfDocument?.documentURL.lastPathComponent.count ?? 0 > 0 ? self.pdfDocument?.documentURL.lastPathComponent : KMLocalizedString("Untitled.pdf", nil)
  488. alert.messageText = String(format: "%@ %@", st!, KMLocalizedString("Invalid page range or the page number is out of range. Please try again.", nil))
  489. }
  490. alert.runModal()
  491. }
  492. func produceNewPDF(with pagesArray: [CPDFPage]) {
  493. if tempPDFDocument != nil{
  494. tempPDFDocument = nil
  495. }
  496. tempPDFDocument = CPDFDocument()
  497. for i in 0..<(self.pdfDocument?.pageCount ?? 0) {
  498. tempPDFDocument?.removePage(at: i)
  499. }
  500. for addedPage in pagesArray {
  501. tempPDFDocument?.insertPageObject(addedPage, at: tempPDFDocument!.pageCount)
  502. }
  503. self.prePDFView.document = tempPDFDocument
  504. self.prePDFView.goToFirstPage(nil)
  505. self.currentPageIndexTextField.stringValue = "1"
  506. self.totalPageCountLabel.stringValue = " / \(tempPDFDocument!.pageCount)"
  507. }
  508. func pageRangeSetON(_ sender: NSButton) {
  509. allPageButton.state = .off
  510. oddPageButton.state = .off
  511. evenPageButton.state = .off
  512. handInputButton.state = .off
  513. currentPageButton.state = .off
  514. sender.state = .on
  515. if sender == handInputButton {
  516. pageRangeTextField.isEditable = true
  517. pageRangeTextField.isSelectable = true
  518. // self.pageRangeTextField.textColor = NSColor.textColor
  519. window?.makeFirstResponder(pageRangeTextField)
  520. } else {
  521. pageRangeTextField.isEditable = false
  522. pageRangeTextField.isSelectable = false
  523. // self.pageRangeTextField.textColor = NSColor.lightGrayColor
  524. window?.makeFirstResponder(self)
  525. }
  526. }
  527. @IBAction func buttonClicked_FormatSelect(_ sender: NSButton) {
  528. guard let item = self.formatSelectButton.selectedItem else { return }
  529. self.convertType = KMConvertType(rawValue: item.tag) ?? .Word
  530. updataView()
  531. }
  532. func transform(with string: String) {
  533. if string == KMLocalizedString("Create Sheet for each Table", nil) {
  534. self.excelWorksheetOption = .forEachTable
  535. } else if string == KMLocalizedString("Create Sheet for each Page", nil) {
  536. self.excelWorksheetOption = .forEachPage
  537. } else if string == KMLocalizedString("Create single Sheet for File", nil) {
  538. self.excelWorksheetOption = .forTheDocument
  539. }
  540. }
  541. @IBAction func buttonClicked_excelStyle(_ sender: NSButton) {
  542. if sender.isEqual(self.onlyTextBtn) {
  543. self.tableMenu.isEnabled = false
  544. self.allContentMenu.isEnabled = false
  545. self.excelContentOption = .onlyText
  546. self.excelWorksheetOption = .forEachTable
  547. } else if (sender.isEqual(self.onlyTableBtn)) {
  548. self.tableMenu.isEnabled = true
  549. self.allContentMenu.isEnabled = false
  550. self.excelContentOption = .onlyTable
  551. transform(with: self.tableMenu.selectedItem?.title ?? "")
  552. } else if (sender.isEqual(self.allContentBtn)) {
  553. self.tableMenu.isEnabled = false
  554. self.allContentMenu.isEnabled = true
  555. self.excelContentOption = .allContent
  556. transform(with: self.allContentMenu.selectedItem?.title ?? "")
  557. }
  558. }
  559. @IBAction func buttonClicked_tableMenu(_ sender: NSButton) {
  560. transform(with: self.tableMenu.selectedItem?.title ?? "")
  561. }
  562. @IBAction func buttonClicked_allContentMenu(_ sender: NSButton) {
  563. transform(with: self.allContentMenu.selectedItem?.title ?? "")
  564. }
  565. @IBAction func buttonClicked_PageSelect(_ sender: NSButton) {
  566. pageRangeSetON(sender)
  567. self.lockPassword = ""
  568. let pagesArray = NSMutableArray()
  569. for i in 0..<(self.pdfDocument?.pageCount ?? 0) {
  570. let copyPage = self.pdfDocument?.page(at: i)
  571. pagesArray.add(copyPage!)
  572. }
  573. if sender.isEqual(self.oddPageButton) {
  574. pagesArray.subArray(type: .Odd)
  575. } else if (sender.isEqual(self.evenPageButton)) {
  576. pagesArray.subArray(type: .Even)
  577. } else if (sender.isEqual(self.currentPageButton)) {
  578. pagesArray.removeAllObjects()
  579. let page = self.prePDFView.currentPage()
  580. if (page != nil) {
  581. pagesArray.add(page as Any)
  582. }
  583. }
  584. produceNewPDF(with: pagesArray as! [CPDFPage])
  585. // perform(#selector(produceNewPDF(with:)), with: pagesArray, afterDelay: 2)
  586. // performSelector(produceNewPDF(with:), withObject: pagesArray, afterDelay: 2)
  587. }
  588. @IBAction func buttonClicked_DpiSelect(_ sender: NSPopUpButton) {
  589. let index = sender.indexOfSelectedItem
  590. var dpi = 0
  591. if index == 0 {
  592. dpi = 50
  593. } else if index == 1 {
  594. dpi = 72
  595. } else if index == 2 {
  596. dpi = 96
  597. } else if index == 3 {
  598. dpi = 150
  599. } else if index == 4 {
  600. dpi = 300
  601. } else if index == 5 {
  602. dpi = 600
  603. }
  604. self.imageDPINumber = dpi
  605. }
  606. @IBAction func buttonClick_PreviousPage(_ sender: NSButton) {
  607. if self.prePDFView.canGoToPreviousPage() {
  608. self.prePDFView.goToPreviousPage(nil)
  609. let currentIndex = self.prePDFView.document?.index(for: self.prePDFView.currentPage()) ?? 0
  610. self.currentPageIndexTextField.stringValue = "\(currentIndex + 1)"
  611. }
  612. }
  613. @IBAction func buttonClicked_NextPage(_ sender: NSButton) {
  614. if self.prePDFView.canGoToNextPage() {
  615. self.prePDFView.goToNextPage(nil)
  616. let currentIndex = self.prePDFView.document?.index(for: self.prePDFView.currentPage())
  617. self.currentPageIndexTextField.stringValue = "\((currentIndex ?? 0) + 1)"
  618. }
  619. }
  620. @IBAction func buttonClicked_Batch(_ sender: NSButton) {
  621. if !IAPProductsManager.default().isAvailableAllFunction() {
  622. KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
  623. return
  624. }
  625. if self.pdfDocument?.documentURL == nil {
  626. NSSound.beep()
  627. return
  628. }
  629. if self.callBackBlock != nil {
  630. self.callBackBlock!()
  631. self.callBackBlock = nil
  632. }
  633. dismissSheet(sender)
  634. }
  635. @IBAction func buttonClicked_Convert(_ sender: Any) {
  636. self.window?.makeFirstResponder(self.prePDFView)
  637. if self.handInputButton.state == .on {
  638. if self.fileAttri_ == nil {
  639. self.fileAttri_ = KMFileAttribute()
  640. self.fileAttri_?.filePath = self.pdfDocument?.documentURL.path ?? ""
  641. }
  642. // fileAttri_.pdfDocument = self.pdfDocument
  643. self.fileAttri_?.bAllPage = false
  644. self.fileAttri_?.pagesType = .custom
  645. self.fileAttri_?.pagesString = self.pageRangeTextField.stringValue
  646. let pages = self.fileAttri_?.fetchSelectPages() ?? []
  647. if pages.isEmpty {
  648. return
  649. }
  650. }
  651. let openPanel = NSOpenPanel()
  652. openPanel.canChooseFiles = false
  653. openPanel.canChooseDirectories = true
  654. openPanel.canCreateDirectories = true
  655. openPanel.beginSheetModal(for: self.window!) { result in
  656. if result == .OK {
  657. self.savePath = openPanel.url!.path
  658. self.beginConvert()
  659. }
  660. }
  661. }
  662. func beginConvert() {
  663. var isLimitConvert = false
  664. #if VERSION_FREE
  665. #if VERSION_DMG
  666. // 桌机版
  667. if IAPProductsManager.default().isAvailableAllFunction() {
  668. if IAPProductsManager.default().isAvailableAdvancedPDFToOffice() {
  669. isLimitConvert = false
  670. } else {
  671. if (.PNG == self.convertType ||
  672. .JPEG == self.convertType ||
  673. .JPG == self.convertType ||
  674. .HTML == self.convertType ||
  675. .Text == self.convertType ||
  676. .Word == self.convertType) {
  677. isLimitConvert = false
  678. } else {
  679. isLimitConvert = true
  680. }
  681. }
  682. } else {
  683. isLimitConvert = true
  684. }
  685. #else
  686. // 免费版
  687. if IAPProductsManager.default().isAvailableAdvancedPDFToOffice() == false {
  688. isLimitConvert = true
  689. }
  690. #endif
  691. #else
  692. // 付费版
  693. if IAPProductsManager.default().isAvailableAdvancedPDFToOffice() {
  694. isLimitConvert = false
  695. } else {
  696. if (.PNG == self.convertType ||
  697. .JPEG == self.convertType ||
  698. .JPG == self.convertType ||
  699. .HTML == self.convertType ||
  700. .Text == self.convertType ||
  701. .Word == self.convertType) {
  702. isLimitConvert = false
  703. } else {
  704. isLimitConvert = true
  705. }
  706. }
  707. #endif
  708. self.showWaitting()
  709. let pages = NSMutableArray()
  710. DispatchQueue.global(qos: .background).async { [self] in
  711. let filePath = getConvertFileSavePath()
  712. if (FileManager.default.fileExists(atPath: filePath)) {
  713. try?FileManager.default.removeItem(atPath: filePath)
  714. }
  715. if self.prePDFView.document.write(toFile: filePath) {
  716. for i in 0..<self.prePDFView.document.pageCount {
  717. pages.add(i + 1)
  718. }
  719. }
  720. DispatchQueue.main.async {
  721. if pages.count < 1 {
  722. self.hideWaitting()
  723. let alert = NSAlert()
  724. alert.alertStyle = .critical
  725. alert.messageText = "\(self.pdfDocument?.documentURL.path.lastPathComponent ?? NSLocalizedString("Untitled", comment: "")) \(NSLocalizedString("Invalid page range or the page number is out of range. Please try again.", comment: ""))"
  726. alert.runModal()
  727. return
  728. }
  729. let pageCount = pages.count
  730. var selectPages = [Int]()
  731. if isLimitConvert {
  732. if pageCount >= 10 {
  733. for i in 0..<10 {
  734. selectPages.append(pages[i] as! Int)
  735. }
  736. } else {
  737. selectPages = pages as! [Int]
  738. }
  739. } else {
  740. selectPages = pages as! [Int]
  741. }
  742. let convert = KMPDFConvert()
  743. convert.filePath = filePath
  744. convert.pages = selectPages
  745. convert.isAllInOneSheet = self.isAllInOneSheet
  746. if self.convertType == .Word {
  747. convert.type = 0
  748. } else {
  749. convert.type = 1
  750. }
  751. convert.isExtractTable = self.extractTableButton.state == .on
  752. convert.outputFolderPath = self.savePath
  753. convert.outputFileName = (self.pdfDocument?.documentURL.deletingPathExtension().lastPathComponent) ?? NSLocalizedString("Untitled", comment: "")
  754. if self.convertType == .AdvancedWord {
  755. convert.convertType = .word
  756. } else if self.convertType == .JPEG ||
  757. self.convertType == .JPG ||
  758. self.convertType == .PNG ||
  759. self.convertType == .GIF ||
  760. self.convertType == .TIFF ||
  761. self.convertType == .TGA ||
  762. self.convertType == .BMP ||
  763. self.convertType == .JP2 {
  764. convert.convertType = KMPDFConvertType(rawValue: self.convertType.rawValue) ?? .word
  765. convert.options = [KMPDFConvertOptionsKeyImageDPI : self.imageDPINumber,
  766. KMPDFConvertOptionsKeyImageWithAnnotation : true] as [String : Any]
  767. } else {
  768. convert.convertType = KMPDFConvertType(rawValue: self.convertType.rawValue) ?? .word
  769. }
  770. if self.convertType == .Excel {
  771. convert.excelContentOption = self.excelContentOption
  772. convert.excelWorksheetOption = self.excelWorksheetOption
  773. }
  774. convert.password = self.lockPassword
  775. KMPDFConvertManager.defaultManager.convert(convert: convert) { [self] (finished, error) in
  776. self.hideWaitting()
  777. if finished {
  778. self.buttonClicked_Cancel(cancelButton)
  779. if FileManager.default.fileExists(atPath: convert.outputFilePath) {
  780. let workspace = NSWorkspace.shared
  781. let url = URL(fileURLWithPath: convert.outputFilePath)
  782. workspace.activateFileViewerSelecting([url])
  783. }
  784. } else if let error = error {
  785. let err: NSError = error as NSError
  786. var erroeString = ""
  787. switch err.code {
  788. case CPDFConverterEncryptError:
  789. erroeString = NSLocalizedString("Password required or incorrect password. Please re-enter your password and try again", comment: "")
  790. break
  791. case CPDFConverterPermissionError:
  792. erroeString = NSLocalizedString("The license doesn't allow the permission", comment: "")
  793. break
  794. case CPDFConverterMallocError:
  795. erroeString = NSLocalizedString("Malloc failure", comment: "")
  796. break
  797. case CPDFConverterUnknownError:
  798. erroeString = NSLocalizedString("Unknown error in processing conversion. Please try again later", comment: "")
  799. break
  800. case CPDFConverterPDFUnknownError:
  801. erroeString = NSLocalizedString("Unknown error in processing PDF. Please try again later", comment: "")
  802. break
  803. case CPDFConverterPDFFileError:
  804. erroeString = NSLocalizedString("File not found or could not be opened. Check if your file exists or choose another file to convert", comment: "")
  805. break
  806. case CPDFConverterPDFFormatError:
  807. erroeString = NSLocalizedString("File not in PDF format or corruptead. Change a PDF file and try again", comment: "")
  808. break
  809. case CPDFConverterPDFSecurityError:
  810. erroeString = NSLocalizedString("Unsupported security scheme", comment: "")
  811. break
  812. case CPDFConverterPDFPageError:
  813. erroeString = NSLocalizedString("Page not found or content error", comment: "")
  814. break
  815. default:
  816. erroeString = NSLocalizedString("Table not found", comment: "")
  817. break
  818. }
  819. let alert = NSAlert()
  820. alert.alertStyle = .critical
  821. alert.messageText = NSLocalizedString("Conversion Failed", comment: "")
  822. alert.informativeText = erroeString
  823. alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
  824. if #available(OSX 10.14, *) {
  825. alert.beginSheetModal(for: self.window!, completionHandler: nil)
  826. } else {
  827. alert.runModal()
  828. }
  829. }
  830. }
  831. }
  832. }
  833. }
  834. func getConvertFileSavePath() -> String {
  835. var path = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.applicationSupportDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last
  836. path?.append("/")
  837. path?.append(Bundle.main.bundleIdentifier!)
  838. if (FileManager.default.fileExists(atPath: path!) == false) {
  839. try?FileManager.default.createDirectory(atPath: path!, withIntermediateDirectories: false)
  840. }
  841. path?.append("/")
  842. path?.append("convert.pdf")
  843. return path!
  844. }
  845. @IBAction func buttonClicked_MoreConvert(_ sender: NSButton) {
  846. if sender == self.moreButton {
  847. FMTrackEventManager.defaultManager.trackEvent(event: "PUW", withProperties: ["PUW_Btn": "Btn_PUW_Converter_Premium_UnlimitedConvertw"])
  848. } else if sender == self.upgradeButton {
  849. FMTrackEventManager.defaultManager.trackEvent(event: "PUW", withProperties: ["PUW_Btn": "Btn_PUW_Converter_Premium_Upgrade"])
  850. }
  851. #if VERSION_DMG
  852. if IAPProductsManager.default().isAvailableAllFunction() && !IAPProductsManager.default().isAvailableAdvancedPDFToOffice() {
  853. let limitWC = KMPurchaseLimitWindowController.currentLimitWC()
  854. limitWC.continueBlock = { windowController in
  855. }
  856. limitWC.window?.center()
  857. limitWC.showWindow(nil)
  858. } else {
  859. KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
  860. }
  861. #else
  862. if IAPProductsManager.default().isAvailableAllFunction() {
  863. var vc: KMToolCompareWindowController? = nil
  864. if convertType == .Word || convertType == .AdvancedWord {
  865. // vc = KMToolCompareWindowController(toolType: .Convert, selectNum: 1)
  866. vc = KMToolCompareWindowController.toolCompare(toolType: .Convert, selectNum: 1)
  867. } else if convertType == .Excel {
  868. // vc = KMToolCompareWindowController(toolType: .Convert, selectNum: 2)
  869. vc = KMToolCompareWindowController.toolCompare(toolType: .Convert, selectNum: 2)
  870. } else if convertType == .PPT {
  871. // vc = KMToolCompareWindowController(toolType: .Convert, selectNum: 3)
  872. vc = KMToolCompareWindowController.toolCompare(toolType: .Convert, selectNum: 3)
  873. } else if convertType.rawValue < 15 && convertType.rawValue > 7 {
  874. // vc = KMToolCompareWindowController(toolType: .Convert, selectNum: 4)
  875. vc = KMToolCompareWindowController.toolCompare(toolType: .Convert, selectNum: 4)
  876. } else {
  877. // vc = KMToolCompareWindowController(toolType: .Convert, selectNum: 0)
  878. vc = KMToolCompareWindowController.toolCompare(toolType: .Convert, selectNum: 0)
  879. }
  880. vc?.showWindow(nil)
  881. } else {
  882. KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
  883. }
  884. #endif
  885. self.buttonClicked_Cancel(self.cancelButton)
  886. }
  887. @IBAction func buttonItemClick_SepSingle(_ sender: Any) {
  888. if .on == self.singleButton.state {
  889. self.isAllInOneSheet = true
  890. } else {
  891. self.isAllInOneSheet = false
  892. }
  893. }
  894. func controlTextDidEndEditing(_ obj: Notification) {
  895. let object = obj.object
  896. if (object as AnyObject).isEqual(self.currentPageIndexTextField) == true {
  897. let num: Int = Int(self.currentPageIndexTextField.stringValue) ?? 1
  898. let targetPage = self.prePDFView.document.page(at: UInt(num - 1))
  899. self.prePDFView.go(to: targetPage)
  900. } else if (object as AnyObject).isEqual(self.pageRangeTextField) == true {
  901. guard self.handInputButton.state == .on else { return }
  902. if self.fileAttri_ == nil {
  903. self.fileAttri_ = KMFileAttribute()
  904. self.fileAttri_?.filePath = self.pdfDocument?.documentURL.path ?? ""
  905. }
  906. // fileAttribute.pdfDocument = self.pdfDocument
  907. self.fileAttri_?.bAllPage = false
  908. self.fileAttri_?.pagesType = .custom
  909. self.fileAttri_?.pagesString = self.pageRangeTextField.stringValue
  910. let pages = self.fileAttri_?.fetchSelectPages() ?? []
  911. if pages.count > 0 {
  912. let pagesArray = NSMutableArray()
  913. for pageNum in pages {
  914. let tpage = self.pdfDocument?.page(at: UInt(pageNum - 1))
  915. pagesArray.add(tpage as Any)
  916. }
  917. self.produceNewPDF(with: pagesArray as! [CPDFPage])
  918. } else {
  919. self.showCriticalAlert(nil)
  920. }
  921. }
  922. }
  923. func controlTextDidChange(_ obj: Notification) {
  924. if let textField = obj.object as? NSTextField {
  925. if textField.isEqual(self.currentPageIndexTextField) {
  926. if let stringValue = self.currentPageIndexTextField.formatter?.string(for: NSNumber(value: Float(self.currentPageIndexTextField.stringValue) ?? 0)) {
  927. if let integerValue = Int(stringValue) {
  928. var string = stringValue
  929. if integerValue > self.prePDFView.document.pageCount {
  930. string = "(self.prePDFView.document.pageCount)"
  931. } else if integerValue <= 0 {
  932. string = "1"
  933. }
  934. self.currentPageIndexTextField.stringValue = string
  935. }
  936. }
  937. }
  938. }
  939. }
  940. }
  941. @objc enum KMSubArrayType: Int {
  942. case Odd = 0
  943. case Even
  944. }
  945. extension NSMutableArray{
  946. func subArray(type: KMSubArrayType) {
  947. if self.count == 0 { return }
  948. if type.rawValue > 1 || type.rawValue < 0 { return }
  949. let newArray = NSMutableArray()
  950. for i in 0..<self.count {
  951. if i % 2 == type.rawValue {
  952. newArray.add(self[i])
  953. }
  954. }
  955. self.removeAllObjects()
  956. self.addObjects(from: newArray as! [Any])
  957. }
  958. }