|
@@ -0,0 +1,643 @@
|
|
|
+//
|
|
|
+// KMBatchManager.swift
|
|
|
+// PDF Master
|
|
|
+//
|
|
|
+// Created by lizhe on 2023/2/17.
|
|
|
+//
|
|
|
+
|
|
|
+import Cocoa
|
|
|
+
|
|
|
+enum KMBatchManagerSate: Int, CaseIterable {
|
|
|
+ case unknow = 0
|
|
|
+ case processing
|
|
|
+ case complete
|
|
|
+ case error
|
|
|
+}
|
|
|
+
|
|
|
+let kBacthFilesProcessNotification = "kBacthFilesProcessNotification"
|
|
|
+let kBacthProcessNotification = "kBacthProcessNotification"
|
|
|
+
|
|
|
+class KMBatchManager: NSObject {
|
|
|
+ public static let manager = KMBatchManager()
|
|
|
+ fileprivate(set) var state: KMBatchManagerSate = .unknow
|
|
|
+
|
|
|
+ var filesData: [KMBatchProcessingTableViewModel] = []
|
|
|
+
|
|
|
+ func batch(type: KMBatchCollectionViewType, data: KMBatchSettingItemViewModel) {
|
|
|
+ let panel = NSOpenPanel()
|
|
|
+ panel.canChooseFiles = false
|
|
|
+ panel.canChooseDirectories = true
|
|
|
+ panel.canCreateDirectories = true
|
|
|
+ panel.beginSheetModal(for: NSWindow.currentWindow()) { response in
|
|
|
+ if response == .cancel {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ let outputFolderPath = (panel.url?.path)!
|
|
|
+ //
|
|
|
+ self.batchUnkown()
|
|
|
+
|
|
|
+ switch type {
|
|
|
+ case .convertPDF:
|
|
|
+ self.convertPDFExport(data: data, outputFolderPath: outputFolderPath)
|
|
|
+ break
|
|
|
+ case .OCR:
|
|
|
+ self.convertOCRExport(data: data, outputFolderPath: outputFolderPath)
|
|
|
+ break
|
|
|
+ case .compress:
|
|
|
+ self.compressExport(data: data, outputFolderPath: outputFolderPath)
|
|
|
+ break
|
|
|
+ case .security:
|
|
|
+ self.securityExport(data: data, outputFolderPath: outputFolderPath)
|
|
|
+ break
|
|
|
+ case .watermark:
|
|
|
+
|
|
|
+ break
|
|
|
+ case .background:
|
|
|
+
|
|
|
+ break
|
|
|
+ case .headerAndFooter:
|
|
|
+
|
|
|
+ break
|
|
|
+ case .batesNumber:
|
|
|
+
|
|
|
+ break
|
|
|
+ case .batchRemove:
|
|
|
+ self.removeApplay(data: data, outputFolderPath: outputFolderPath)
|
|
|
+ break
|
|
|
+ default:
|
|
|
+ KMPrint("找不到")
|
|
|
+ break
|
|
|
+ }
|
|
|
+
|
|
|
+ //
|
|
|
+ self.batchProgress()
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+protocol KMBatchSettingViewExport {}
|
|
|
+extension KMBatchManager: KMBatchSettingViewExport {
|
|
|
+ //MARK: 转档
|
|
|
+ func convertPDFExport(data: KMBatchSettingItemViewModel, outputFolderPath: String) {
|
|
|
+ self.convertFile(outputFolderPath: outputFolderPath, data: data, filesData: self.filesData)
|
|
|
+ }
|
|
|
+
|
|
|
+ func convertFile(outputFolderPath: String, data: KMBatchSettingItemViewModel, filesData: [KMBatchProcessingTableViewModel]) {
|
|
|
+ if filesData.count != 0 {
|
|
|
+ DispatchQueue.global().async {
|
|
|
+ for i in 0..<filesData.count {
|
|
|
+ let item = filesData[i]
|
|
|
+ //创建Document
|
|
|
+ let filePath = item.filePath
|
|
|
+ let document = self.fetchDocument(filePath: filePath, model: item)
|
|
|
+
|
|
|
+ let settingData = data as? KMBatchConvertPDFViewModel ?? KMBatchConvertPDFViewModel()
|
|
|
+ var fileName = filePath.deletingPathExtension.lastPathComponent
|
|
|
+ if ((fileName.isEmpty)) {
|
|
|
+ fileName = NSLocalizedString("Untitled", comment: "")
|
|
|
+ }
|
|
|
+
|
|
|
+ let convert = self.addConvertParameter(settingData)
|
|
|
+
|
|
|
+ let pageCount = document.pageCount
|
|
|
+ //获取page
|
|
|
+ var pages:[Int] = []
|
|
|
+ for i in 0..<pageCount {
|
|
|
+ pages.append(Int(i)+1)
|
|
|
+ }
|
|
|
+
|
|
|
+ convert.outputFolderPath = outputFolderPath
|
|
|
+ convert.filePath = filePath
|
|
|
+ convert.outputFileName = fileName
|
|
|
+ convert.pages = pages
|
|
|
+
|
|
|
+ convert.isAllowOCR = settingData.needRecognizeText
|
|
|
+ convert.ocrLanguage = settingData.languageType
|
|
|
+
|
|
|
+ item.state = .clock
|
|
|
+ KMPDFConvertManager.defaultManager.convert(convert: convert, progress: { [unowned self] progressValue in
|
|
|
+ print("转档进度 - \(progressValue)")
|
|
|
+ let progress = Float(progressValue) / Float(pageCount)
|
|
|
+ self.itemProgress(item: item, processValue: progress)
|
|
|
+ }, completion: { [unowned self] finished, error in
|
|
|
+ if finished {
|
|
|
+ if FileManager.default.fileExists(atPath: outputFolderPath) {
|
|
|
+ NSWorkspace.shared.activateFileViewerSelecting([URL(fileURLWithPath: outputFolderPath)])
|
|
|
+ }
|
|
|
+ self.itemSuccess(item: item)
|
|
|
+ } else {
|
|
|
+ self.itemFailure(item: item, error: error! as NSError)
|
|
|
+ }
|
|
|
+
|
|
|
+ if i == self.filesData.count - 1 {
|
|
|
+ self.batchSuccess()
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ func addConvertParameter(_ data: KMBatchConvertPDFViewModel) -> KMPDFConvert {
|
|
|
+ let settingData = data
|
|
|
+ var convert = KMPDFConvert()
|
|
|
+
|
|
|
+ switch settingData.convertPDFType {
|
|
|
+ case .word:
|
|
|
+ convert = KMPDFConvertWord()
|
|
|
+ if settingData.layoutSettingType == .flowingText {
|
|
|
+ convert.isAllInOneSheet = false
|
|
|
+ } else {
|
|
|
+ convert.isAllInOneSheet = true
|
|
|
+ }
|
|
|
+ case .excel:
|
|
|
+ convert = KMPDFConvertExcel()
|
|
|
+ if settingData.excelSetting == .separate {
|
|
|
+ convert.isAllInOneSheet = false
|
|
|
+ convert.isExtractTable = false
|
|
|
+ } else if settingData.excelSetting == .format {
|
|
|
+ convert.isAllInOneSheet = true
|
|
|
+ convert.isExtractTable = false
|
|
|
+ } else if settingData.excelSetting == .tables {
|
|
|
+ convert.isAllInOneSheet = false
|
|
|
+ convert.isExtractTable = true
|
|
|
+
|
|
|
+ switch settingData.excelTablesType {
|
|
|
+ case .oneTable:
|
|
|
+ convert.extractTableIndex = 0
|
|
|
+ case .pageTable:
|
|
|
+ convert.extractTableIndex = 1
|
|
|
+ case .allTable:
|
|
|
+ convert.extractTableIndex = 2
|
|
|
+ default:
|
|
|
+ KMPrint("未找到")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ case .ppt:
|
|
|
+ convert = KMPDFConvertPPT()
|
|
|
+ case .csv:
|
|
|
+ convert = KMPDFConvertCSV()
|
|
|
+ if settingData.csvOnlyTables {
|
|
|
+ convert.isExtractTable = true
|
|
|
+ switch settingData.excelTablesType {
|
|
|
+ case .oneTable:
|
|
|
+ convert.extractTableIndex = 0
|
|
|
+ case .pageTable:
|
|
|
+ convert.extractTableIndex = 1
|
|
|
+ case .allTable:
|
|
|
+ convert.extractTableIndex = 2
|
|
|
+ default:
|
|
|
+ KMPrint("未找到")
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ convert.isExtractTable = false
|
|
|
+ }
|
|
|
+ case .image:
|
|
|
+ convert = KMPDFConvertImage()
|
|
|
+ convert.convertType = data.imageType
|
|
|
+
|
|
|
+ var dpi: Int = 150
|
|
|
+ if data.imageDpiIndex == 0 {
|
|
|
+ dpi = 50
|
|
|
+ } else if data.imageDpiIndex == 1 {
|
|
|
+ dpi = 72
|
|
|
+ } else if data.imageDpiIndex == 2 {
|
|
|
+ dpi = 96
|
|
|
+ } else if data.imageDpiIndex == 3 {
|
|
|
+ dpi = 150
|
|
|
+ } else if data.imageDpiIndex == 4 {
|
|
|
+ dpi = 300
|
|
|
+ } else if data.imageDpiIndex == 5 {
|
|
|
+ dpi = 600
|
|
|
+ } else {
|
|
|
+ dpi = 150
|
|
|
+ }
|
|
|
+
|
|
|
+ if (convert.convertType == .jpeg) {
|
|
|
+ (convert as! KMPDFConvertImage).imageType = .JPEG
|
|
|
+ (convert as! KMPDFConvertImage).imageDpi = dpi
|
|
|
+
|
|
|
+ } else if (convert.convertType == .png) {
|
|
|
+ (convert as! KMPDFConvertImage).imageType = .PNG
|
|
|
+ (convert as! KMPDFConvertImage).imageDpi = dpi
|
|
|
+ } else {
|
|
|
+ (convert as! KMPDFConvertImage).imageDpi = 150
|
|
|
+ }
|
|
|
+ case .html:
|
|
|
+ convert = KMPDFConvertHTML()
|
|
|
+ case .rtf:
|
|
|
+ convert = KMPDFConvertRTF()
|
|
|
+ case .json:
|
|
|
+ convert = KMPDFConvertJson()
|
|
|
+ if settingData.jsonType == .extractText {
|
|
|
+ convert.isAllInOneSheet = false
|
|
|
+ } else {
|
|
|
+ convert.isAllInOneSheet = true
|
|
|
+ }
|
|
|
+ case .text:
|
|
|
+ convert = KMPDFConvertText()
|
|
|
+
|
|
|
+ default:
|
|
|
+ KMPrint("不清楚")
|
|
|
+ }
|
|
|
+ return convert
|
|
|
+ }
|
|
|
+
|
|
|
+ //MARK: OCR
|
|
|
+ func convertOCRExport(data: KMBatchSettingItemViewModel, outputFolderPath: String) {
|
|
|
+ self.convertOCR(outputFolderPath: outputFolderPath, data: data as! KMOCRModel, filesData: self.filesData)
|
|
|
+ }
|
|
|
+
|
|
|
+ func convertOCR(outputFolderPath: String, data: KMOCRModel, filesData: [KMBatchProcessingTableViewModel]?) {
|
|
|
+ let filesData = self.filesData
|
|
|
+ for i in 0..<filesData.count {
|
|
|
+ let item = (filesData[i])
|
|
|
+ let document = CPDFDocument.init(url: URL(fileURLWithPath: item.filePath))
|
|
|
+ if document != nil {
|
|
|
+ //计算需要处理的页面
|
|
|
+
|
|
|
+ var fileName = item.filePath.deletingPathExtension.lastPathComponent
|
|
|
+ if ((fileName.isEmpty)) {
|
|
|
+ fileName = NSLocalizedString("Untitled", comment: "")
|
|
|
+ }
|
|
|
+ let path = outputFolderPath + "/" + fileName + ".pdf"
|
|
|
+
|
|
|
+ KMOCRManager.manager.convertBatchOCR(document: document!, saveFilePath: path, model: data, progress: { [unowned self] progress in
|
|
|
+ self.itemProgress(item: item, processValue: progress)
|
|
|
+ }) { [unowned self] document, text, error in
|
|
|
+ if error == nil {
|
|
|
+ self.itemSuccess(item: item)
|
|
|
+ } else {
|
|
|
+ self.itemFailure(item: item, error: error! as NSError)
|
|
|
+ }
|
|
|
+
|
|
|
+ if i == self.filesData.count - 1 {
|
|
|
+ self.batchSuccess()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //MARK: 压缩
|
|
|
+ func compressExport(data: KMBatchSettingItemViewModel, outputFolderPath: String) {
|
|
|
+ self.compressFile(outputFolderPath: outputFolderPath, data: (data as? KMCompressSettingModel)!, filesData: self.filesData)
|
|
|
+ }
|
|
|
+
|
|
|
+ func compressFile(outputFolderPath: String, data: KMCompressSettingModel, filesData: [KMBatchProcessingTableViewModel]) {
|
|
|
+ if filesData.count != 0 {
|
|
|
+ for i in 0..<filesData.count {
|
|
|
+ let item = filesData[i]
|
|
|
+ let document = CPDFDocument.init(url: URL(fileURLWithPath: item.filePath))
|
|
|
+ if document != nil {
|
|
|
+ var fileName = item.filePath.deletingPathExtension.lastPathComponent
|
|
|
+ if ((fileName.isEmpty)) {
|
|
|
+ fileName = NSLocalizedString("Untitled", comment: "")
|
|
|
+ }
|
|
|
+ let path = outputFolderPath + "/" + fileName + ".pdf"
|
|
|
+
|
|
|
+ KMCompressManager.shared.compress(documentURL: URL(fileURLWithPath: item.filePath), fileURL: URL(fileURLWithPath: path), limit: false, model: data) { currentPage, totalPages in
|
|
|
+ let progress = Float(currentPage) / Float(totalPages)
|
|
|
+ self.itemProgress(item: item, processValue: progress)
|
|
|
+ } cancelHandler: {
|
|
|
+ return false
|
|
|
+ } completionHandler: { [unowned self] isFinish in
|
|
|
+ if isFinish {
|
|
|
+ self.itemSuccess(item: item)
|
|
|
+ } else {
|
|
|
+ self.itemFailure(item: item, error: nil)
|
|
|
+ }
|
|
|
+
|
|
|
+ if i == self.filesData.count - 1 {
|
|
|
+ self.batchSuccess()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //MARK: 安全
|
|
|
+ func securityExport(data: KMBatchSettingItemViewModel, outputFolderPath: String) {
|
|
|
+ self.securityFile(outputFolderPath: outputFolderPath, data: data as! KMBatchSecurityViewModel, filesData: self.filesData)
|
|
|
+ }
|
|
|
+
|
|
|
+ func securityFile(outputFolderPath: String, data: KMBatchSecurityViewModel, filesData: [KMBatchProcessingTableViewModel]) {
|
|
|
+ if filesData.count != 0 {
|
|
|
+ for i in 0..<filesData.count {
|
|
|
+ let item = filesData[i]
|
|
|
+ let docuemt = CPDFDocument.init(url: URL(fileURLWithPath: item.filePath))
|
|
|
+ if (docuemt != nil) {
|
|
|
+ var fileName = item.filePath.deletingPathExtension.lastPathComponent
|
|
|
+ if ((fileName.isEmpty)) {
|
|
|
+ fileName = NSLocalizedString("Untitled", comment: "")
|
|
|
+ }
|
|
|
+ let path = outputFolderPath + "/" + fileName + ".pdf"
|
|
|
+
|
|
|
+ var options: [CPDFDocumentWriteOption : Any] = [:]
|
|
|
+ //开启密码
|
|
|
+ if data.isOpenPassword &&
|
|
|
+ !data.openPasswordString.isEmpty {
|
|
|
+ options.updateValue(data.openPasswordString, forKey: .userPasswordOption)
|
|
|
+ }
|
|
|
+//
|
|
|
+ //权限密码
|
|
|
+ if data.isPermission &&
|
|
|
+ !data.permissionString.isEmpty {
|
|
|
+ options.updateValue(data.permissionString, forKey: .ownerPasswordOption)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 限制打印
|
|
|
+ if data.restrictOptions.contains(.print) {
|
|
|
+ options.updateValue(false, forKey: .allowsPrintingOption)
|
|
|
+ } else {
|
|
|
+ options.updateValue(true, forKey: .allowsPrintingOption)
|
|
|
+ }
|
|
|
+
|
|
|
+ //限制复制
|
|
|
+ if data.restrictOptions.contains(.copy) {
|
|
|
+ options.updateValue(false, forKey: .allowsCopyingOption)
|
|
|
+ } else {
|
|
|
+ options.updateValue(true, forKey: .allowsCopyingOption)
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ let result = docuemt!.write(toFile: path, withOptions: options)
|
|
|
+// let result = docuemt!.write(to: URL(fileURLWithPath: path), withOptions: options)
|
|
|
+ if result {
|
|
|
+ KMPrint("成功")
|
|
|
+ self.itemSuccess(item: item)
|
|
|
+ } else {
|
|
|
+ KMPrint("失败")
|
|
|
+ self.itemFailure(item: item, error: nil)
|
|
|
+ }
|
|
|
+
|
|
|
+ if i == self.filesData.count - 1 {
|
|
|
+ self.batchSuccess()
|
|
|
+ NSWorkspace.shared.activateFileViewerSelecting([URL(fileURLWithPath: outputFolderPath)])
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ func waterMarkApplay(data: KMBatchSettingItemViewModel) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+// func waterMarkFile(data: KMWatermarkAdjectiveBaseModel, filesData: [KMBatchProcessingTableViewModel]?) {
|
|
|
+//
|
|
|
+// }
|
|
|
+
|
|
|
+ func backgroundApplay(data: KMBatchSettingItemViewModel) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ func backgroundFile(outputFolderPath: String, data: KMBackgroundModel, filesData: [KMBatchProcessingTableViewModel]?) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ func headAndFooterApplay(data: KMBatchSettingItemViewModel) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+// func headAndFooterFile(outputFolderPath: String, data: KMHeaderFooterModel, filesData: [KMBatchProcessingTableViewModel]?) {
|
|
|
+//
|
|
|
+// }
|
|
|
+
|
|
|
+ func batesApplay(data: KMBatchSettingItemViewModel) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ func batesFile(outputFolderPath: String, data: KMBatesModel, filesData: [KMBatchProcessingTableViewModel]?) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ func removeApplay(data: KMBatchSettingItemViewModel, outputFolderPath: String) {
|
|
|
+ if (data == nil) {
|
|
|
+ let alert = NSAlert()
|
|
|
+ alert.alertStyle = .critical
|
|
|
+ alert.messageText = "没有找到"
|
|
|
+ alert.runModal()
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ let panel = NSOpenPanel()
|
|
|
+ let button = NSButton.init(checkboxWithTitle: "保存后打开文档", target: nil, action: nil)
|
|
|
+ button.state = .on
|
|
|
+ panel.accessoryView = button
|
|
|
+ panel.canChooseFiles = false
|
|
|
+ panel.canChooseDirectories = true
|
|
|
+ panel.canCreateDirectories = true
|
|
|
+ panel.beginSheetModal(for: NSWindow.currentWindow()) { [self] response in
|
|
|
+ if response == .cancel {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ let outputFolderPath = panel.url?.path
|
|
|
+
|
|
|
+ self.removeFile(outputFolderPath: outputFolderPath!, data: data as! KMBatchRemoveViewModel, filesData: self.filesData)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ func removeFile(outputFolderPath: String, data: KMBatchRemoveViewModel, filesData: [KMBatchProcessingTableViewModel]) {
|
|
|
+ if filesData.count != 0 {
|
|
|
+ for i in 0..<filesData.count {
|
|
|
+ let item = filesData[i]
|
|
|
+// DispatchQueue.global().async {
|
|
|
+ var fileName = item.filePath.deletingPathExtension.lastPathComponent
|
|
|
+ if ((fileName.isEmpty)) {
|
|
|
+ fileName = NSLocalizedString("Untitled", comment: "")
|
|
|
+ }
|
|
|
+
|
|
|
+ let path = outputFolderPath + "/" + fileName + ".pdf"
|
|
|
+ let document = CPDFDocument.init(url: URL(fileURLWithPath: item.filePath))
|
|
|
+ if document != nil {
|
|
|
+ if (document!.allowsPrinting == false || document!.allowsCopying == false) {
|
|
|
+ let alert = NSAlert()
|
|
|
+ alert.alertStyle = .critical
|
|
|
+ alert.messageText = "此文档不允许修改"
|
|
|
+ alert.runModal()
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if (data.options.contains(.security)) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if (data.options.contains(.batesNumber)) {
|
|
|
+ let property = document!.bates()
|
|
|
+ property?.clear()
|
|
|
+ }
|
|
|
+ if (data.options.contains(.headerAndFooter)) {
|
|
|
+ let property = document!.headerFooter()
|
|
|
+ property?.clear()
|
|
|
+ }
|
|
|
+ if (data.options.contains(.background)) {
|
|
|
+ let property = document!.background()
|
|
|
+ property?.clear()
|
|
|
+ }
|
|
|
+ if (data.options.contains(.watermark)) {
|
|
|
+ let array: Array<CPDFWatermark> = document!.watermarks() ?? []
|
|
|
+ for model in array {
|
|
|
+ document!.removeWatermark(model)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (FileManager.default.fileExists(atPath: path)) {
|
|
|
+ try?FileManager.default.removeItem(atPath: path)
|
|
|
+ }
|
|
|
+
|
|
|
+ let result = document!.write(to: URL(fileURLWithPath: path))
|
|
|
+ if (result) {
|
|
|
+ KMPrint("removeFile成功")
|
|
|
+ self.itemSuccess(item: item)
|
|
|
+ } else {
|
|
|
+ KMPrint("removeFile失败")
|
|
|
+ self.itemFailure(item: item, error: nil)
|
|
|
+ }
|
|
|
+ if i == self.filesData.count - 1 {
|
|
|
+ self.batchSuccess()
|
|
|
+ }
|
|
|
+ NSWorkspace.shared.activateFileViewerSelecting([URL(fileURLWithPath: outputFolderPath)])
|
|
|
+ }
|
|
|
+// }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+//MARK: private
|
|
|
+extension KMBatchManager {
|
|
|
+ func fetchDocument(filePath: String, model: KMBatchProcessingTableViewModel) -> CPDFDocument {
|
|
|
+ var document = CPDFDocument(url: URL(fileURLWithPath: filePath))
|
|
|
+
|
|
|
+
|
|
|
+ if model.pageRange == .all {
|
|
|
+
|
|
|
+ } else {
|
|
|
+ let data = KMOCRModel()
|
|
|
+ data.pageRangeType = model.pageRange
|
|
|
+ data.pageRangeString = model.pageRangeString
|
|
|
+
|
|
|
+ let pages:[Int] = KMOCRManager.manager.fetchPageIndex(document: document!, model: data)
|
|
|
+
|
|
|
+ var tempDocument = CPDFDocument()
|
|
|
+ for i in 0..<pages.count {
|
|
|
+ let page = document?.page(at: UInt(i))
|
|
|
+ tempDocument?.insertPageObject(page, at: tempDocument?.pageCount ?? 0)
|
|
|
+ }
|
|
|
+
|
|
|
+ let fileName = filePath.deletingPathExtension.lastPathComponent
|
|
|
+ let isSuccess = tempDocument?.write(toFile: self.fetchTempFilePath(fileName: fileName))
|
|
|
+ if isSuccess != nil {
|
|
|
+ document = tempDocument
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return document ?? CPDFDocument()
|
|
|
+ }
|
|
|
+
|
|
|
+ func fetchTempFilePath(fileName: String) -> String {
|
|
|
+ let floderPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.applicationSupportDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last?.stringByAppendingPathComponent(Bundle.main.bundleIdentifier!).stringByAppendingPathComponent("BatchTemp")
|
|
|
+ let filePath = floderPath?.stringByAppendingPathComponent("\(fileName).pdf")
|
|
|
+
|
|
|
+ if let data = floderPath, !FileManager.default.fileExists(atPath: data) {
|
|
|
+ try?FileManager.default.createDirectory(atPath: data, withIntermediateDirectories: false)
|
|
|
+ }
|
|
|
+ if let data = filePath, !FileManager.default.fileExists(atPath: data) {
|
|
|
+ FileManager.default.createFile(atPath: data, contents: nil)
|
|
|
+ }
|
|
|
+ return filePath ?? ""
|
|
|
+ }
|
|
|
+
|
|
|
+ func removeTempFilePath(filePath: String) {
|
|
|
+ let fileName = filePath.deletingPathExtension.lastPathComponent
|
|
|
+ let path = self.fetchTempFilePath(fileName: fileName)
|
|
|
+
|
|
|
+ if (FileManager.default.fileExists(atPath: path)) {
|
|
|
+ try?FileManager.default.removeItem(atPath: path)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+//MARK: Alert
|
|
|
+extension KMBatchManager {
|
|
|
+ func batchUnkown() {
|
|
|
+ self.state = .unknow
|
|
|
+ NotificationCenter.default.post(name: NSNotification.Name(kBacthProcessNotification), object: nil)
|
|
|
+ }
|
|
|
+
|
|
|
+ func batchProgress() {
|
|
|
+ self.state = .processing
|
|
|
+ NotificationCenter.default.post(name: NSNotification.Name(kBacthProcessNotification), object: nil)
|
|
|
+ }
|
|
|
+
|
|
|
+ func batchSuccess() {
|
|
|
+ self.state = .complete
|
|
|
+ NotificationCenter.default.post(name: NSNotification.Name(kBacthProcessNotification), object: nil)
|
|
|
+ }
|
|
|
+
|
|
|
+ func batchFailure() {
|
|
|
+ self.state = .error
|
|
|
+ NotificationCenter.default.post(name: NSNotification.Name(kBacthProcessNotification), object: nil)
|
|
|
+ }
|
|
|
+
|
|
|
+ func itemProgress(item: KMBatchProcessingTableViewModel, processValue: Float) {
|
|
|
+ if processValue > 0.7 {
|
|
|
+ item.state = .loading70
|
|
|
+ } else {
|
|
|
+ item.state = .loading
|
|
|
+ }
|
|
|
+ NotificationCenter.default.post(name: NSNotification.Name(kBacthFilesProcessNotification), object: item)
|
|
|
+ }
|
|
|
+
|
|
|
+ func itemSuccess(item: KMBatchProcessingTableViewModel) {
|
|
|
+ self.removeTempFilePath(filePath: item.filePath)
|
|
|
+ item.state = .success
|
|
|
+ NotificationCenter.default.post(name: NSNotification.Name(kBacthFilesProcessNotification), object: item)
|
|
|
+ }
|
|
|
+
|
|
|
+ func itemFailure(item: KMBatchProcessingTableViewModel, error: NSError?) {
|
|
|
+ self.removeTempFilePath(filePath: item.filePath)
|
|
|
+ item.state = .error
|
|
|
+ NotificationCenter.default.post(name: NSNotification.Name(kBacthFilesProcessNotification), object: item)
|
|
|
+
|
|
|
+ guard let error = error else { return }
|
|
|
+ var errorString = ""
|
|
|
+ let myError: NSError = error as NSError
|
|
|
+ if myError.code == 1 {
|
|
|
+ errorString = NSLocalizedString("Password required or incorrect password. Please re-enter your password and try again", comment: "")
|
|
|
+ } else if myError.code == 2 {
|
|
|
+ errorString = NSLocalizedString("The license doesn't allow the permission", comment: "")
|
|
|
+ } else if myError.code == 3 {
|
|
|
+ errorString = NSLocalizedString("Malloc failure", comment: "")
|
|
|
+ } else if myError.code == 4 {
|
|
|
+ errorString = NSLocalizedString("Unknown error in processing conversion. Please try again later", comment: "")
|
|
|
+ } else if myError.code == 5 {
|
|
|
+ errorString = NSLocalizedString("Unknown error in processing PDF. Please try again later", comment: "")
|
|
|
+ } else if myError.code == 6 {
|
|
|
+ errorString = NSLocalizedString("File not found or could not be opened. Check if your file exists or choose another file to convert", comment: "")
|
|
|
+ } else if myError.code == 7 {
|
|
|
+ errorString = NSLocalizedString("File not in PDF format or corruptead. Change a PDF file and try again", comment: "")
|
|
|
+ } else if myError.code == 8 {
|
|
|
+ errorString = NSLocalizedString("Unsupported security scheme", comment: "")
|
|
|
+ } else if myError.code == 9 {
|
|
|
+ errorString = NSLocalizedString("Page not found or content error", comment: "")
|
|
|
+ } else {
|
|
|
+ errorString = NSLocalizedString("Table not found", comment: "")
|
|
|
+ }
|
|
|
+
|
|
|
+ let alert = NSAlert()
|
|
|
+ alert.alertStyle = .critical
|
|
|
+ alert.messageText = NSLocalizedString("Conversion Failed", comment: "")
|
|
|
+ alert.informativeText = errorString
|
|
|
+ alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
|
|
|
+ alert.runModal()
|
|
|
+ }
|
|
|
+}
|
|
|
+
|