Преглед на файлове

Merge branch 'develop_PDFReaderProNew' of git.kdan.cc:Mac_PDF/PDF_Office into develop_PDFReaderProNew

tangchao преди 1 година
родител
ревизия
4a376cf09a

+ 8 - 0
PDF Office/PDF Master.xcodeproj/project.pbxproj

@@ -3676,6 +3676,9 @@
 		BBD1F79C296FF7A600343885 /* KMPageEditSplitSettingModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD1F79B296FF7A600343885 /* KMPageEditSplitSettingModel.swift */; };
 		BBD1F79D296FF7A600343885 /* KMPageEditSplitSettingModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD1F79B296FF7A600343885 /* KMPageEditSplitSettingModel.swift */; };
 		BBD1F79E296FF7A600343885 /* KMPageEditSplitSettingModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD1F79B296FF7A600343885 /* KMPageEditSplitSettingModel.swift */; };
+		BBD25BF12B18768600EB85D4 /* KMCompressOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD25BF02B18768600EB85D4 /* KMCompressOperation.swift */; };
+		BBD25BF22B18768600EB85D4 /* KMCompressOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD25BF02B18768600EB85D4 /* KMCompressOperation.swift */; };
+		BBD25BF32B18768600EB85D4 /* KMCompressOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD25BF02B18768600EB85D4 /* KMCompressOperation.swift */; };
 		BBD512A12B0DE86C005BFE8A /* KMBotaLeftView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD512A02B0DE86C005BFE8A /* KMBotaLeftView.swift */; };
 		BBD512A22B0DE86C005BFE8A /* KMBotaLeftView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD512A02B0DE86C005BFE8A /* KMBotaLeftView.swift */; };
 		BBD512A32B0DE86C005BFE8A /* KMBotaLeftView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD512A02B0DE86C005BFE8A /* KMBotaLeftView.swift */; };
@@ -5500,6 +5503,7 @@
 		BBD1F792296FE92500343885 /* KMPageEditSplitSettingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPageEditSplitSettingView.swift; sourceTree = "<group>"; };
 		BBD1F797296FF78C00343885 /* KMPageEditSettingBaseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPageEditSettingBaseModel.swift; sourceTree = "<group>"; };
 		BBD1F79B296FF7A600343885 /* KMPageEditSplitSettingModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPageEditSplitSettingModel.swift; sourceTree = "<group>"; };
+		BBD25BF02B18768600EB85D4 /* KMCompressOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMCompressOperation.swift; sourceTree = "<group>"; };
 		BBD512A02B0DE86C005BFE8A /* KMBotaLeftView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBotaLeftView.swift; sourceTree = "<group>"; };
 		BBD54ED32A1CBD720012A230 /* NSView+KMExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSView+KMExtension.swift"; sourceTree = "<group>"; };
 		BBDA8A682A31B50C006A2C4E /* KMCustomStepperView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMCustomStepperView.swift; sourceTree = "<group>"; };
@@ -9001,6 +9005,7 @@
 			isa = PBXGroup;
 			children = (
 				BB403BA92B15CA6E00B3106D /* KMBatchConvertOperation.swift */,
+				BBD25BF02B18768600EB85D4 /* KMCompressOperation.swift */,
 			);
 			path = Operation;
 			sourceTree = "<group>";
@@ -12133,6 +12138,7 @@
 				AD867FC529DFFBC400F00440 /* KMAnnotationOutlineRowView.swift in Sources */,
 				BB4EEF2D29763EE7003A3537 /* KMRedactBaseWindowController.swift in Sources */,
 				ADC31FA62A0E0C1A00ED44A2 /* KMEditPropertyAlignmentView.swift in Sources */,
+				BBD25BF12B18768600EB85D4 /* KMCompressOperation.swift in Sources */,
 				BB3A81B52AC2C0F4006FC66C /* NSObject+KMExtension.swift in Sources */,
 				BB99ACCF292E2AEF0048AFD9 /* KMMergeCollectionViewItem.swift in Sources */,
 				BB7648EC29ECEEF400931039 /* KMAppearance.swift in Sources */,
@@ -13417,6 +13423,7 @@
 				BB49ECF7293F44DC00C82CA2 /* KMConvertExcelWindowController.swift in Sources */,
 				9F1FE4EB29406E4700E952CA /* NSBezierPath+MCAdditions.m in Sources */,
 				BBFE6E762930E53000142C01 /* KMMergePopoverViewController.swift in Sources */,
+				BBD25BF22B18768600EB85D4 /* KMCompressOperation.swift in Sources */,
 				ADD1B6BC29420B4A00C3FFF7 /* KMPrintPreviewView.swift in Sources */,
 				AD0FA4F129A8580D00EDEB50 /* KMComparativeTableView.swift in Sources */,
 				BB8931922B0C9CCD0054F58B /* KMStampManagerNew.swift in Sources */,
@@ -14057,6 +14064,7 @@
 				ADD1B6AD2941E97F00C3FFF7 /* KMPrintWindowController.swift in Sources */,
 				ADDEEA942AD796FF00EF675D /* KMSelfSignAnnotationFreeText.swift in Sources */,
 				9FDD0FB029534FDC000C4DAD /* KMCompLight.swift in Sources */,
+				BBD25BF32B18768600EB85D4 /* KMCompressOperation.swift in Sources */,
 				BBEB93F12AD6C72C00739573 /* KMPDFMergePageRangeTabelViewCell.swift in Sources */,
 				8942F80129260EC700389627 /* KMLeftMethodMode.swift in Sources */,
 				BB14703A299DC0D200784A6A /* OIDAuthorizationResponse.m in Sources */,

+ 14 - 14
PDF Office/PDF Master/Class/Batch/Data/KMBatchBaseParameter.swift

@@ -201,80 +201,80 @@ import Cocoa
         if self.isEqual(self.operateFile?.convertInfo) {
             // 在子类重写了这个方法,这里永远不会调用,所以不需要写
         } else if self.isEqual(self.operateFile?.addPasswordInfo) {
-            if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
+            if self.savePath?.count ?? 0 > 0 && self.operateFile?.filePath.count ?? 0 > 0 {
                 var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_SetPassword"
                 newfileName = newfileName.stringByAppendingPathExtension("pdf")
                 self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
                 return self.outPutPath
             }
         } else if self.isEqual(self.operateFile?.removePasswordInfo) {
-            if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
+            if self.savePath?.count ?? 0 > 0 && self.operateFile?.filePath.count ?? 0 > 0 {
                 var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_RemovePassword"
                 newfileName = newfileName.stringByAppendingPathExtension("pdf")
                 self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
                 return self.outPutPath
             }
         } else if self.isEqual(self.operateFile?.addWatermarkInfo) {
-            if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
+            if self.savePath?.count ?? 0 > 0 && self.operateFile?.filePath.count ?? 0 > 0 {
                 var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_Watermark"
                 newfileName = newfileName.stringByAppendingPathExtension("pdf")
                 self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
                 return self.outPutPath
             }
         } else if self.isEqual(self.operateFile?.removeWatermarkInfo) {
-            if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
+            if self.savePath?.count ?? 0 > 0 && self.operateFile?.filePath.count ?? 0 > 0 {
                 var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_RemoveWatermark"
                 newfileName = newfileName.stringByAppendingPathExtension("pdf")
                 self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
                 return self.outPutPath
             }
         } else if self.isEqual(self.operateFile?.addBackgroundInfo) {
-            if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
+            if self.savePath?.count ?? 0 > 0 && self.operateFile?.filePath.count ?? 0 > 0 {
                 var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_AddBackground"
                 newfileName = newfileName.stringByAppendingPathExtension("pdf")
                 self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
                 return self.outPutPath
             }
         } else if self.isEqual(self.operateFile?.removeBackgroundInfo) {
-            if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
+            if self.savePath?.count ?? 0 > 0 && self.operateFile?.filePath.count ?? 0 > 0 {
                 var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_RemoveBackground"
                 newfileName = newfileName.stringByAppendingPathExtension("pdf")
                 self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
                 return self.outPutPath
             }
         } else if self.isEqual(self.operateFile?.addHeaderFooterInfo) {
-            if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
+            if self.savePath?.count ?? 0 > 0 && self.operateFile?.filePath.count ?? 0 > 0 {
                 var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_AddHeaderFooter"
                 newfileName = newfileName.stringByAppendingPathExtension("pdf")
                 self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
                 return self.outPutPath
             }
         } else if self.isEqual(self.operateFile?.removeHeaderFooterInfo) {
-            if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
+            if self.savePath?.count ?? 0 > 0 && self.operateFile?.filePath.count ?? 0 > 0 {
                 var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_RemoveHeaderFooter"
                 newfileName = newfileName.stringByAppendingPathExtension("pdf")
                 self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
                 return self.outPutPath
             }
         } else if self.isEqual(self.operateFile?.addBatesInfo) {
-            if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
+            if self.savePath?.count ?? 0 > 0 && self.operateFile?.filePath.count ?? 0 > 0 {
                 var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_AddBates"
                 newfileName = newfileName.stringByAppendingPathExtension("pdf")
                 self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
                 return self.outPutPath
             }
         } else if self.isEqual(self.operateFile?.removeBatesInfo) {
-            if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
+            if self.savePath?.count ?? 0 > 0 && self.operateFile?.filePath.count ?? 0 > 0 {
                 var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_RemoveBates"
                 newfileName = newfileName.stringByAppendingPathExtension("pdf")
                 self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
                 return self.outPutPath
             }
         } else if self.isEqual(self.operateFile?.compressInfo) {
-            if ((self.savePath?.isEmpty) == nil) && ((self.operateFile?.filePath.isEmpty) == nil) {
-                var newfileName = self.operateFile!.filePath.lastPathComponent.deletingPathExtension + "_Compressed"
-                newfileName = newfileName.stringByAppendingPathExtension("pdf")
-                self.outPutPath = self.getUniqueFilePath(filePath: self.savePath!.stringByAppendingPathComponent(newfileName))
+            if self.savePath?.count ?? 0 > 0 && self.operateFile?.filePath.count ?? 0 > 0 {
+              
+                let filePath1 =  self.savePath?.stringByAppendingPathComponent(self.operateFile!.filePath.getLastComponentDeleteExtension + "_Compressed")
+                self.outPutPath = self.getUniqueFilePath(filePath: filePath1!.stringByAppendingPathExtension("pdf"))
                 return self.outPutPath
             }
         }

+ 99 - 0
PDF Office/PDF Master/Class/Batch/Operation/KMCompressOperation.swift

@@ -0,0 +1,99 @@
+//
+//  File.swift
+//  PDF Master
+//
+//  Created by liujiajie on 2023/11/30.
+//
+
+import Foundation
+
+typealias compressCallbackBlock = (_ isSuccess: Bool) -> Void
+
+class KMCompressOperation: KMBatchOperation{
+    var dpiValue: NSNumber = 0
+    var pdfDocument: CPDFDocument?
+    init(file: KMBatchOperateFile, compressValue dpiType: NSNumber) {
+        super.init(file: file)
+        self.dpiValue = dpiType
+        self.pdfDocument = CPDFDocument(url: URL(fileURLWithPath: file.filePath))
+        if ((self.pdfDocument?.isLocked) != nil) {
+            self.pdfDocument?.unlock(withPassword: file.password)
+        }
+    }
+    override func start() {
+        if !self.isCancelled {
+            
+            self.delegate?.fileBeginOperate?(self.operateFile!, info: self.operateFile!.compressInfo)
+            
+            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!.removePasswordInfo)
+                
+                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!.removeWatermarkInfo)
+                self.willChangeValue(forKey: "isFinished")
+                self.hasFinished = true
+                self.didChangeValue(forKey: "isFinished")
+                return
+            }
+            self.compressToPath(targetPath: (self.operateFile?.compressInfo.fetchDestinationFilepath()), documentPath: self.operateFile?.filePath ?? "", password: self.operateFile?.password ?? "", compressType: self.dpiValue) { isSuccess in
+                if isSuccess {
+                    self.delegate?.fileOperateSuccessed?(self.operateFile!, info: self.operateFile!.compressInfo)
+                }else{
+                    self.delegate?.fileOperateFailed?(self.operateFile!, error: self.errorWithMsg(KMLocalizedString("Failed", nil)), info: self.operateFile!.compressInfo)
+                }
+            }
+            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")
+        }
+    }
+    override func cancel() {
+        //        super.cancel()
+        if isExecuting {
+            self.operateFile?.compressInfo.status = .Waiting
+            if FileManager.default.fileExists(atPath: (operateFile?.compressInfo.outPutPath)!) { try? FileManager.default.removeItem(atPath: (operateFile!.compressInfo.outPutPath)!)
+            }
+            self.delegate?.fileOperateCanceled?(self.operateFile!, info: self.operateFile!.compressInfo)
+            
+            willChangeValue(forKey: "isFinished")
+            hasFinished = true
+            didChangeValue(forKey: "isFinished")
+        } else {
+            willChangeValue(forKey: "isCancelled")
+            hasCanceled = true
+            didChangeValue(forKey: "isCancelled")
+        }
+    }
+    func compressToPath(targetPath: String?, documentPath: String, password: String, compressType: NSNumber?, completeHandler: compressCallbackBlock) {
+        if self.pdfDocument!.isLocked {
+            let unlockSuccess = self.pdfDocument!.unlock(withPassword: password)
+            if !unlockSuccess {
+                completeHandler(false)
+                return
+            }
+        }
+        if compressType == nil {
+            
+            completeHandler(false)
+            return
+        }
+        let isSuccessfully = self.pdfDocument!.writeOptimize(to: URL(fileURLWithPath: targetPath ?? ""), withOptions: [CPDFDocumentOptimizeOption.imageQualityOption: compressType as Any])
+        completeHandler(isSuccessfully)
+    }
+}

+ 1 - 1
PDF Office/PDF Master/Class/Batch/WindowController/Base/KMBatchOperateBaseViewController.swift

@@ -138,7 +138,7 @@ class KMBatchOperateBaseViewController: NSViewController, KMBatchOperateProtocol
         if self.operateType == .Convert {
             operation = KMBatchConvertOperation(file: file, convertType: self.convertType!)
         } else if self.operateType == .Compress {
-            //            operation = KMCompressOperation(file: file)
+            operation = KMCompressOperation(file: file, compressValue: 60)
         } else if self.operateType == .AddPassword {
             // handle AddPassword operation
         } else if self.operateType == .RemovePassword {

+ 22 - 2
PDF Office/PDF Master/Class/Batch/WindowController/VC/KMBatchOperateCompressViewController.swift

@@ -37,7 +37,7 @@ class KMBatchOperateCompressViewController: KMBatchOperateBaseViewController{
     
     @IBOutlet var highLabel: NSTextField!
     
-    var currentType: NSNumber?
+    var currentType: NSNumber = 60
     var savePath: String?
     var haveFiles: Bool = false
     
@@ -147,7 +147,8 @@ class KMBatchOperateCompressViewController: KMBatchOperateBaseViewController{
         }
     }
     @objc func batchFilesCountNotification(notification: Notification) {
-        let files = notification.object as? [Any]
+        let files: Array? = notification.object as? [KMBatchOperateFile]
+        self.files? = files ?? []
         if files!.count > 0 {
             self.actionButton.layer?.backgroundColor = KMAppearance.Interactive.m0Color().cgColor
             self.actionButton.setTitleColor(KMAppearance.Layout.w0Color())
@@ -211,4 +212,23 @@ class KMBatchOperateCompressViewController: KMBatchOperateBaseViewController{
             self.highLabel.alphaValue = 0.4
         }
     }
+    
+    override func beginQueueOperation() {
+        // hiddenWindowCloseButtonIfNeeded()
+        self.successFilePathURLArray?.removeAll()
+        for i in 0..<self.files!.count {
+            let file = self.files![i]
+            if file.fileType == .PDF {
+                file.compressInfo.savePath = self.choosePath
+                if file.status == .Waiting {
+                    let operation = KMCompressOperation.init(file: file, compressValue: self.currentType)
+                    operation.delegate = self
+                    self.queue?.addOperation(operation)
+                }
+            }
+        }
+        if self.queue?.operations.count ?? 0 > 0 {
+            self.interfaceStatus = .Processing
+        }
+    }
 }