Selaa lähdekoodia

[批量] - 水印编辑、添加

liujiajie 1 vuosi sitten
vanhempi
commit
3b6603d378

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

@@ -2519,6 +2519,9 @@
 		BB276A5C2B038D3A00AB5578 /* KMOCRPDFWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB276A5B2B038D3A00AB5578 /* KMOCRPDFWindowController.xib */; };
 		BB276A5D2B038D3A00AB5578 /* KMOCRPDFWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB276A5B2B038D3A00AB5578 /* KMOCRPDFWindowController.xib */; };
 		BB276A5E2B038D3A00AB5578 /* KMOCRPDFWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB276A5B2B038D3A00AB5578 /* KMOCRPDFWindowController.xib */; };
+		BB2A984A2B26A99A00647AF3 /* KMBatchAddWatermarkOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB2A98492B26A99A00647AF3 /* KMBatchAddWatermarkOperation.swift */; };
+		BB2A984B2B26A99A00647AF3 /* KMBatchAddWatermarkOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB2A98492B26A99A00647AF3 /* KMBatchAddWatermarkOperation.swift */; };
+		BB2A984C2B26A99A00647AF3 /* KMBatchAddWatermarkOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB2A98492B26A99A00647AF3 /* KMBatchAddWatermarkOperation.swift */; };
 		BB2C6AC928F4085200478A33 /* CPDFListView.m in Sources */ = {isa = PBXBuildFile; fileRef = BB2C6AC828F4085200478A33 /* CPDFListView.m */; };
 		BB2C6ACE28F41B9F00478A33 /* CPDFListView.m in Sources */ = {isa = PBXBuildFile; fileRef = BB2C6AC828F4085200478A33 /* CPDFListView.m */; };
 		BB2C6ACF28F41BA000478A33 /* CPDFListView.m in Sources */ = {isa = PBXBuildFile; fileRef = BB2C6AC828F4085200478A33 /* CPDFListView.m */; };
@@ -5168,6 +5171,7 @@
 		BB24D4A62977BE6700041659 /* KMRedactConfirmWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMRedactConfirmWindowController.xib; sourceTree = "<group>"; };
 		BB276A572B038D1100AB5578 /* KMOCRPDFWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMOCRPDFWindowController.swift; sourceTree = "<group>"; };
 		BB276A5B2B038D3A00AB5578 /* KMOCRPDFWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMOCRPDFWindowController.xib; sourceTree = "<group>"; };
+		BB2A98492B26A99A00647AF3 /* KMBatchAddWatermarkOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBatchAddWatermarkOperation.swift; sourceTree = "<group>"; };
 		BB2C6A7C28F26CEF00478A33 /* PDF_Master-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "PDF_Master-Bridging-Header.h"; sourceTree = "<group>"; };
 		BB2C6A7D28F26CEF00478A33 /* PDF_Master Pro-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "PDF_Master Pro-Bridging-Header.h"; sourceTree = "<group>"; };
 		BB2C6A7E28F26CF000478A33 /* PDF_Master DMG-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "PDF_Master DMG-Bridging-Header.h"; sourceTree = "<group>"; };
@@ -9817,6 +9821,7 @@
 				BB897228294B08720045787C /* KMWatermarkAdjectiveTopBarItemModel.swift */,
 				BB162E91294FFE020088E9D1 /* KMWatermarkModel.swift */,
 				BBC347FC295448DE008D2CD1 /* KMWatermarkTemplateModel.swift */,
+				BB2A98492B26A99A00647AF3 /* KMBatchAddWatermarkOperation.swift */,
 			);
 			path = Model;
 			sourceTree = "<group>";
@@ -12326,6 +12331,7 @@
 				BBB14A572978E75D00936EDB /* KMRedactMutilPageFlagWindowController.swift in Sources */,
 				ADAFDA132AE8DD6600F084BC /* KMAdvertisementCollectionViewItem.swift in Sources */,
 				899E0B092919244500B13D34 /* KMCustomTableRowView.swift in Sources */,
+				BB2A984A2B26A99A00647AF3 /* KMBatchAddWatermarkOperation.swift in Sources */,
 				BBB9B30D299A5D6D004F3235 /* KMCloudUploadOperationQueue.m in Sources */,
 				BB146FC6299DC0D100784A6A /* GTMSessionFetcherService.m in Sources */,
 				BB89722E294B08DE0045787C /* KMWatermarkViewController.swift in Sources */,
@@ -13812,6 +13818,7 @@
 				9F72D2092994BDAF00DCACF1 /* KMNotificationVC.swift in Sources */,
 				BB4DD04C299B296500E80DF6 /* KMCloudPathControl.swift in Sources */,
 				AD867F9129D9554F00F00440 /* KMBOTAOutlineItem.swift in Sources */,
+				BB2A984B2B26A99A00647AF3 /* KMBatchAddWatermarkOperation.swift in Sources */,
 				BB4A94A52B04DA0C00940F8B /* KMGOCRManagerNew.swift in Sources */,
 				BB0A823329C00400002C5C1B /* KMCommonEnum.swift in Sources */,
 				BB3198132AC5142900107371 /* NSMenu+KMExtension.swift in Sources */,
@@ -14576,6 +14583,7 @@
 				BBBE20952B21B18900509C4E /* KMPDFInsertWindowController.swift in Sources */,
 				BB147037299DC0D200784A6A /* OIDRegistrationResponse.m in Sources */,
 				9F221ED929A9EC0900978A59 /* KMFillSignTextPanel.swift in Sources */,
+				BB2A984C2B26A99A00647AF3 /* KMBatchAddWatermarkOperation.swift in Sources */,
 				9F0201742A1B488C00C9B673 /* KMAITranslationVC.swift in Sources */,
 				9F53D54D2AD6696B00CCF9D8 /* ComPDFUIConfig.swift in Sources */,
 				BB60138A2AD3A3CB00A76FB2 /* CPDFWidgetAnnotation+PDFListView.swift in Sources */,

+ 11 - 7
PDF Office/PDF Master/Class/PDFTools/Watermark/Controller/KMBatchOperateAddWatermarkViewController.swift

@@ -768,9 +768,9 @@ extension KMBatchOperateAddWatermarkViewController {
         for i in 0 ..< self.files!.count {
             let file = self.files![i]
             if (self.isBackground) {
-//                [file.addBackgroundInfo resetState];
+                file.addBackgroundInfo.resetState()
             } else {
-//                [file.addWatermarkInfo resetState];
+                file.addWatermarkInfo.resetState()
             }
         }
         return true
@@ -786,7 +786,7 @@ extension KMBatchOperateAddWatermarkViewController {
                 for fileURL in openPanel.urls {
                     self.choosePath = fileURL.path
                     if (!self.isBackground) {
-                        self._beginAddWatermark(obj as! KMPDFWatermarkData)
+                        self._beginAddWatermark(obj as! KMWatermarkModel)
                     } else {
                         self._beginAddBackground(obj as! KMBackgroundModel)
                     }
@@ -795,15 +795,18 @@ extension KMBatchOperateAddWatermarkViewController {
         }
     }
     
-    private func _beginAddWatermark(_ watermark: KMPDFWatermarkData) {
+    private func _beginAddWatermark(_ watermark: KMWatermarkModel) {
         self.hiddenWindowCloseButtonIfNeeded()
-    //    [self.successFilePathURLArray removeAllObjects];
+        self.successFilePathURLArray?.removeAll()
         for i in 0 ..< self.files!.count {
             let file = self.files![i]
             file.addWatermarkInfo.savePath = self.choosePath
     //        KMBatchAddWatermarkOperation *operation = [[[KMBatchAddWatermarkOperation alloc] initWithFile:file waterMark:watermark] autorelease];
     //        operation.delegate = self;
     //        [self.queue addOperation:operation];
+            let operation = KMBatchAddWatermarkOperation(file: file, waterMarkM: watermark)
+            operation.delegate = self
+            self.queue?.addOperation(operation)
         }
         if let cnt = self.queue?.operations.count, cnt > 0 {
             self.interfaceStatus = .Processing
@@ -827,9 +830,10 @@ extension KMBatchOperateAddWatermarkViewController {
     
     @objc private func _batchFilesCountNotification(_ notification: NSNotification) {
         if (!self.onlyManagerTemplate) {
-            let files = notification.object as? [AnyObject] ?? []
+            let files: Array? = notification.object as? [KMBatchOperateFile]
+            self.files? = files ?? []
             
-            if (files.count > 0) {
+            if (files?.count ?? 0 > 0) {
                 self._haveFiles = true
             } else {
                 self._haveFiles = false

+ 117 - 0
PDF Office/PDF Master/Class/PDFTools/Watermark/Model/KMBatchAddWatermarkOperation.swift

@@ -0,0 +1,117 @@
+//
+//  KMBatchAddWatermarkOperation.swift
+//  PDF Master
+//
+//  Created by liujiajie on 2023/12/11.
+//
+
+import Foundation
+
+class KMBatchAddWatermarkOperation: KMBatchOperation{
+    var waterMark: KMWatermarkModel?
+//    var waterObject: KMPDFWatermarkObject?
+    var pdfDocument: CPDFDocument!
+    
+    init(file: KMBatchOperateFile, waterMarkM: KMWatermarkModel) {
+        super.init(file: file)
+        self.waterMark = waterMarkM
+        self.pdfDocument = CPDFDocument(url: URL(fileURLWithPath: file.filePath))
+        if ((self.pdfDocument?.isLocked) != nil) {
+            self.pdfDocument?.unlock(withPassword: file.password)
+        }
+//        let docum = CPDFDocument(url: self.pdfDocument.documentURL)
+        if file.password.count > 0 {
+            self.pdfDocument?.unlock(withPassword: file.password)
+        }
+    }
+    
+    override func start() {
+        if !self.isCancelled {
+            self.delegate?.fileBeginOperate?(self.operateFile!, info: self.operateFile!.addWatermarkInfo)
+            willChangeValue(forKey: "isExecuting")
+            self.hasExcuting = true
+            didChangeValue(forKey: "isExecuting")
+            
+            var newArr = NSMutableArray()
+            for i in 0..<(self.operateFile?.addWatermarkInfo.pagesArray?.count ?? 0) {
+                let number = self.operateFile?.addWatermarkInfo.pagesArray![i]
+                newArr.add(number!.intValue - 1)
+            }
+            
+            if !FileManager.default.fileExists(atPath: self.operateFile!.filePath) {
+                self.delegate?.fileOperateFailed?(self.operateFile!, error: self.errorWithMsg(KMLocalizedString("File Not Exist", nil)), info: self.operateFile!.addWatermarkInfo)
+                
+                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!.addWatermarkInfo)
+                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!.addWatermarkInfo)
+                self.willChangeValue(forKey: "isFinished")
+                self.hasFinished = true
+                self.didChangeValue(forKey: "isFinished")
+                return
+            }
+            
+            if newArr.count < 1 {
+                let err = NSError(domain: "LocalError", code: 0, userInfo: [NSLocalizedDescriptionKey: KMLocalizedString("Invalid page range or the page number is out of range. Please try again.", nil)])
+                self.delegate?.fileOperateFailed?(self.operateFile!, error: err, info: self.operateFile!.addWatermarkInfo)
+                self.willChangeValue(forKey: "isFinished")
+                self.hasFinished = true
+                self.didChangeValue(forKey: "isFinished")
+            }
+            self.waterMark?.pagesString = newArr.componentsJoined(by: ",")
+//            let wmV = KMWatermarkView()
+//            wmV.addWatermark(model: self.waterMark, toPath: self.operateFile?.addWatermarkInfo.fetchDestinationFilepath()) { result in
+//                
+//            }
+            
+            KMWatermarkView.addWatermarkForOutSide(document: self.pdfDocument, model: self.waterMark!, toPath: (self.operateFile?.addWatermarkInfo.fetchDestinationFilepath())!) { success in
+                if success {
+                    self.delegate?.fileOperateSuccessed?(self.operateFile!, info: self.operateFile!.addWatermarkInfo)
+                }else {
+                    self.delegate?.fileOperateFailed?(self.operateFile!, error: self.errorWithMsg(KMLocalizedString("Failed", nil)), info: self.operateFile!.addWatermarkInfo)
+                }
+                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 {
+            operateFile!.removeWatermarkInfo.status = .Waiting
+            if FileManager.default.fileExists(atPath: (self.operateFile?.addWatermarkInfo.outPutPath)!) { try? FileManager.default.removeItem(atPath: (self.operateFile?.addWatermarkInfo.outPutPath)!)
+            }
+            self.delegate?.fileOperateCanceled?(self.operateFile!, info: self.operateFile!.addWatermarkInfo)
+            
+            willChangeValue(forKey: "isFinished")
+            hasFinished = true
+            didChangeValue(forKey: "isFinished")
+        } else {
+            willChangeValue(forKey: "isCancelled")
+            hasCanceled = true
+            didChangeValue(forKey: "isCancelled")
+        }
+    }
+    
+}
+

+ 1 - 0
PDF Office/PDF Master/Class/PDFTools/Watermark/New/KMWatermarkWindowController.swift

@@ -24,6 +24,7 @@ class KMWatermarkWindowController: KMBaseWindowController {
         // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
         if type == .edit {
             watermarkView.watermark = watermark
+            watermarkView.originalWatermark = watermark
         }
         watermarkView.isHiddenBatchBtn = isBatch
         watermarkView.type = type

+ 11 - 3
PDF Office/PDF Master/Class/PDFTools/Watermark/New/View/KMWatermarkView.swift

@@ -749,10 +749,10 @@ extension KMWatermarkView {
                 }
                 
                 if KMWatermarkManager.defaultManager.watermarks.contains(self.originalWatermark) {
-                    KMWatermarkManager.defaultManager.removeWatermark(watermark: self.originalWatermark)
-                    KMWatermarkManager.defaultManager.addWatermark(watermark: self.watermark)
+                    let _ = KMWatermarkManager.defaultManager.removeWatermark(watermark: self.originalWatermark)
+                    let _ = KMWatermarkManager.defaultManager.addWatermark(watermark: self.watermark)
                 } else {
-                    KMWatermarkManager.defaultManager.addWatermark(watermark: self.watermark)
+                    let _ = KMWatermarkManager.defaultManager.addWatermark(watermark: self.watermark)
                 }
             }
             
@@ -988,6 +988,14 @@ extension KMWatermarkView {
 }
 
 extension KMWatermarkView {
+    class func addWatermarkForOutSide(document: CPDFDocument, model: KMWatermarkModel, toPath: String, completion: @escaping (_ result: Bool) -> ()) {
+        DispatchQueue.main.async {
+            let wm = KMWatermarkView()
+            wm.pdfView = KMWatermarkPDFView()
+            wm.pdfView.document = document
+            wm.addWatermark(model: model, toPath: toPath, completion: completion)
+        }
+    }
     func addWatermark(model: KMWatermarkModel, toPath: String, completion: @escaping (_ result: Bool) -> ()) {
         DispatchQueue.global().async {
             let waterDocument = CPDFDocument(url: self.pdfView.document.documentURL)

+ 1 - 0
PDF Office/PDF Master/Class/PDFTools/Watermark/New/View/KMWatermarkView.xib

@@ -112,6 +112,7 @@
                                                     <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                                                     <size key="minSize" width="247" height="58"/>
                                                     <size key="maxSize" width="262" height="10000000"/>
+                                                    <color key="insertionPointColor" name="textInsertionPointColor" catalog="System" colorSpace="catalog"/>
                                                 </textView>
                                             </subviews>
                                         </clipView>