Browse Source

【2025】【压缩】接口串接

lizhe 2 months ago
parent
commit
42af63d604

+ 2 - 2
PDF Office/PDF Master/Base.lproj/Main.storyboard

@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="22155" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
+<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="22505" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
     <dependencies>
         <deployment identifier="macosx"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22155"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22505"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <scenes>

+ 28 - 30
PDF Office/PDF Master/Class/PDFTools/Compress/Controller/KMCompressWindowController.swift

@@ -72,8 +72,8 @@ class KMCompressWindowController: KMBaseWindowController {
             callBack(self, [documentURL])
         }
         
-        self.compressView.compressAction = { [weak self] view, value in
-            self?.compressButtonAction(value: value)
+        self.compressView.compressAction = { [weak self] view, model in
+            self?.compressButtonAction(model: model)
         }
     }
     
@@ -82,7 +82,7 @@ class KMCompressWindowController: KMBaseWindowController {
         self.compressView?.documentURL = self.documentURL
     }
     
-    private func compressButtonAction(value: Int, limit: Bool = false) {
+    private func compressButtonAction(model: KMCompressSettingModel, limit: Bool = false) {
         DispatchQueue.main.async {
             NSPanel.savePanel(self.window!, true) { panel in
                 var url: URL = self.documentURL
@@ -99,43 +99,41 @@ class KMCompressWindowController: KMBaseWindowController {
                 self.beginLoading()
                 DispatchQueue.global().async {
                     let docuemt = CPDFDocument.init(url: self.documentURL)
-                    if (docuemt?.isLocked)! && self.password != nil {
+                    if (docuemt?.isLocked)! && self.password.count != 0 {
                         docuemt?.unlock(withPassword: self.password)
                     }
                     
-                    let option = value
-                    
-                    var result = false
                     if (limit) {
-                        if let _document = docuemt, let _ = KMTools.saveWatermarkDocumentForCompress(document: _document, to: url!, imageQuality: option) {
-                            result = true
+                        if let _document = docuemt, let _ = KMTools.saveWatermarkDocumentForCompress(document: _document, to: url!, imageQuality: 20) {
+                            
                         }
                     } else {
-                        if let data = docuemt?.writeOptimize(to: url, withOptions: [.imageQualityOption : option]) {
-                            result = data
-                        }
-                    }
-                    
-                    if (result) {
-                        self._clearData()
-                    }
-                    
-                    DispatchQueue.main.async {
-                        self.endLoading()
-                        guard let callback = self.resultCallback else {
-                            if (result) {
-                                if isOpen { /// 开启文档
-                                    NSDocumentController.shared.km_safe_openDocument(withContentsOf: url!, display: true) { _, _, _ in
-                                        
+                        KMCompressManager.shared.compress(documentURL: self.documentURL, fileURL: url!, password: self.password, model: model) { [unowned self] (currentPage, totalPages) in
+                            
+                        } tCancelHandler: {
+                            return false
+                        } tCompletionHandler: { [unowned self] isFinish in
+                            DispatchQueue.main.async {
+                                if (isFinish) {
+                                    self._clearData()
+                                }
+                                self.endLoading()
+                                guard let callback = self.resultCallback else {
+                                    if (isFinish) {
+                                        if isOpen { /// 开启文档
+                                            NSDocumentController.shared.km_safe_openDocument(withContentsOf: url!, display: true) { _, _, _ in
+                                                
+                                            }
+                                        } else {
+                                            NSWorkspace.shared.activateFileViewerSelecting([url!])
+                                        }
                                     }
-                                } else {
-                                    NSWorkspace.shared.activateFileViewerSelecting([url!])
+                                    return
                                 }
+                                
+                                callback(isFinish, isOpen, url!, "")
                             }
-                            return
                         }
-                        
-                        callback(result, isOpen, url!, "")
                     }
                 }
             }

+ 132 - 0
PDF Office/PDF Master/Class/PDFTools/Compress/Manager/KMCompressManager.swift

@@ -0,0 +1,132 @@
+//
+//  KMCompressManager.swift
+//  PDF Reader Pro
+//
+//  Created by lizhe on 2024/12/17.
+//
+
+import Cocoa
+import ComPDFKit
+
+class KMCompressManager: NSObject {
+    static let shared = KMCompressManager()
+    
+    func compress(documentURL: URL,
+                  fileURL: URL,
+                  password: String = "",
+                  model: KMCompressSettingModel,
+                  tProgressHandler: (@escaping (Float, Float) -> Void),
+                  tCancelHandler: (@escaping () -> Bool),
+                  tCompletionHandler: (@escaping (Bool) -> Void)) {
+        DispatchQueue.global().async {
+            let docuemt = CPDFDocument.init(url: documentURL)
+            if (docuemt?.isLocked)! && password.count != 0 {
+                docuemt?.unlock(withPassword: password)
+            }
+            
+            self.compress(document: docuemt!, 
+                          fileURL: fileURL,
+                          model: model,
+                          tProgressHandler: tProgressHandler,
+                          tCancelHandler: tCancelHandler,
+                          tCompletionHandler: tCompletionHandler)
+        }
+    }
+    
+    func compress(document: CPDFDocument,
+                  fileURL: URL,
+                  model: KMCompressSettingModel,
+                  tProgressHandler: (@escaping (Float, Float) -> Void),
+                  tCancelHandler: (@escaping () -> Bool),
+                  tCompletionHandler: (@escaping (Bool) -> Void)) {
+        let url = fileURL
+        // 创建 imageOption 对象
+        var imageOption = CPDFOptimizeImageOption()
+        imageOption.uperPpi = Int32(model.ppi);
+        imageOption.targetPpi = Int32(model.maxPpi);
+        imageOption.compAlg = .CPDFCOMP_ALG_JPEG2000
+        imageOption.blockSize = 256
+        
+        if model.imageQualityType == .hight {
+            imageOption.quality = 100;
+        } else if model.imageQualityType == .medium {
+            imageOption.quality = 60;
+        } else if model.imageQualityType == .low {
+            imageOption.quality = 20;
+        }
+        
+        // 创建 optimizeFlag
+        var optimizeFlag: Int = 0
+        model.objectOptions.contains(.formAndAction) ? optimizeFlag |= Int(CPDF_OPTIMIZE_FLAG.CPDFOPTIMIZE_FLAG_RMFORMCOMMITIMPORTRESETACTION.rawValue) : nil
+        model.objectOptions.contains(.javaScript) ? optimizeFlag |= Int(CPDF_OPTIMIZE_FLAG.CPDFOPTIMIZE_FLAG_RMJSACTION.rawValue) : nil
+        model.objectOptions.contains(.thumbnails) ? optimizeFlag |= Int(CPDF_OPTIMIZE_FLAG.CPDFOPTIMIZE_FLAG_RMPAGETHUMBNAIL.rawValue) : nil
+        model.objectOptions.contains(.documentTags) ? optimizeFlag |= Int(CPDF_OPTIMIZE_FLAG.CPDFOPTIMIZE_FLAG_RMLABEL.rawValue) : nil
+        model.objectOptions.contains(.bookmarks) ? optimizeFlag |= Int(CPDF_OPTIMIZE_FLAG.CPDFOPTIMIZE_FLAG_RMBK.rawValue) : nil
+        
+        if model.userDataOptions.contains(.commentsFormAndMultimedia) {
+            optimizeFlag |= Int(CPDF_OPTIMIZE_FLAG.CPDFOPTIMIZE_FLAG_RMMULMEDIA.rawValue)
+            optimizeFlag |= Int(CPDF_OPTIMIZE_FLAG.CPDFOPTIMIZE_FLAG_RMFORM.rawValue)
+            optimizeFlag |= Int(CPDF_OPTIMIZE_FLAG.CPDFOPTIMIZE_FLAG_RMANNOT.rawValue)
+        }
+        
+        if model.userDataOptions.contains(.documentInfomationAndMetadata) {
+            optimizeFlag |= Int(CPDF_OPTIMIZE_FLAG.CPDFOPTIMIZE_FLAG_RMDOCINFO.rawValue)
+            optimizeFlag |= Int(CPDF_OPTIMIZE_FLAG.CPDFOPTIMIZE_FLAG_RMMEDTADATA.rawValue)
+        }
+        
+        model.userDataOptions.contains(.allObject) ? optimizeFlag |= Int(CPDF_OPTIMIZE_FLAG.CPDFOPTIMIZE_FLAG_RMOBJDATA.rawValue) : nil
+        model.userDataOptions.contains(.fileAttachments) ? optimizeFlag |= Int(CPDF_OPTIMIZE_FLAG.CPDFOPTIMIZE_FLAG_RMFILEATTACHMENT.rawValue) : nil
+        if model.userDataOptions.contains(.hiddenLayerContentAndFlattenVisibleLayers) {
+            optimizeFlag |= Int(CPDF_OPTIMIZE_FLAG.CPDFOPTIMIZE_FLAG_RMHIDERLAYER.rawValue)
+            optimizeFlag |= Int(CPDF_OPTIMIZE_FLAG.CPDFOPTIMIZE_FLAG_MERGEVISIBLELAYER.rawValue)
+        }
+        
+        model.otherDataOptions.contains(.invalidBookmarks) ? optimizeFlag |= Int(CPDF_OPTIMIZE_FLAG.CPDFOPTIMIZE_FLAG_RMINVABK.rawValue) : nil
+        model.otherDataOptions.contains(.invalidLinks) ? optimizeFlag |= Int(CPDF_OPTIMIZE_FLAG.CPDFOPTIMIZE_FLAG_RMINVALINK.rawValue) : nil
+        model.otherDataOptions.contains(.unrefrencedNamedDestinations) ? optimizeFlag |= Int(CPDF_OPTIMIZE_FLAG.CPDFOPTIMIZE_FLAG_RMBK.rawValue) : nil
+        model.otherDataOptions.contains(.pageContent) ? optimizeFlag |= Int(CPDF_OPTIMIZE_FLAG.CPDFOPTIMIZE_FLAG_RMUNUSEDTARGET.rawValue) : nil
+        
+        //数据转换
+        var imageOptionValue: NSValue?
+        // 使用 `withUnsafeBytes` 获取 UnsafeRawPointer
+        withUnsafeBytes(of: imageOption) { rawBufferPointer in
+            guard let baseAddress = rawBufferPointer.baseAddress else {
+                return
+            }
+            // 获取结构体的 Objective-C 类型编码
+            let objCType = KMCompressTool.encodeForStruct()
+//            let objCType = "{CPDFOptimizeImageOption=iiiii}"
+            imageOptionValue = NSValue(bytes: baseAddress, objCType: objCType)
+        }
+        
+        // 创建字典
+        let options: [String: Any] = [
+            CPDFOptimizeCOLImageOptionKey: imageOptionValue as Any,
+            CPDFOptimizeFlagKey: NSNumber(value: optimizeFlag)
+        ]
+        
+        // 调用方法
+        document.writeOptimize(to: url, withOptimizeOptions: options,
+                               progressHandler: { (currentPage, totalPages) in
+            // 进度处理
+            print("当前页:\(currentPage), 总页数:\(totalPages)")
+            tProgressHandler(currentPage, totalPages)
+        },
+                               cancelHandler: {
+            // 返回是否取消
+            let shouldCancel = false
+            return shouldCancel
+//            return tCancelHandler()
+        },
+                               completionHandler: { (finished) in
+            // 完成处理
+            if finished {
+                print("优化完成")
+            } else {
+                print("优化未完成")
+            }
+            
+            tCompletionHandler(finished)
+        })
+    }
+}

+ 17 - 0
PDF Office/PDF Master/Class/PDFTools/Compress/Tool/KMCompressTool.h

@@ -0,0 +1,17 @@
+//
+//  KMCompressTool.h
+//  PDF Reader Pro
+//
+//  Created by lizhe on 2024/12/17.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KMCompressTool : NSObject
+// 获取类型编码的函数
++ (const char *)encodeForStruct;
+@end
+
+NS_ASSUME_NONNULL_END

+ 15 - 0
PDF Office/PDF Master/Class/PDFTools/Compress/Tool/KMCompressTool.m

@@ -0,0 +1,15 @@
+//
+//  KMCompressTool.m
+//  PDF Reader Pro
+//
+//  Created by lizhe on 2024/12/17.
+//
+
+#import "KMCompressTool.h"
+#import <ComPDFKit/ComPDFKit.h>
+
+@implementation KMCompressTool
++ (const char *)encodeForStruct {
+    return @encode(CPDFOptimizeImageOption);
+}
+@end

+ 4 - 0
PDF Office/PDF Master/Class/PDFTools/Compress/View/KMCompressContentView.swift

@@ -166,6 +166,10 @@ extension KMCompressContentView {
         
         compressSettingViewController?.modelChangeAction = { [unowned self] resultControler, tModel in
             self.updateType(type: tModel.modelsType)
+            
+            guard let callBack = selectTypeAction else { return }
+            
+            callBack(self, tModel)
         }
         
     }

+ 5 - 3
PDF Office/PDF Master/Class/PDFTools/Compress/View/KMCompressView.swift

@@ -10,7 +10,7 @@ import KMComponentLibrary
 
 typealias KMCompressViewCancelAction = (_ view: KMCompressView ) -> Void
 typealias KMCompressViewBatchAction = (_ view: KMCompressView ) -> Void
-typealias KMCompressViewCompressAction = (_ view: KMCompressView, _ compressValue: Int) -> Void
+typealias KMCompressViewCompressAction = (_ view: KMCompressView, _ model: KMCompressSettingModel) -> Void
 
 class KMCompressView: BaseXibView {
 
@@ -32,6 +32,8 @@ class KMCompressView: BaseXibView {
     var batchAction: KMCompressViewBatchAction?
     var compressAction: KMCompressViewCompressAction?
     
+    var model: KMCompressSettingModel = KMCompressSettingModel(modelsType: .standard)
+    
     var documentURL: URL? {
         didSet {
             self.reloadData()
@@ -64,7 +66,7 @@ class KMCompressView: BaseXibView {
         progressSizeLabel.isHidden = true
         
         self.compressContentView.selectTypeAction = {[unowned self] view, tModel in
-            
+            self.model = tModel
         }
         
         compressButton.properties = ComponentButtonProperty(type: .primary, size: .xs, buttonText: KMLocalizedString("Compress"), keepPressState: false)
@@ -131,6 +133,6 @@ extension KMCompressView {
         guard let callBack = compressAction else { return }
         
         
-        callBack(self, 0)
+        callBack(self, self.model)
     }
 }

+ 2 - 2
PDF Office/PDF Master/Class/PDFTools/Compress/View/KMCompressView.xib

@@ -200,9 +200,9 @@
                                 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                                 <subviews>
                                     <customView translatesAutoresizingMaskIntoConstraints="NO" id="gZ6-Xa-9cX" customClass="ComponentButton" customModule="KMComponentLibrary">
-                                        <rect key="frame" x="24" y="16" width="62" height="32"/>
+                                        <rect key="frame" x="24" y="16" width="80" height="32"/>
                                         <constraints>
-                                            <constraint firstAttribute="width" constant="62" id="g6b-jx-9PL"/>
+                                            <constraint firstAttribute="width" constant="80" id="g6b-jx-9PL"/>
                                             <constraint firstAttribute="height" constant="32" id="kOX-F2-tFW"/>
                                         </constraints>
                                     </customView>

+ 1 - 0
PDF Office/PDF Master/Class/PDFTools/Compress/View/SettingView/Model/KMCompressSettingModel.swift

@@ -150,5 +150,6 @@ class KMCompressSettingModel: NSObject {
         self.objectOptions = KMCompressObjectOptions(rawValue: settings["objectOptions"] as? Int ?? 0)
         self.userDataOptions = KMCompressUserDataOptions(rawValue: settings["userDataOptions"] as? Int ?? 0)
         self.otherDataOptions = KMCompressOtherDataOptions(rawValue: settings["otherDataOptions"] as? Int ?? 0)
+        
     }
 }

+ 3 - 0
PDF Office/PDF Master/PDF_Reader_Pro Edition-Bridging-Header.h

@@ -115,3 +115,6 @@
 #import "KMPDFBookletWindowController.h"
 #import "KMPDFMultiplePrintWindowController.h"
 #import "KMPDFPosterPrintWindowController.h"
+
+//
+#import "KMCompressTool.h"

+ 34 - 0
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -2036,6 +2036,12 @@
 		ADD3EBC92D102DFF005B711B /* KMCompressSettingManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADD3EBC82D102DFF005B711B /* KMCompressSettingManager.swift */; };
 		ADD3EBCA2D102DFF005B711B /* KMCompressSettingManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADD3EBC82D102DFF005B711B /* KMCompressSettingManager.swift */; };
 		ADD3EBCB2D102DFF005B711B /* KMCompressSettingManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADD3EBC82D102DFF005B711B /* KMCompressSettingManager.swift */; };
+		ADD3EBD72D111983005B711B /* KMCompressManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADD3EBD62D111983005B711B /* KMCompressManager.swift */; };
+		ADD3EBD82D111983005B711B /* KMCompressManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADD3EBD62D111983005B711B /* KMCompressManager.swift */; };
+		ADD3EBD92D111983005B711B /* KMCompressManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADD3EBD62D111983005B711B /* KMCompressManager.swift */; };
+		ADD3EBE22D116BAD005B711B /* KMCompressTool.m in Sources */ = {isa = PBXBuildFile; fileRef = ADD3EBE12D116BAD005B711B /* KMCompressTool.m */; };
+		ADD3EBE32D116BAD005B711B /* KMCompressTool.m in Sources */ = {isa = PBXBuildFile; fileRef = ADD3EBE12D116BAD005B711B /* KMCompressTool.m */; };
+		ADD3EBE42D116BAD005B711B /* KMCompressTool.m in Sources */ = {isa = PBXBuildFile; fileRef = ADD3EBE12D116BAD005B711B /* KMCompressTool.m */; };
 		ADD56F572BB3F48300E87ED9 /* KMFreeTextStylesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = ADD56F542BB3F48200E87ED9 /* KMFreeTextStylesViewController.m */; };
 		ADD56F582BB3F48300E87ED9 /* KMFreeTextStylesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = ADD56F542BB3F48200E87ED9 /* KMFreeTextStylesViewController.m */; };
 		ADD56F592BB3F48300E87ED9 /* KMFreeTextStylesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = ADD56F542BB3F48200E87ED9 /* KMFreeTextStylesViewController.m */; };
@@ -5985,6 +5991,9 @@
 		ADD1B7052946CBB600C3FFF7 /* KMBaseTextFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBaseTextFormatter.swift; sourceTree = "<group>"; };
 		ADD1B70929471FA500C3FFF7 /* KMPrintChoosePresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPrintChoosePresenter.swift; sourceTree = "<group>"; };
 		ADD3EBC82D102DFF005B711B /* KMCompressSettingManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMCompressSettingManager.swift; sourceTree = "<group>"; };
+		ADD3EBD62D111983005B711B /* KMCompressManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMCompressManager.swift; sourceTree = "<group>"; };
+		ADD3EBE02D116BAD005B711B /* KMCompressTool.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KMCompressTool.h; sourceTree = "<group>"; };
+		ADD3EBE12D116BAD005B711B /* KMCompressTool.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KMCompressTool.m; sourceTree = "<group>"; };
 		ADD56F542BB3F48200E87ED9 /* KMFreeTextStylesViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KMFreeTextStylesViewController.m; sourceTree = "<group>"; };
 		ADD56F552BB3F48200E87ED9 /* KMFreeTextStylesViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMFreeTextStylesViewController.xib; sourceTree = "<group>"; };
 		ADD56F562BB3F48200E87ED9 /* KMFreeTextStylesViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMFreeTextStylesViewController.h; sourceTree = "<group>"; };
@@ -9833,6 +9842,23 @@
 			path = Manager;
 			sourceTree = "<group>";
 		};
+		ADD3EBD42D111968005B711B /* Manager */ = {
+			isa = PBXGroup;
+			children = (
+				ADD3EBD62D111983005B711B /* KMCompressManager.swift */,
+			);
+			path = Manager;
+			sourceTree = "<group>";
+		};
+		ADD3EBDA2D11682C005B711B /* Tool */ = {
+			isa = PBXGroup;
+			children = (
+				ADD3EBE02D116BAD005B711B /* KMCompressTool.h */,
+				ADD3EBE12D116BAD005B711B /* KMCompressTool.m */,
+			);
+			path = Tool;
+			sourceTree = "<group>";
+		};
 		ADD56F532BB3F48200E87ED9 /* KMFreeTextStylesViewController */ = {
 			isa = PBXGroup;
 			children = (
@@ -13220,6 +13246,8 @@
 		BBFE6E7B2930EB8F00142C01 /* Compress */ = {
 			isa = PBXGroup;
 			children = (
+				ADD3EBDA2D11682C005B711B /* Tool */,
+				ADD3EBD42D111968005B711B /* Manager */,
 				BBFE6E852932108C00142C01 /* View */,
 				BBFE6E7C2930EBAA00142C01 /* Controller */,
 			);
@@ -15631,6 +15659,7 @@
 				ADDF83772B391A5D00A81A4E /* CDSignatureCertificateCustomViewController.swift in Sources */,
 				BB7E59F62BBA427C0021E63D /* KMBrowserWindow.swift in Sources */,
 				BB7BC4D82AD3D6B700D6BEE6 /* PDFListView+KMExtensions.swift in Sources */,
+				ADD3EBE22D116BAD005B711B /* KMCompressTool.m in Sources */,
 				ADBC2CFA299CA6B9006280C8 /* KMPrintDuplexPrintingSetView.swift in Sources */,
 				654A5A8C2C8AE200001FBD4B /* KMAnalytics+KMExtensions.swift in Sources */,
 				AD3AAD382B0B7B1900DE5FE7 /* KMCompareToolbar.swift in Sources */,
@@ -15657,6 +15686,7 @@
 				BB7289E02B8838D8004B53B5 /* KMDataManager.swift in Sources */,
 				6536477A2CDCA47300CDB13E /* KMBatchOperateImageToPDFViewController.swift in Sources */,
 				AD07BCC72D02CBB20075054B /* KMCompressModesTableCellView.swift in Sources */,
+				ADD3EBD72D111983005B711B /* KMCompressManager.swift in Sources */,
 				BB6347B42AF224D600F5438E /* KMConvertCollectionViewHeader.swift in Sources */,
 				AD055E7E2B88294F0035F824 /* SKBookmarkSheetController.m in Sources */,
 				651675C72CE3312000019A20 /* KMBOTAOutlineCellView.swift in Sources */,
@@ -17372,6 +17402,7 @@
 				65202DF22CE46DA700A204B5 /* KMNColorTools.swift in Sources */,
 				BBD8EE942B8EC86A00EB05FE /* AutoSaveFileItem.m in Sources */,
 				9F0CB536298656F900007028 /* KMDesignToken+BorderWidthLeft.swift in Sources */,
+				ADD3EBE32D116BAD005B711B /* KMCompressTool.m in Sources */,
 				F337CC462CC7EEE100D46AF4 /* KMNPDFInsertPDFWindowController.swift in Sources */,
 				BB716D592CDDB6F9009787ED /* KMHeaderTemplateItem.swift in Sources */,
 				BBA8B7AB2935DC120097D183 /* KMRemovePasswordResultTipView.swift in Sources */,
@@ -17559,6 +17590,7 @@
 				ADE86AF82B0AF59A00414DFA /* KMCompareContentSettingView.swift in Sources */,
 				BBFA1CDB2B60DBF90053AD4A /* KMScreenShotMaskViewController.swift in Sources */,
 				BB38D2D22D047A920039F106 /* KMMeasureController.swift in Sources */,
+				ADD3EBD82D111983005B711B /* KMCompressManager.swift in Sources */,
 				656C1E532CD0D27D00295F82 /* KMConvertHtmlSettingView.swift in Sources */,
 				BB981E532AD4F638001988CA /* KMCoverButton.swift in Sources */,
 				BB5F8A0F29BB04F000365ADB /* GBDeviceInfo_OSX.m in Sources */,
@@ -17963,6 +17995,7 @@
 				9FE0BBED2B0F242C00CD1CAC /* NSUserDefaults_KMExtension.swift in Sources */,
 				BBBB6CDC2AD15B900035AA66 /* CPDFFreeTextAnnotation+PDFListView.swift in Sources */,
 				658FDBB42C9D90CE00EFA72E /* KMNoteFilterStateCollevtionViewItem.swift in Sources */,
+				ADD3EBD92D111983005B711B /* KMCompressManager.swift in Sources */,
 				9FE0BBF22B0F2FB000CD1CAC /* KMAnnotationLineWindowController.swift in Sources */,
 				F37322F5292DF9410013862C /* CSelfSignAnnotationFreeText.m in Sources */,
 				BB031B622C47BB080099F7AD /* KMUserFeekbackWindowController.swift in Sources */,
@@ -18833,6 +18866,7 @@
 				BBB789A12BE8BF2400F7E09C /* AIChatView.swift in Sources */,
 				F3A0F85B2CC940DD00E7373F /* KMNPDFInsertBlankWindowController.swift in Sources */,
 				ADE86A9F2B031FDB00414DFA /* KMCompareWindowController.swift in Sources */,
+				ADD3EBE42D116BAD005B711B /* KMCompressTool.m in Sources */,
 				BBB789A72BE8BF2400F7E09C /* AIChatStringResultItem.swift in Sources */,
 				BB9AEB4F2D0FC9E1004BF8D2 /* FormsButtonController.swift in Sources */,
 				BBF8A4052AE8E10100788BAC /* KMBatchConvertParameter.swift in Sources */,

+ 133 - 23
PDF Office/PDF Reader Pro.xcodeproj/xcuserdata/lizhe.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -1720,6 +1720,21 @@
                   endingLineNumber = "296"
                   offsetFromSymbolStart = "164">
                </Location>
+               <Location
+                  uuid = "F8F24101-9DC5-434C-B667-C4DB164E2A5A - f9fe0ffd478f3d37"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "closure #3 (PDF_Reader_Pro.KMAnnotationScreenAuthorViewItem, Swift.String) -&gt; () in PDF_Reader_Pro.KMAnnotationScreenCollectionView.collectionView(_: __C.NSCollectionView, itemForRepresentedObjectAt: Foundation.IndexPath) -&gt; __C.NSCollectionViewItem"
+                  moduleName = "PDF Reader Pro"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Volumes/Data/Company/kdan/Projects/PDF%20Office/PDF%20Office/PDF%20Master/Class/PDFWindowController/Side/LeftSide/Annotation/KMScreenViewController/ScreenCollectionView/KMAnnotationScreenCollectionView.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "296"
+                  endingLineNumber = "296"
+                  offsetFromSymbolStart = "816">
+               </Location>
             </Locations>
          </BreakpointContent>
       </BreakpointProxy>
@@ -2176,6 +2191,21 @@
                   endingLineNumber = "401"
                   offsetFromSymbolStart = "500">
                </Location>
+               <Location
+                  uuid = "47588C8D-596C-4B68-AD2C-1E0054C9E8EF - dabaaf050e78ad37"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "PDF_Reader_Pro.KMAnnotationScreenCollectionView.applyButtonAction(sender: __C.NSButton) -&gt; ()"
+                  moduleName = "PDF Reader Pro"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Volumes/Data/Company/kdan/Projects/PDF%20Office/PDF%20Office/PDF%20Master/Class/PDFWindowController/Side/LeftSide/Annotation/KMScreenViewController/ScreenCollectionView/KMAnnotationScreenCollectionView.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "401"
+                  endingLineNumber = "401"
+                  offsetFromSymbolStart = "692">
+               </Location>
             </Locations>
          </BreakpointContent>
       </BreakpointProxy>
@@ -15307,7 +15337,7 @@
             endingColumnNumber = "9223372036854775807"
             startingLineNumber = "2525"
             endingLineNumber = "2525"
-            landmarkName = "aiTranslationPDFFileAction()"
+            landmarkName = "clickChildTool(type:index:)"
             landmarkType = "7">
             <Locations>
                <Location
@@ -15430,6 +15460,21 @@
                   endingLineNumber = "2526"
                   offsetFromSymbolStart = "44">
                </Location>
+               <Location
+                  uuid = "7F14AB45-ACF4-4F59-BAB6-37C63251859E - d62819a3258cb198"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "closure #4 (Any...) -&gt; () in closure #1 @Sendable () async -&gt; () in PDF_Reader_Pro.KMMainViewController.clickChildTool(type: PDF_Reader_Pro.KMToolbarType, index: Swift.Int) -&gt; ()"
+                  moduleName = "PDF Reader Pro"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Volumes/Data/Company/kdan/Projects/PDF%20Office/PDF%20Office/PDF%20Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "2525"
+                  endingLineNumber = "2525"
+                  offsetFromSymbolStart = "916">
+               </Location>
             </Locations>
          </BreakpointContent>
       </BreakpointProxy>
@@ -15751,7 +15796,7 @@
             endingColumnNumber = "9223372036854775807"
             startingLineNumber = "2536"
             endingLineNumber = "2536"
-            landmarkName = "_aiTranslationPDFFileAction()"
+            landmarkName = "clickChildTool(type:index:)"
             landmarkType = "7">
             <Locations>
                <Location
@@ -15874,6 +15919,21 @@
                   endingLineNumber = "2536"
                   offsetFromSymbolStart = "2012">
                </Location>
+               <Location
+                  uuid = "6C8D4B68-1D1A-4571-9B71-3FDAD415B289 - 671f9f5a9fe07187"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "(1) suspend resume partial function for closure #1 @Sendable () async -&gt; () in PDF_Reader_Pro.KMMainViewController.clickChildTool(type: PDF_Reader_Pro.KMToolbarType, index: Swift.Int) -&gt; ()"
+                  moduleName = "PDF Reader Pro"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Volumes/Data/Company/kdan/Projects/PDF%20Office/PDF%20Office/PDF%20Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "2536"
+                  endingLineNumber = "2536"
+                  offsetFromSymbolStart = "6300">
+               </Location>
             </Locations>
          </BreakpointContent>
       </BreakpointProxy>
@@ -16396,7 +16456,7 @@
             endingColumnNumber = "9223372036854775807"
             startingLineNumber = "3088"
             endingLineNumber = "3088"
-            landmarkName = "clickChildTool(type:index:)"
+            landmarkName = "showBatchWindow(type:filepaths:)"
             landmarkType = "7">
             <Locations>
                <Location
@@ -16564,6 +16624,36 @@
                   endingLineNumber = "3088"
                   offsetFromSymbolStart = "132">
                </Location>
+               <Location
+                  uuid = "E6B1CDBF-AE0C-4A94-ACB5-2A41B09EAD97 - 55c1c747794648f9"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "PDF_Reader_Pro.KMMainViewController.showBatchWindow(type: PDF_Reader_Pro.KMBatchOperationType, filepaths: Swift.Optional&lt;Swift.Array&lt;Swift.String&gt;&gt;) -&gt; ()"
+                  moduleName = "PDF Reader Pro"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Volumes/Data/Company/kdan/Projects/PDF%20Office/PDF%20Office/PDF%20Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "3088"
+                  endingLineNumber = "3088"
+                  offsetFromSymbolStart = "168">
+               </Location>
+               <Location
+                  uuid = "E6B1CDBF-AE0C-4A94-ACB5-2A41B09EAD97 - 55c1c747794648f9"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "PDF_Reader_Pro.KMMainViewController.showBatchWindow(type: PDF_Reader_Pro.KMBatchOperationType, filepaths: Swift.Optional&lt;Swift.Array&lt;Swift.String&gt;&gt;) -&gt; ()"
+                  moduleName = "PDF Reader Pro"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Volumes/Data/Company/kdan/Projects/PDF%20Office/PDF%20Office/PDF%20Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "3088"
+                  endingLineNumber = "3088"
+                  offsetFromSymbolStart = "404">
+               </Location>
             </Locations>
          </BreakpointContent>
       </BreakpointProxy>
@@ -18391,6 +18481,21 @@
                   endingLineNumber = "97"
                   offsetFromSymbolStart = "428">
                </Location>
+               <Location
+                  uuid = "DD0FB332-6DED-4A78-B517-B43A6CC38B81 - a4e6c9d5af09c63d"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "PDF_Reader_Pro.KMMainDocument.save(to: Foundation.URL, ofType: Swift.String, for: __C.NSSaveOperationType, delegate: Swift.Optional&lt;Any&gt;, didSave: Swift.Optional&lt;ObjectiveC.Selector&gt;, contextInfo: Swift.Optional&lt;Swift.UnsafeMutableRawPointer&gt;) -&gt; ()"
+                  moduleName = "PDF Reader Pro"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Volumes/Data/Company/kdan/Projects/PDF%20Office/PDF%20Office/PDF%20Master/Class/Document/KMMainDocument.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "96"
+                  endingLineNumber = "96"
+                  offsetFromSymbolStart = "512">
+               </Location>
             </Locations>
          </BreakpointContent>
       </BreakpointProxy>
@@ -19996,6 +20101,21 @@
                   endingLineNumber = "1013"
                   offsetFromSymbolStart = "944">
                </Location>
+               <Location
+                  uuid = "1B44CB86-7C07-4216-880F-8C757C41A71B - d9737f36a5406ad4"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "PDF_Reader_Pro.KMMainDocument.printOperation(withSettings: Swift.Dictionary&lt;__C.NSPrintInfoAttributeKey, Any&gt;) throws -&gt; __C.NSPrintOperation"
+                  moduleName = "PDF Reader Pro"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Volumes/Data/Company/kdan/Projects/PDF%20Office/PDF%20Office/PDF%20Master/Class/Document/KMMainDocument.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "1013"
+                  endingLineNumber = "1013"
+                  offsetFromSymbolStart = "752">
+               </Location>
             </Locations>
          </BreakpointContent>
       </BreakpointProxy>
@@ -22316,9 +22436,7 @@
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
             startingLineNumber = "3870"
-            endingLineNumber = "3870"
-            landmarkName = "areaSettingWindowController(_:measureInfo:)"
-            landmarkType = "7">
+            endingLineNumber = "3870">
             <Locations>
                <Location
                   uuid = "27C49772-6686-4C75-9970-82A0C46A1E2D - 671f9f5a9fe1c52c"
@@ -22394,9 +22512,7 @@
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
             startingLineNumber = "3859"
-            endingLineNumber = "3859"
-            landmarkName = "distanceSettingWindowController(_:perimeterMeasureInfo:)"
-            landmarkType = "7">
+            endingLineNumber = "3859">
             <Locations>
                <Location
                   uuid = "7EBB28C4-9DFF-4C4F-9DF7-F3209883B2B7 - 671f9f5a9fe1c491"
@@ -22712,9 +22828,7 @@
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
             startingLineNumber = "4235"
-            endingLineNumber = "4235"
-            landmarkName = "getValidFilePath(_:)"
-            landmarkType = "7">
+            endingLineNumber = "4235">
             <Locations>
                <Location
                   uuid = "7DF7A976-6EDA-4754-8544-D22373F83F64 - 671f9f5a9fe1164c"
@@ -22790,9 +22904,7 @@
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
             startingLineNumber = "4308"
-            endingLineNumber = "4308"
-            landmarkName = "loadRecommondPopWindow()"
-            landmarkType = "7">
+            endingLineNumber = "4308">
             <Locations>
                <Location
                   uuid = "2FECA3C2-2FF6-442A-8776-A5592C7CC7BE - d359d2f6e4816478"
@@ -23265,9 +23377,7 @@
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
             startingLineNumber = "4294"
-            endingLineNumber = "4294"
-            landmarkName = "loadRecommondPopWindow()"
-            landmarkType = "7">
+            endingLineNumber = "4294">
             <Locations>
                <Location
                   uuid = "0952D145-7C86-45B2-8FCA-A3F49985B755 - baa12a3d1dc9e41a"
@@ -25322,7 +25432,7 @@
             endingColumnNumber = "9223372036854775807"
             startingLineNumber = "3357"
             endingLineNumber = "3357"
-            landmarkName = "toolbarViewController(_:itemDidClick:)"
+            landmarkName = "leftSideViewCancelSelect()"
             landmarkType = "7">
             <Locations>
                <Location
@@ -25848,7 +25958,7 @@
             endingColumnNumber = "9223372036854775807"
             startingLineNumber = "3409"
             endingLineNumber = "3409"
-            landmarkName = "toolbarViewController(_:itemDidClick:)"
+            landmarkName = "trackEvent(annotationType:)"
             landmarkType = "7">
             <Locations>
                <Location
@@ -25896,7 +26006,7 @@
             endingColumnNumber = "9223372036854775807"
             startingLineNumber = "3296"
             endingLineNumber = "3296"
-            landmarkName = "toolbarViewController(_:itemDidClick:)"
+            landmarkName = "areaSettingWindowController(_:measureInfo:)"
             landmarkType = "7">
             <Locations>
                <Location
@@ -25944,7 +26054,7 @@
             endingColumnNumber = "9223372036854775807"
             startingLineNumber = "2637"
             endingLineNumber = "2637"
-            landmarkName = "mainToolDidClicked(_:_:_:_:_:)"
+            landmarkName = "clickChildTool(type:index:)"
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>
@@ -26703,7 +26813,7 @@
             endingColumnNumber = "9223372036854775807"
             startingLineNumber = "3164"
             endingLineNumber = "3164"
-            landmarkName = "clickChildTool(type:index:)"
+            landmarkName = "showTTSWindow()"
             landmarkType = "7">
             <Locations>
                <Location