// // KMBatchRemoveHeaderFooterOperation.swift // PDF Reader Pro // // Created by liujiajie on 2023/12/1. // import Foundation class KMBatchRemoveHeaderFooterOperation: KMBatchOperation{ var isBates: Bool = false var pdfDocument: CPDFDocument? override init(file: KMBatchOperateFile) { super.init(file: file) } override func cancel() { if isExecuting { operateFile!.removeWatermarkInfo.status = .Waiting if FileManager.default.fileExists(atPath: self.currentParameter().outPutPath!) { try? FileManager.default.removeItem(atPath: self.currentParameter().outPutPath!) } self.delegate?.fileOperateCanceled?(self.operateFile!, info: self.operateFile!.removeWatermarkInfo) willChangeValue(forKey: "isFinished") hasFinished = true didChangeValue(forKey: "isFinished") } else { willChangeValue(forKey: "isCancelled") hasCanceled = true didChangeValue(forKey: "isCancelled") } } func currentParameter() -> KMBatchBaseParameter { if self.isBates { return self.operateFile!.removeBatesInfo } return self.operateFile!.removeHeaderFooterInfo } override func start() { self.pdfDocument = CPDFDocument(url: URL(fileURLWithPath: self.operateFile?.filePath ?? "")) if let data = self.pdfDocument?.isLocked, data { self.pdfDocument?.unlock(withPassword: self.operateFile?.password) } if !self.isCancelled { self.delegate?.fileBeginOperate?(self.operateFile!, info: self.currentParameter()) willChangeValue(forKey: "isExecuting") self.hasExcuting = true didChangeValue(forKey: "isExecuting") if !FileManager.default.fileExists(atPath: self.operateFile!.filePath) { self.delegate?.fileOperateFailed?(self.operateFile!, error: self.errorWithMsg(KMLocalizedString("File Not Exist", nil)), info: self.operateFile!.currentOperateInfo!) self.willChangeValue(forKey: "isFinished") self.hasFinished = true self.didChangeValue(forKey: "isFinished") return } if self.pdfDocument == nil { self.delegate?.fileOperateFailed?(self.operateFile!, error: self.errorWithMsg(KMLocalizedString("An error occurred while opening this document. The file is damaged and could not be repaired.", nil)), info: self.operateFile!.currentOperateInfo!) self.willChangeValue(forKey: "isFinished") self.hasFinished = true self.didChangeValue(forKey: "isFinished") return } if !self.pdfDocument!.allowsPrinting || !self.pdfDocument!.allowsCopying { self.delegate?.fileOperateFailed?(self.operateFile!, error: self.errorWithMsg(KMLocalizedString("This is a secured document. Editing is not permitted.", nil)), info: self.operateFile!.currentOperateInfo!) self.willChangeValue(forKey: "isFinished") self.hasFinished = true self.didChangeValue(forKey: "isFinished") return } if self.isBates { KMBatchRemoveHeaderFooterOperation.saveAsPDFRemoveAllHeaderFooterBates(self.pdfDocument!, password: self.operateFile?.password, toPath: self.operateFile!.currentOperateInfo!.fetchDestinationFilepath()!) { result in if result == 1 { self.delegate?.fileOperateSuccessed?(self.operateFile!, info: self.currentParameter()) } else { self.delegate?.fileOperateFailed?(self.operateFile!, error: self.defaultError() as NSError, info: self.currentParameter()) } self.willChangeValue(forKey: "isFinished") self.hasFinished = true self.didChangeValue(forKey: "isFinished") } } else { KMBatchRemoveHeaderFooterOperation.saveAsPDFRemoveAllHeaderFooter(self.pdfDocument!, password: self.operateFile?.password, toPath: self.operateFile!.currentOperateInfo!.fetchDestinationFilepath()!) { result in if result == 1 { self.delegate?.fileOperateSuccessed?(self.operateFile!, info: self.currentParameter()) } else { self.delegate?.fileOperateFailed?(self.operateFile!, error: self.defaultError() as NSError, info: self.currentParameter()) } self.willChangeValue(forKey: "isFinished") self.hasFinished = true self.didChangeValue(forKey: "isFinished") } } }else { willChangeValue(forKey: "isFinished") willChangeValue(forKey: "isExecuting") hasExcuting = false hasFinished = true didChangeValue(forKey: "isExecuting") didChangeValue(forKey: "isFinished") } } class func saveAsPDFRemoveAllHeaderFooterBates(_ pdfDocument: CPDFDocument, password: String?, toPath path: String, completionHandler handler: @escaping (Int) -> Void) { // let filePath = pdfDocument.documentURL.path let document = CPDFDocument(url: pdfDocument.documentURL) if let password = password { document?.unlock(withPassword: password) } let tBates = document?.bates() tBates?.clear() let documentPath = NSTemporaryDirectory() let tempPath = documentPath.stringByAppendingPathComponent(path.lastPathComponent) if FileManager.default.fileExists(atPath: tempPath) { try?FileManager.default.removeItem(atPath: tempPath) } let result = document?.write(to: URL(fileURLWithPath: tempPath)) if result ?? false { if FileManager.default.fileExists(atPath: path) { try?FileManager.default.removeItem(atPath: path) } try?FileManager.default.moveItem(atPath: tempPath, toPath: path) } else { try?FileManager.default.removeItem(atPath: tempPath) } DispatchQueue.main.async { if let result = result { handler(result ? 1 : 0) } } } class func saveAsPDFRemoveAllHeaderFooter(_ pdfDocument: CPDFDocument, password: String?, toPath path: String, completionHandler handler: @escaping (Int) -> Void) { // let filePath = pdfDocument.documentURL.path let document = CPDFDocument(url: pdfDocument.documentURL) if let password = password { document?.unlock(withPassword: password) } let tHeaderFooter = document?.headerFooter() tHeaderFooter?.clear() let documentPath = NSTemporaryDirectory() let tempPath = documentPath.stringByAppendingPathComponent(path.lastPathComponent) if FileManager.default.fileExists(atPath: tempPath) { try?FileManager.default.removeItem(atPath: tempPath) } let result = document?.write(to: URL(fileURLWithPath: tempPath)) if result ?? false { if FileManager.default.fileExists(atPath: path) { try?FileManager.default.removeItem(atPath: path) } try?FileManager.default.moveItem(atPath: tempPath, toPath: path) } else { try?FileManager.default.removeItem(atPath: tempPath) } DispatchQueue.main.async { if let result = result { handler(result ? 1 : 0) } } } func defaultError() -> Error { return self.errorWithMsg(KMLocalizedString("Failed", nil)) } }