Browse Source

【批量处理】- 主界面 - 左右侧

jiajie 1 year ago
parent
commit
80a1bd6f53

+ 64 - 1
PDF Office/PDF Master.xcodeproj/project.pbxproj

@@ -2996,6 +2996,18 @@
 		BBE0BDF329A22EF300440583 /* KMMainViewController+MenuAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBE0BDF229A22EF300440583 /* KMMainViewController+MenuAction.swift */; };
 		BBE0BDF429A22EF300440583 /* KMMainViewController+MenuAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBE0BDF229A22EF300440583 /* KMMainViewController+MenuAction.swift */; };
 		BBE0BDF529A22EF300440583 /* KMMainViewController+MenuAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBE0BDF229A22EF300440583 /* KMMainViewController+MenuAction.swift */; };
+		BBE9D0922AF0A85C002E83CE /* KMBatchOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBE9D0912AF0A85C002E83CE /* KMBatchOperation.swift */; };
+		BBE9D0932AF0A85C002E83CE /* KMBatchOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBE9D0912AF0A85C002E83CE /* KMBatchOperation.swift */; };
+		BBE9D0942AF0A85C002E83CE /* KMBatchOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBE9D0912AF0A85C002E83CE /* KMBatchOperation.swift */; };
+		BBE9D0972AF0CECB002E83CE /* KMBatchOperateCompressViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBE9D0962AF0CECB002E83CE /* KMBatchOperateCompressViewController.swift */; };
+		BBE9D0982AF0CECB002E83CE /* KMBatchOperateCompressViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBE9D0962AF0CECB002E83CE /* KMBatchOperateCompressViewController.swift */; };
+		BBE9D0992AF0CECB002E83CE /* KMBatchOperateCompressViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBE9D0962AF0CECB002E83CE /* KMBatchOperateCompressViewController.swift */; };
+		BBE9D09B2AF0CEEB002E83CE /* KMBatchOperateCompressViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBE9D09A2AF0CEEA002E83CE /* KMBatchOperateCompressViewController.xib */; };
+		BBE9D09C2AF0CEEB002E83CE /* KMBatchOperateCompressViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBE9D09A2AF0CEEA002E83CE /* KMBatchOperateCompressViewController.xib */; };
+		BBE9D09D2AF0CEEB002E83CE /* KMBatchOperateCompressViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBE9D09A2AF0CEEA002E83CE /* KMBatchOperateCompressViewController.xib */; };
+		BBE9D09F2AF0D10F002E83CE /* KMSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBE9D09E2AF0D10F002E83CE /* KMSlider.swift */; };
+		BBE9D0A02AF0D10F002E83CE /* KMSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBE9D09E2AF0D10F002E83CE /* KMSlider.swift */; };
+		BBE9D0A12AF0D10F002E83CE /* KMSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBE9D09E2AF0D10F002E83CE /* KMSlider.swift */; };
 		BBEB93EB2AD6C2AE00739573 /* KMPDFMergeFileNameTabelViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBEB93EA2AD6C2AE00739573 /* KMPDFMergeFileNameTabelViewCell.swift */; };
 		BBEB93EC2AD6C2AE00739573 /* KMPDFMergeFileNameTabelViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBEB93EA2AD6C2AE00739573 /* KMPDFMergeFileNameTabelViewCell.swift */; };
 		BBEB93ED2AD6C2AE00739573 /* KMPDFMergeFileNameTabelViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBEB93EA2AD6C2AE00739573 /* KMPDFMergeFileNameTabelViewCell.swift */; };
@@ -3099,6 +3111,11 @@
 		BBFBE74B28DD7DDE008B2335 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BBFBE6C328DD7B98008B2335 /* Main.storyboard */; };
 		BBFBE74C28DD7DE4008B2335 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BBFBE6F228DD7C21008B2335 /* Assets.xcassets */; };
 		BBFBE74D28DD7DE8008B2335 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BBFBE72128DD7C43008B2335 /* Assets.xcassets */; };
+		BBFD2B122AEFAAF70016C456 /* KMBatchOperateBaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBFD2B112AEFAAF70016C456 /* KMBatchOperateBaseViewController.swift */; };
+		BBFD2B142AEFAB8F0016C456 /* KMOperationQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBFD2B132AEFAB8F0016C456 /* KMOperationQueue.swift */; };
+		BBFD2B162AEFAC9C0016C456 /* KMBatchOperateBaseViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBFD2B152AEFAC9B0016C456 /* KMBatchOperateBaseViewController.xib */; };
+		BBFD2B172AEFAC9C0016C456 /* KMBatchOperateBaseViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBFD2B152AEFAC9B0016C456 /* KMBatchOperateBaseViewController.xib */; };
+		BBFD2B182AEFAC9C0016C456 /* KMBatchOperateBaseViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBFD2B152AEFAC9B0016C456 /* KMBatchOperateBaseViewController.xib */; };
 		BBFE6E582930724B00142C01 /* KMMergePageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBFE6E572930724B00142C01 /* KMMergePageModel.swift */; };
 		BBFE6E592930724B00142C01 /* KMMergePageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBFE6E572930724B00142C01 /* KMMergePageModel.swift */; };
 		BBFE6E5A2930724B00142C01 /* KMMergePageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBFE6E572930724B00142C01 /* KMMergePageModel.swift */; };
@@ -4489,6 +4506,10 @@
 		BBDA8A682A31B50C006A2C4E /* KMCustomStepperView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMCustomStepperView.swift; sourceTree = "<group>"; };
 		BBDA8A6C2A31F9A6006A2C4E /* KMDesignStepperView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMDesignStepperView.swift; sourceTree = "<group>"; };
 		BBE0BDF229A22EF300440583 /* KMMainViewController+MenuAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KMMainViewController+MenuAction.swift"; sourceTree = "<group>"; };
+		BBE9D0912AF0A85C002E83CE /* KMBatchOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBatchOperation.swift; sourceTree = "<group>"; };
+		BBE9D0962AF0CECB002E83CE /* KMBatchOperateCompressViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBatchOperateCompressViewController.swift; sourceTree = "<group>"; };
+		BBE9D09A2AF0CEEA002E83CE /* KMBatchOperateCompressViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMBatchOperateCompressViewController.xib; sourceTree = "<group>"; };
+		BBE9D09E2AF0D10F002E83CE /* KMSlider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMSlider.swift; sourceTree = "<group>"; };
 		BBEB93EA2AD6C2AE00739573 /* KMPDFMergeFileNameTabelViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPDFMergeFileNameTabelViewCell.swift; sourceTree = "<group>"; };
 		BBEB93EE2AD6C72C00739573 /* KMPDFMergePageRangeTabelViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPDFMergePageRangeTabelViewCell.swift; sourceTree = "<group>"; };
 		BBEC00A3295BD42D00A26C98 /* KMHeaderFooterPageInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMHeaderFooterPageInfoView.swift; sourceTree = "<group>"; };
@@ -4549,6 +4570,9 @@
 		BBFBE73528DD7C43008B2335 /* PDF Master DMGUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "PDF Master DMGUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
 		BBFBE73928DD7C43008B2335 /* PDF_ Master_DMGUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PDF_ Master_DMGUITests.swift"; sourceTree = "<group>"; };
 		BBFBE73B28DD7C43008B2335 /* PDF_ Master_DMGUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PDF_ Master_DMGUITestsLaunchTests.swift"; sourceTree = "<group>"; };
+		BBFD2B112AEFAAF70016C456 /* KMBatchOperateBaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBatchOperateBaseViewController.swift; sourceTree = "<group>"; };
+		BBFD2B132AEFAB8F0016C456 /* KMOperationQueue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMOperationQueue.swift; sourceTree = "<group>"; };
+		BBFD2B152AEFAC9B0016C456 /* KMBatchOperateBaseViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMBatchOperateBaseViewController.xib; sourceTree = "<group>"; };
 		BBFE6E572930724B00142C01 /* KMMergePageModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMMergePageModel.swift; sourceTree = "<group>"; };
 		BBFE6E5B2930809A00142C01 /* KMMergeCollectionPageViewItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMMergeCollectionPageViewItem.swift; sourceTree = "<group>"; };
 		BBFE6E5C2930809A00142C01 /* KMMergeCollectionPageViewItem.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMMergeCollectionPageViewItem.xib; sourceTree = "<group>"; };
@@ -8107,6 +8131,15 @@
 			path = OutlineView;
 			sourceTree = "<group>";
 		};
+		BBE9D0952AF0CEB6002E83CE /* VC */ = {
+			isa = PBXGroup;
+			children = (
+				BBE9D0962AF0CECB002E83CE /* KMBatchOperateCompressViewController.swift */,
+				BBE9D09A2AF0CEEA002E83CE /* KMBatchOperateCompressViewController.xib */,
+			);
+			path = VC;
+			sourceTree = "<group>";
+		};
 		BBEC00AB295C2AB500A26C98 /* Bates */ = {
 			isa = PBXGroup;
 			children = (
@@ -8183,6 +8216,8 @@
 		BBF2454E2AE7726800037D08 /* WindowController */ = {
 			isa = PBXGroup;
 			children = (
+				BBE9D0952AF0CEB6002E83CE /* VC */,
+				BBFD2B102AEFAADB0016C456 /* Base */,
 				BB1BFF5C2AE9F1FF003EB179 /* KMBatchOperateBaseWindowController.swift */,
 				BB1BFF602AE9FA6C003EB179 /* KMBatchOperateBaseWindowController.xib */,
 				BBF245572AE78D0300037D08 /* KMBatchOperateWindowController.swift */,
@@ -8206,6 +8241,7 @@
 				BB1BFF802AEA139F003EB179 /* KMLongerButton.swift */,
 				BB1BFF892AEA4725003EB179 /* KMTableHeaderCell.swift */,
 				BBC4F9F92AEB9E200098A1A8 /* KMBatchTableCellView.swift */,
+				BBE9D09E2AF0D10F002E83CE /* KMSlider.swift */,
 			);
 			path = View;
 			sourceTree = "<group>";
@@ -8215,6 +8251,8 @@
 			children = (
 				BBF8A3F92AE89B8500788BAC /* KMBatchHeader.swift */,
 				BB1BFF912AEA6352003EB179 /* KMImageToPDFMethod.swift */,
+				BBFD2B132AEFAB8F0016C456 /* KMOperationQueue.swift */,
+				BBE9D0912AF0A85C002E83CE /* KMBatchOperation.swift */,
 			);
 			path = Tools;
 			sourceTree = "<group>";
@@ -8360,6 +8398,15 @@
 			path = "PDF Master DMGUITests";
 			sourceTree = "<group>";
 		};
+		BBFD2B102AEFAADB0016C456 /* Base */ = {
+			isa = PBXGroup;
+			children = (
+				BBFD2B112AEFAAF70016C456 /* KMBatchOperateBaseViewController.swift */,
+				BBFD2B152AEFAC9B0016C456 /* KMBatchOperateBaseViewController.xib */,
+			);
+			path = Base;
+			sourceTree = "<group>";
+		};
 		BBFE6E7B2930EB8F00142C01 /* Compress */ = {
 			isa = PBXGroup;
 			children = (
@@ -8951,6 +8998,7 @@
 				BB69C95F299116FD0001A9B1 /* plaid.pdf in Resources */,
 				89D2D2FE294C806000BFF5FE /* KMPDFThumbnailItem.xib in Resources */,
 				BB6DD80F29347F77001F0544 /* KMSecureEncryptWindowController.xib in Resources */,
+				BBFD2B162AEFAC9C0016C456 /* KMBatchOperateBaseViewController.xib in Resources */,
 				AD867FAA29DFB78200F00440 /* KMAnnotationOutlineView.xib in Resources */,
 				F3B7DF9D2948565000333201 /* CPDFListHoverAnnotationViewController.xib in Resources */,
 				ADF1569C29A63CBF001D1018 /* KMLightMember.xcassets in Resources */,
@@ -8980,6 +9028,7 @@
 				9F8539CE29430BF300DF644E /* KMBrowserWindowController.xib in Resources */,
 				AD0FA4FE29A8DD8700EDEB50 /* KMRegisterSuccessView.xib in Resources */,
 				9F0CB49229683DEE00007028 /* KMPropertiesPanelLineSubVC.xib in Resources */,
+				BBE9D09B2AF0CEEB002E83CE /* KMBatchOperateCompressViewController.xib in Resources */,
 				BB8B17362907B64D001C5EA5 /* CipherTextView.xib in Resources */,
 				BBC348562958465C008D2CD1 /* KMBackgroundFilePropertyInfoController.xib in Resources */,
 				ADBC374529CAD2D300D93208 /* SF-Pro-Text-Bold.otf in Resources */,
@@ -9309,6 +9358,7 @@
 				ADEC7A85299397F8009A8256 /* SF-Pro-Text-Semibold.otf in Resources */,
 				AD88108829A719E500178CA1 /* KMRegisterView.xib in Resources */,
 				ADC63E3B2A49813E00854E02 /* KMSubscribeSuccessWindowController.xib in Resources */,
+				BBFD2B172AEFAC9C0016C456 /* KMBatchOperateBaseViewController.xib in Resources */,
 				BB1BFF7E2AEA0BE8003EB179 /* KMBatchOperateRightViewController.xib in Resources */,
 				9FD0FA4F29D43D6800F2AB0D /* KMDeviceBrowserWindowController.xib in Resources */,
 				9F1F82CE292F6CF90092C4B4 /* KMPDFInsertPageWindow.xib in Resources */,
@@ -9349,6 +9399,7 @@
 				9F0CB4AB296CF19600007028 /* KMPropertiesPanelListMenuSubVC.xib in Resources */,
 				9F1F82B8292DEF370092C4B4 /* KMCloudDocumentsViewController.xib in Resources */,
 				9F0201922A1DDAA500C9B673 /* KMAITranslationWindowController.xib in Resources */,
+				BBE9D09C2AF0CEEB002E83CE /* KMBatchOperateCompressViewController.xib in Resources */,
 				AD0FA50729A8E61B00EDEB50 /* KMLightMemberAlertView.xib in Resources */,
 				BB69C963299116FD0001A9B1 /* horizontal_line.pdf in Resources */,
 				BBFE6E612930809A00142C01 /* KMMergeCollectionPageViewItem.xib in Resources */,
@@ -9560,6 +9611,7 @@
 				BBEC00C4295C306400A26C98 /* KMBatesPropertyController.xib in Resources */,
 				9F8539D029430BF300DF644E /* KMBrowserWindowController.xib in Resources */,
 				ADE8BC2C29F7CDB000570F89 /* KMPageNumberDisplayView.xib in Resources */,
+				BBFD2B182AEFAC9C0016C456 /* KMBatchOperateBaseViewController.xib in Resources */,
 				BBFE6E622930809A00142C01 /* KMMergeCollectionPageViewItem.xib in Resources */,
 				9F1F82B9292DEF370092C4B4 /* KMCloudDocumentsViewController.xib in Resources */,
 				ADBC374729CAD2D300D93208 /* SF-Pro-Text-Bold.otf in Resources */,
@@ -9589,6 +9641,7 @@
 				89752E092939DB42003FF08E /* KMToolbarViewController.xib in Resources */,
 				BBA8B7A82935CD740097D183 /* KMRemovePasswordAlertWindowController.xib in Resources */,
 				AD1CA4362A0640FC0070541F /* KMAnnotationScreenHeadView.xib in Resources */,
+				BBE9D09D2AF0CEEB002E83CE /* KMBatchOperateCompressViewController.xib in Resources */,
 				BBA19F3429ADAC81001A285A /* signPicture_hover.pdf in Resources */,
 				89E4E77E2967B370002DBA6F /* KMDynamicStampViewController.xib in Resources */,
 				BBC2BCCB295DA8F30036B983 /* KMCropPreviewController.xib in Resources */,
@@ -9930,6 +9983,7 @@
 				BBF8A4032AE8E10100788BAC /* KMBatchConvertParameter.swift in Sources */,
 				9FA607D928F8227500B46586 /* KMBox.swift in Sources */,
 				BB003026298CF7EC002DD1A0 /* KMPreferenceDisplayController.swift in Sources */,
+				BBE9D0922AF0A85C002E83CE /* KMBatchOperation.swift in Sources */,
 				BB1BFF5D2AE9F1FF003EB179 /* KMBatchOperateBaseWindowController.swift in Sources */,
 				F36AD77729642FE80015AD53 /* CPDFListView+UndoManager.m in Sources */,
 				ADDEEA492AD38BDB00EF675D /* KMSignatureHelpViewController.swift in Sources */,
@@ -10261,6 +10315,7 @@
 				9F8539CB29430BF300DF644E /* KMBrowserWindowController.swift in Sources */,
 				9F0CB5192986568000007028 /* KMDesignToken+BorderRadiusTopRight.swift in Sources */,
 				ADDEEA8E2AD78E4400EF675D /* KMSelfSignAnnotation.swift in Sources */,
+				BBFD2B122AEFAAF70016C456 /* KMBatchOperateBaseViewController.swift in Sources */,
 				BB6719E52AD28527003D44D5 /* CPDFLineAnnotation+PDFListView.swift in Sources */,
 				9FBA0EF528FFC8A0001117AF /* KMCollectionView.swift in Sources */,
 				9F0CB4672967E5CB00007028 /* KMPropertiesPanelSubViewController.swift in Sources */,
@@ -10334,7 +10389,6 @@
 				BB31981A2AC567B500107371 /* CPDFSelection+PDFListView.swift in Sources */,
 				ADB5E5122A371131007110A8 /* KMSubscribeWaterMarkWindowController.swift in Sources */,
 				BBC4F9EA2AEB58290098A1A8 /* KMAlertWindowController.swift in Sources */,
-				89752D9F2936EC50003FF08E /* KMToolbar.m in Sources */,
 				BB147011299DC0D100784A6A /* OIDError.m in Sources */,
 				89752DEA293875FC003FF08E /* KMMainToolbarController.swift in Sources */,
 				BBA93D2D29BEBAA60044E0DD /* KMPreferenceEnum.swift in Sources */,
@@ -10347,6 +10401,7 @@
 				9F1FE50D29407B2B00E952CA /* KMUploadFilePanel.swift in Sources */,
 				89E4E6E32963CD82002DBA6F /* KMGeneralAnnotationViewController.m in Sources */,
 				9F0201862A1DA28B00C9B673 /* KMAILanguagePopVC.swift in Sources */,
+				BBE9D09F2AF0D10F002E83CE /* KMSlider.swift in Sources */,
 				9F0CB4BD2977C06300007028 /* KMPropertiesPanelColorSubVC.swift in Sources */,
 				AD1CA4192A061CE10070541F /* KMAnnotationScreenTypeViewItem.swift in Sources */,
 				BBB9B328299A5D6D004F3235 /* GTMAppAuthFetcherAuthorization+Keychain.m in Sources */,
@@ -10389,6 +10444,7 @@
 				BB146FF9299DC0D100784A6A /* OIDExternalUserAgentMac.m in Sources */,
 				BB9DCC9F2A0A2B0A0024A6F1 /* KMConvertSettingView.swift in Sources */,
 				ADDEEA9A2AD7BB2D00EF675D /* KMAnnotationPropertiesColorManager.swift in Sources */,
+				BBE9D0972AF0CECB002E83CE /* KMBatchOperateCompressViewController.swift in Sources */,
 				BB74DA772AC41182006EDFE7 /* NSFont+KMExtension.swift in Sources */,
 				BB6DD8252934D056001F0544 /* KMSecureEncryptSuccessTipView.swift in Sources */,
 				BB6B43662A04919200E02B54 /* KMBaseViewController.swift in Sources */,
@@ -10420,6 +10476,7 @@
 				BB35C49F2975362900D46EE2 /* KMRedactTopToolBar.swift in Sources */,
 				BB49ECE9293F32A400C82CA2 /* KMConvertWordSettingView.swift in Sources */,
 				89D2D308295A83B500BFF5FE /* KMEditPDFTextPropertyViewController.swift in Sources */,
+				BBFD2B142AEFAB8F0016C456 /* KMOperationQueue.swift in Sources */,
 				9F0CB4DD2986554D00007028 /* KMDesignToken+HorizontalPadding.swift in Sources */,
 				ADDEEA622AD3A6E700EF675D /* KMPDFSignatureTextView.swift in Sources */,
 				BB146FED299DC0D100784A6A /* GTLRBatchResult.m in Sources */,
@@ -10480,6 +10537,7 @@
 				BBBB6CDB2AD15B900035AA66 /* CPDFFreeTextAnnotation+PDFListView.swift in Sources */,
 				ADAFDA3F2AE8F32400F084BC /* KMAdvertisementManager.swift in Sources */,
 				BBA19F4829AE27DA001A285A /* KMAnnotationTableRowView.swift in Sources */,
+				BBE9D0982AF0CECB002E83CE /* KMBatchOperateCompressViewController.swift in Sources */,
 				BB8F4566295AA3ED0037EA22 /* KMHeaderFooterManager.swift in Sources */,
 				BB99ACC3292DE22E0048AFD9 /* KMMergeViewController.swift in Sources */,
 				9F78EFC728F7E965001E66F4 /* KMHomeViewController+UI.swift in Sources */,
@@ -10512,6 +10570,7 @@
 				ADF1569429A62D1D001D1018 /* KMLoginLeftImageView.swift in Sources */,
 				ADDEEA5B2AD399BB00EF675D /* KMSignature.swift in Sources */,
 				9F53D5582AD6908600CCF9D8 /* KMAnnotationLinkViewController.swift in Sources */,
+				BBE9D0932AF0A85C002E83CE /* KMBatchOperation.swift in Sources */,
 				BBA762D329D2D98D00844513 /* KMCommonDefine.swift in Sources */,
 				AD867F9D29D9853200F00440 /* KMBOTAOutlineRowView.swift in Sources */,
 				BB146FDC299DC0D100784A6A /* GTLRDriveService.m in Sources */,
@@ -11040,6 +11099,7 @@
 				BB1BFF822AEA139F003EB179 /* KMLongerButton.swift in Sources */,
 				BB0A55192A3074F400B6E84B /* KMHoverView.swift in Sources */,
 				9F1FE4C129406E4700E952CA /* NSWindow+CTThemed.m in Sources */,
+				BBE9D0A02AF0D10F002E83CE /* KMSlider.swift in Sources */,
 				9F1FE50329406E4700E952CA /* CTTabStripModelOrderController.m in Sources */,
 				F34BF93629530708002C25A2 /* NSImage+PDFListView.m in Sources */,
 				BB49ECFF293F459500C82CA2 /* KMConvertPPTsWindowController.swift in Sources */,
@@ -11406,6 +11466,7 @@
 				89E4E7102963D62C002DBA6F /* KMAnnotationFontWindowController.m in Sources */,
 				AD9527C0295294E20039D2BC /* KMPrintPageModel.swift in Sources */,
 				BBB14A6529792D6900936EDB /* KMRedactPageRangeContentView.swift in Sources */,
+				BBE9D0992AF0CECB002E83CE /* KMBatchOperateCompressViewController.swift in Sources */,
 				9FDD0F8A2952FCC6000C4DAD /* KMCompLightParser.swift in Sources */,
 				9FA607DB28F8227500B46586 /* KMBox.swift in Sources */,
 				ADDEEA9C2AD7BB2D00EF675D /* KMAnnotationPropertiesColorManager.swift in Sources */,
@@ -11622,6 +11683,7 @@
 				BBD1F791296FE6A500343885 /* KMPageEditSplitWindowController.swift in Sources */,
 				ADD1B6EA2946C02600C3FFF7 /* KMPrintChoosePageSizeMultipageView.swift in Sources */,
 				BBF2455F2AE78FF900037D08 /* KMBatchWindow.swift in Sources */,
+				BBE9D0A12AF0D10F002E83CE /* KMSlider.swift in Sources */,
 				9FCFECA22AD17B8A00EAD2CB /* SKProgressController.swift in Sources */,
 				9F0CB4612966C9E200007028 /* KMFormPropertPanelViewController.swift in Sources */,
 				9F1FE4EF29406E4700E952CA /* ThrobberView.m in Sources */,
@@ -11845,6 +11907,7 @@
 				9FCFEC822AD0E74C00EAD2CB /* KMPopMenuButtonCell.swift in Sources */,
 				BB2EDF4E296E63E5003BCF58 /* KMPageEditInsertCustomPageWindowController.swift in Sources */,
 				BBB7B48B2A033F6200B58A5A /* KMThumbnailView.swift in Sources */,
+				BBE9D0942AF0A85C002E83CE /* KMBatchOperation.swift in Sources */,
 				9FBA0EF728FFC8A0001117AF /* KMCollectionView.swift in Sources */,
 				BB897226294B07960045787C /* KMWatermarkAdjectiveTopBarItemView.swift in Sources */,
 				89D2D2C7294972B900BFF5FE /* KMFormCellView.swift in Sources */,

+ 46 - 0
PDF Office/PDF Master/Class/Batch/Tools/KMBatchOperation.swift

@@ -0,0 +1,46 @@
+//
+//  KMBatchOperation.swift
+//  PDF Master
+//
+//  Created by kdanmobile on 2023/10/31.
+//
+
+import Foundation
+
+@objc(KMBatchOperateProtocol)
+protocol KMBatchOperateProtocol: AnyObject {
+    @objc optional func fileBeginOperate(_ file: KMBatchOperateFile, info: KMBatchBaseParameter)
+    @objc optional func fileOperating(_ file: KMBatchOperateFile, progress: CGFloat, info: KMBatchBaseParameter)
+    @objc optional func fileOperateSuccessed(_ file: KMBatchOperateFile, info: KMBatchBaseParameter)
+    @objc optional func fileOperateFailed(_ file: KMBatchOperateFile, error: NSError, info: KMBatchBaseParameter)
+    @objc optional func fileOperateCanceled(_ file: KMBatchOperateFile, info: KMBatchBaseParameter)
+}
+
+class KMBatchOperation: Operation{
+    var hasCanceled: Bool = false
+    var hasFinished: Bool = false
+    var hasExcuting: Bool = false
+    var operateFile: KMBatchOperateFile?
+    weak var delegate: KMBatchOperateProtocol?
+    
+    init(file: KMBatchOperateFile) {
+        super.init()
+        self.operateFile = file
+    }
+    override var isCancelled: Bool{
+        return self.hasCanceled
+    }
+    override var isFinished: Bool{
+        return self.hasFinished
+    }
+    override var isExecuting: Bool{
+        return self.hasExcuting
+    }
+    func errorWithMsg(_ errorMsg: String) -> NSError {
+        var errorDict = NSMutableDictionary()
+        errorDict[NSLocalizedDescriptionKey] = errorMsg
+        let error = NSError(domain: "PDFReaderBatchErrorDomain", code: -1, userInfo: (errorDict as! [String : Any]))
+        return error
+    }
+    
+}

+ 15 - 0
PDF Office/PDF Master/Class/Batch/Tools/KMOperationQueue.swift

@@ -0,0 +1,15 @@
+//
+//  KMOperationQueue.swift
+//  PDF Master
+//
+//  Created by kdanmobile on 2023/10/30.
+//
+
+import Foundation
+
+class KMOperationQueue: OperationQueue{
+    override init() {
+        super.init()
+        self.maxConcurrentOperationCount = 1
+    }
+}

+ 4 - 0
PDF Office/PDF Master/Class/Batch/View/KMBatchTableCellView.swift

@@ -42,6 +42,10 @@ class KMBatchTableCellView: NSTableCellView,NSComboBoxDelegate{
     var indicateImageView: NSImageView?
     var comboBoxContent: String?
 
+    deinit {
+        DistributedNotificationCenter.default().removeObserver(self)
+    }
+    
     convenience init(type: KMBatchTableCellViewType) {
         self.init()
         switch type {

+ 181 - 0
PDF Office/PDF Master/Class/Batch/View/KMSlider.swift

@@ -0,0 +1,181 @@
+//
+//  KMSlider.swift
+//  PDF Master
+//
+//  Created by kdanmobile on 2023/10/31.
+//
+
+import Cocoa
+@objc(SJTSliderDelegate)
+protocol SJTSliderDelegate: AnyObject {
+    func tipForValue(inSlider slider: KMSlider, value: Double) -> String
+    func valueDidSelect(inSlider slider: KMSlider)
+}
+
+let SJTSliderTipPopoverMinWidthX = 60.0;
+let SJTSliderTipPopoverMinWidthY = 40.0;
+let SJTSliderTipPopoverMinHeightX = 38.0;
+let SJTSliderTipPopoverMinHeightY = 24.0;
+let SJTSliderMinHeight = 21.0;
+let SJTSliderMinHeightWithTickMark = 26.0;
+let SJTSliderMinWidth = 100.0;
+let SJTSliderTickMarkMinWidth = 5.0;
+let SJTSliderPositioningRectkey = "positioningRect"
+
+class KMSlider: NSSlider, NSPopoverDelegate{
+    var tipEnabled: Bool = false
+    var tipAutoAlignment: Bool = false
+    var tipAlignment: NSTextAlignment = .left
+    var tipAppearance: NSAppearance?
+    var delegate: SJTSliderDelegate?
+    private var tipPopover: NSPopover?
+    
+    required init?(coder: NSCoder) {
+        super.init(coder: coder)
+        self.initView()
+    }
+    func initView() {
+        self.isContinuous = true
+        self.tipEnabled = true
+        self.tipAutoAlignment = true
+        self.tipAlignment = .center
+        self.tipAppearance = NSAppearance(named: NSAppearance.Name.vibrantLight)
+        let trackingArea = NSTrackingArea(rect: NSZeroRect, options: [.inVisibleRect, .mouseEnteredAndExited, .mouseMoved, .activeInActiveApp], owner: self, userInfo: nil)
+        self.addTrackingArea(trackingArea)
+        
+        let tipView = NSTextField()
+        tipView.isBordered = false
+        tipView.backgroundColor = NSColor.clear
+        tipView.isEditable = false
+        tipView.isSelectable = false
+        
+        let contentView = NSView()
+        contentView.addSubview(tipView)
+        
+        self.tipPopover = NSPopover()
+        self.tipPopover?.contentViewController = NSViewController()
+        self.tipPopover?.contentViewController?.view = contentView
+        self.tipPopover?.delegate = self
+    }
+    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
+        if object as? NSObject == self.tipPopover && keyPath == SJTSliderPositioningRectkey {
+            self.adjustTipAlignment()
+        }
+    }
+    func adjustTipAlignment() { guard let tipContentView = self.tipPopover?.contentViewController?.view
+        else { return }
+        guard let tipView = tipContentView.subviews.first as? NSTextField else {
+            return
+        }
+        
+        var tipAlignment: NSTextAlignment = .center
+        if self.tipAutoAlignment {
+            var tipContentFrame = tipContentView.convert(tipContentView.bounds, to: nil)
+            tipContentFrame = tipContentView.window?.convertToScreen(tipContentFrame) ?? NSRect.zero
+            tipContentFrame = self.window?.convertFromScreen(tipContentFrame) ?? NSRect.zero
+            if let tipTargetFrame = self.tipPopover?.positioningRect {
+                if NSMaxX(tipContentFrame) < NSMinX(tipTargetFrame) {
+                    tipAlignment = .right
+                } else if NSMinX(tipContentFrame) > NSMaxX(tipTargetFrame) {
+                    tipAlignment = .left
+                }
+            }
+        } else {
+            tipAlignment = self.tipAlignment
+        }
+        tipView.alignment = tipAlignment
+    }
+    override func mouseEntered(with theEvent: NSEvent) {
+        if self.tipEnabled {
+            self.showTipPopover(animated: true)
+        }
+    }
+    func showTipPopover(animated: Bool) {
+        let tip = self.tipForValue(self.doubleValue)
+        if !tip.isEmpty {
+            let contentView = self.tipPopover?.contentViewController?.view
+            if let tipView = contentView?.subviews[0] as? NSTextField {
+                let knobRect = (self.cell as? NSSliderCell)?.knobRect(flipped: self.isFlipped)
+                var preferredEdge: NSRectEdge?
+                var newcell: NSSliderCell = self.cell as! NSSliderCell
+                if newcell.sliderType == .circular {
+                    let tickMartCenter = NSMakePoint(NSMidX(knobRect!), NSMidY(knobRect!))
+                    let viewCenter = NSMakePoint(NSMidX(self.bounds), NSMidY(self.bounds))
+                    let cutoffValue = sqrt(((viewCenter.x - tickMartCenter.x) * (viewCenter.x - tickMartCenter.x) + (viewCenter.y - tickMartCenter.y) * (viewCenter.y - tickMartCenter.y)) / 2) as CGFloat
+                    
+                    if viewCenter.x-tickMartCenter.x > cutoffValue {
+                        preferredEdge = NSRectEdge.minX
+                    } else if tickMartCenter.y-viewCenter.y > cutoffValue {
+                        preferredEdge = NSRectEdge.maxY
+                    } else if tickMartCenter.x-viewCenter.x > cutoffValue {
+                        preferredEdge = NSRectEdge.maxX
+                    } else {
+                        preferredEdge = NSRectEdge.minY
+                    }
+                } else if self.isVertical {
+                    if self.tickMarkPosition == NSSlider.TickMarkPosition.leading {
+                        preferredEdge = NSRectEdge.minX
+                    } else {
+                        preferredEdge = NSRectEdge.maxX
+                    }
+                } else {
+                    if self.tickMarkPosition == NSSlider.TickMarkPosition.below {
+                        preferredEdge = self.isFlipped ? NSRectEdge.maxY : NSRectEdge.minY
+                    } else {
+                        preferredEdge = self.isFlipped ? NSRectEdge.minY : NSRectEdge.maxY
+                    }
+                }
+                
+                self.tipPopover?.appearance = self.tipAppearance
+                tipView.stringValue = tip
+                tipView.sizeToFit()
+                var tipViewFrame = tipView.bounds
+                var contentViewSize = tipView.bounds.size
+                var minWidth, minHeight: Int
+                
+                if preferredEdge == NSRectEdge.minX || preferredEdge == NSRectEdge.maxX {
+                    minWidth = Int(SJTSliderTipPopoverMinWidthX)
+                    minHeight = Int(SJTSliderTipPopoverMinHeightX)
+                } else {
+                    minWidth = Int(SJTSliderTipPopoverMinWidthY)
+                    minHeight = Int(SJTSliderTipPopoverMinHeightY)
+                }
+                
+                if Int(tipViewFrame.size.width) < minWidth {
+                    tipViewFrame.size.width = CGFloat(minWidth)
+                    tipViewFrame.origin.x = (CGFloat(minWidth)-tipViewFrame.size.width)/2
+                    contentViewSize.width = CGFloat(minWidth)
+                }
+                
+                if Int(tipViewFrame.size.height) < minHeight {
+                    tipViewFrame.origin.y = (CGFloat(minHeight)-tipViewFrame.size.height)/2
+                    contentViewSize.height = CGFloat(minHeight)
+                }
+                
+                contentView?.setFrameSize(contentViewSize)
+                tipView.frame = tipViewFrame
+                self.tipPopover?.contentSize = contentViewSize
+                
+                self.tipPopover?.animates = animated
+                self.tipPopover?.show(relativeTo: knobRect!, of: self, preferredEdge: preferredEdge!)
+            }
+        }
+    }
+    override func mouseExited(with theEvent: NSEvent) {
+        self.closeTipPopover(animated: true)
+    }
+    func tipForValue(_ value: Double) -> String {
+        if let tip = self.delegate?.tipForValue(inSlider: self, value: self.doubleValue) {
+           return tip
+        }
+        return String(format: "%0.f", self.doubleValue)
+    }
+    func closeTipPopover(animated: Bool) {
+        if ((self.tipPopover?.isShown) != nil) {
+            self.tipPopover?.animates = animated 
+            self.tipPopover?.close()
+        }
+    }
+}
+
+

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

@@ -0,0 +1,251 @@
+//
+//  KMBatchOperateBaseViewController.swift
+//  PDF Master
+//
+//  Created by kdanmobile on 2023/10/30.
+//
+
+import Cocoa
+
+var kBatchQueueOperationsChanged = "kBatchQueueOperationsChanged"
+
+class KMBatchOperateBaseViewController: NSViewController, KMBatchOperateProtocol{
+    var operateType: KMBatchOperationType?
+    var convertType: KMConvertWithPDFType?
+    var files: [KMBatchOperateFile]?
+    lazy var queue: KMOperationQueue? = {
+        var queue: KMOperationQueue?
+        if !(self.view.window as! KMBatchWindow).isBatch! {
+            queue = KMOperationQueue()
+        } else {
+            if self.operateType == .Convert {
+                //                queue = KMConvertOperationQueue.sharedQueue()
+            } else if self.operateType == .Compress {
+                //                queue = KMCompressOperationQueue.sharedQueue()
+            } else if self.operateType == .AddPassword {
+                //                queue = KMAddPasswordOperationQueue.sharedQueue()
+            } else if self.operateType == .RemovePassword {
+                //                queue = KMRemovePasswordOperationQueue.sharedQueue()
+            } else if self.operateType == .AddWatermark {
+                //                queue = KMAddWatermarkOprationQueue.sharedQueue()
+            } else if self.operateType == .RemoveWatermark {
+                //                queue = KMRemoveWatermarkOperationQueue.sharedQueue()
+            } else if self.operateType == .AddBackground {
+                //                queue = KMAddBackgroundOperationQueue.sharedQueue()
+            } else if self.operateType == .RemoveBackground {
+                //                queue = KMRemoveBackgroundOperationQueue.sharedQueue()
+            } else if self.operateType == .AddHeaderFooter {
+                //                queue = KMAddHeaderFooterOperationQueue.sharedQueue()
+            } else if self.operateType == .RemoveHeaderFooter {
+                //                queue = KMRemoveHeaderFooterQueue.sharedQueue()
+            } else if self.operateType == .AddBates {
+                //                queue = KMAddBatesOperationQueue.sharedQueue()
+            } else if self.operateType == .RemoveBates {
+                //                queue = KMRemoveBatesOperationQueue.sharedQueue()
+            }
+        }
+        return queue
+    }()
+    lazy var successFilePathURLArray: [URL]? = {
+        let arr = NSMutableArray()
+        return (arr as! [URL])
+    }()
+    var name: String = ""
+    var interfaceStatus: KMBatchOperateInterfaceStatus?
+    var choosePath: String = ""
+    
+    init(files: NSMutableArray) {
+        super.init(nibName: String(describing: type(of: self)), bundle: nil)
+        self.files = (files as! [KMBatchOperateFile])
+    }
+    
+    required init?(coder: NSCoder) {
+        super.init(coder: coder)
+    }
+    deinit {
+        queue?.removeObserver(self, forKeyPath: "operations")
+    }
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        self.queue!.addObserver(self, forKeyPath: "operations", options: .new, context: &kBatchQueueOperationsChanged)
+    }
+    
+    func operateCompleted() {
+        showWindowCloseButton()
+        if successFilePathURLArray!.count > 0 {
+            NSWorkspace.shared.activateFileViewerSelecting(successFilePathURLArray!)
+        }
+        self.interfaceStatus = .PrepareProcess
+    }
+    func showWindowCloseButton() {
+        let btn = self.view.window?.standardWindowButton(NSWindow.ButtonType.closeButton)
+        btn?.isHidden = false
+    }
+    func beginBatchOperation() {
+        for i in 0..<self.files!.count {
+            let file = self.files?[i]
+            file?.currentOperateInfo?.resetState()
+        }
+        if self.files!.count < 1 {
+            NSSound.beep()
+            return
+        }
+        
+        self.fetchFileListViewController()!.reloadData()
+        
+        let openPanel = NSOpenPanel()
+        openPanel.canChooseFiles = false
+        openPanel.canChooseDirectories = true
+        openPanel.canCreateDirectories = true
+        openPanel.beginSheetModal(for: self.view.window!) { (result) in
+            if result == NSApplication.ModalResponse.OK {
+                for fileURL in openPanel.urls {
+                    self.choosePath = fileURL.path
+                    self.beginQueueOperation()
+                }
+            }
+        }
+    }
+    func fetchFileListViewController() -> KMBatchOperateLeftViewController? {
+        guard let vc = self.view.window?.contentViewController as? KMBatchOperateSplitViewController,
+              let viewController = vc.splitViewItems.first?.viewController as? KMBatchOperateLeftViewController
+        else {
+            return nil
+        }
+        return viewController
+    }
+    func beginQueueOperation() {//业务逻辑转移到数据处理层
+        // hiddenWindowCloseButtonIfNeeded()
+        self.successFilePathURLArray?.removeAll()
+        for i in 0..<self.files!.count {
+            let file = self.files![i]
+            if file.fileType == .PDF {
+                if self.operateType == .Convert {
+                    file.convertType = self.convertType
+                }
+                file.currentOperateInfo?.savePath = self.choosePath
+                let operation = operationWithFile(file)
+                operation!.delegate = self
+                self.queue?.addOperation(operation!)
+            }
+        }
+        if (self.queue?.operations.count)! > 0 {
+            self.interfaceStatus = .Processing
+        }
+    }
+    func operationWithFile(_ file: KMBatchOperateFile) -> KMBatchOperation? {
+        var operation: KMBatchOperation? = nil
+        if self.operateType == .Convert {
+            //            operation = KMBatchConvertOperation(file: file, convertType: self.convertType)
+        } else if self.operateType == .Compress {
+            //            operation = KMCompressOperation(file: file)
+        } else if self.operateType == .AddPassword {
+            // handle AddPassword operation
+        } else if self.operateType == .RemovePassword {
+            //            operation = KMBatchRemovePasswordOperation(file: file)
+        } else if self.operateType == .AddWatermark {
+            // handle AddWatermark operation
+        } else if self.operateType == .RemoveWatermark {
+            //            operation = KMBatchRemoveWatermarkOperation(file: file)
+        } else if self.operateType == .AddBackground {
+            // handle AddBackground operation
+        } else if self.operateType == .RemoveBackground {
+            //            operation = KMBatchRemoveWatermarkOperation(file: file)
+        } else if self.operateType == .AddHeaderFooter {
+            // handle AddHeaderFooter operation
+        } else if self.operateType == .RemoveHeaderFooter {
+            //            operation = KMBatchRemoveHeaderFooterOperation(file: file)
+        } else if self.operateType == .AddBates {
+            //            operation = KMBatchRemoveHeaderFooterOperation(file: file)
+        } else if self.operateType == .RemoveBates {
+            //            operation = KMBatchRemoveHeaderFooterOperation(file: file)
+            //            operation?.setValue(true, forKey: "isBates")
+        }
+        return operation
+    }
+    func cancelBatchOperation() {
+        for i in 0..<(self.queue?.operations.count)! {
+            let operation = self.queue?.operations[i]
+            if !operation!.isExecuting {
+                operation?.cancel()
+            } else {
+                // Do nothing
+            }
+        }
+        self.interfaceStatus = .PrepareProcess
+    }
+    func hiddenWindowCloseButtonIfNeeded() {
+        let btn = self.view.window?.standardWindowButton(NSWindow.ButtonType.closeButton)
+        btn?.isHidden = true
+    }
+    func allPageNumbers(_ pageString: String) -> [NSNumber] {
+        let array = pageString.components(separatedBy: ",")
+        var pageNumbers = NSMutableArray()
+        var isInvalid = false
+        for s in array {
+            if s == "" {
+                isInvalid = true
+                break
+            } else {
+                let pages = s.components(separatedBy: "-")
+                if pages.count > 2 {
+                    isInvalid = true 
+                    break
+                } else if pages.count == 1 {
+                    let p = pages[0]
+                    if p == "" || Int(p) == 0 {
+                        isInvalid = true 
+                        break
+                    } else {
+                        var isEqual = false
+                        for pageNumber in pageNumbers {
+                            if (pageNumber as AnyObject).intValue == Int(p) {
+                                isEqual = true
+                                isInvalid = true 
+                                break
+                            }
+                        }
+                        if !isEqual {
+                            pageNumbers.add(NSNumber(value: Int(p)!))
+                        }
+                    }
+                } else if pages.count == 2 {
+                    let p1 = pages[0]
+                    let p2 = pages[1]
+                    if p1 == "" || p2 == "" || Int(p1)! >= Int(p2)! || Int(p1) == 0 {
+                        isInvalid = true
+                        break
+                    } else {
+                        var isEqual = false
+                        for i in Int(p1)!...Int(p2)! {
+                            for pageNumber in pageNumbers {
+                                if (pageNumber as AnyObject).intValue == i {
+                                    isEqual = true
+                                    isInvalid = true
+                                    break
+                                }
+                            }
+                        }
+                        if !isEqual {
+                            for i in Int(p1)!...Int(p2)! {
+                                pageNumbers.add(NSNumber(value: i))
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return pageNumbers as! [NSNumber]
+    }
+    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
+        if keyPath == "operations" && context == &kBatchQueueOperationsChanged {
+            if self.queue?.operations.count == 0 {
+                DispatchQueue.main.async {
+                    self.operateCompleted()
+                }
+            }
+        } else {
+            super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
+        }
+    }
+}

+ 22 - 0
PDF Office/PDF Master/Class/Batch/WindowController/Base/KMBatchOperateBaseViewController.xib

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="22154" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22154"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMBatchOperateBaseViewController" customModule="PDF_Master" customModuleProvider="target">
+            <connections>
+                <outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customView id="Hz6-mo-xeY">
+            <rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <point key="canvasLocation" x="94" y="-128"/>
+        </customView>
+    </objects>
+</document>

+ 1 - 1
PDF Office/PDF Master/Class/Batch/WindowController/KMAlertWindowController.xib

@@ -26,7 +26,7 @@
                 <rect key="frame" x="0.0" y="0.0" width="480" height="123"/>
                 <autoresizingMask key="autoresizingMask"/>
                 <subviews>
-                    <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="oE7-Dp-pX1">
+                    <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="oE7-Dp-pX1">
                         <rect key="frame" x="22" y="89" width="40" height="16"/>
                         <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="F1Y-TD-Qwj">
                             <font key="font" metaFont="systemBold"/>

+ 18 - 14
PDF Office/PDF Master/Class/Batch/WindowController/KMBatchOperateLeftViewController.swift

@@ -46,6 +46,10 @@ class KMBatchOperateLeftViewController: NSViewController,NSTableViewDelegate,NST
     var popOver: NSPopover?
     var progressInt: Int = 0
     
+    deinit {
+        NotificationCenter.default.removeObserver(self)
+        DistributedNotificationCenter.default().removeObserver(self)
+    }
     override func viewDidLoad() {
         super.viewDidLoad()
         NotificationCenter.default.addObserver(self.tableView!, selector: #selector(self.reloadData), name: NSNotification.Name(kNeedChangePageRangeNotification), object: nil)
@@ -187,7 +191,7 @@ class KMBatchOperateLeftViewController: NSViewController,NSTableViewDelegate,NST
         panel.beginSheetModal(for: self.view.window!) {
             (result) in
             if result.rawValue == NSApplication.ModalResponse.OK.rawValue {
-                var addArray = NSMutableArray()
+                let addArray = NSMutableArray()
                 for fileURL in panel.urls {
                     let filePath = fileURL.path
                     var isDirectory = ObjCBool(false)
@@ -214,7 +218,7 @@ class KMBatchOperateLeftViewController: NSViewController,NSTableViewDelegate,NST
         }
     }
     func fetchAvailableFiles(in folderPath: String) -> [String] {
-        var array = NSMutableArray()
+        let array = NSMutableArray()
         let subFileArray = (FileManager.default.subpaths(atPath: folderPath)! as NSArray).mutableCopy() as? NSMutableArray
         for i in 0..<subFileArray!.count {
             if let path = (folderPath as NSString).appendingPathComponent(subFileArray!.object(at: i) as! String) as String? {
@@ -351,7 +355,7 @@ class KMBatchOperateLeftViewController: NSViewController,NSTableViewDelegate,NST
     }
     func fetchAvailableFilesInFolder(_ folderPath: String) -> [String] {
         var array: [String] = []
-        var subFileArray = FileManager().subpaths(atPath: folderPath)
+        let subFileArray = FileManager().subpaths(atPath: folderPath)
         for i in 0..<subFileArray!.count {
             let path = folderPath.stringByAppendingPathComponent(subFileArray![i])
             let UTTypeString = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, path.extension as CFString, nil)
@@ -422,8 +426,8 @@ class KMBatchOperateLeftViewController: NSViewController,NSTableViewDelegate,NST
     }
     
     @IBAction func menuItem_ShowInFinder(_ sender: Any) {
-        var row = self.tableView.clickedRow
-        var file: KMBatchOperateFile = self.files[row]
+        let row = self.tableView.clickedRow
+        let file: KMBatchOperateFile = self.files[row]
         if file.currentOperateInfo?.status == .Success {
             NSWorkspace.shared.activateFileViewerSelecting([URL(fileURLWithPath: file.currentOperateInfo!.outPutPath!)])
         }else {
@@ -432,7 +436,7 @@ class KMBatchOperateLeftViewController: NSViewController,NSTableViewDelegate,NST
     }
     
     @IBAction func menuItem_Delete(_ sender: Any) {
-        var row = self.tableView.clickedRow
+        let row = self.tableView.clickedRow
         self.files.remove(at: row)
         self.tableView.reloadData()
     }
@@ -453,7 +457,7 @@ class KMBatchOperateLeftViewController: NSViewController,NSTableViewDelegate,NST
         for i in 0..<documentArray.count {
             let document = documentArray[i]
             let path = document.fileURL?.path
-            var UTTypeString = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, path!.extension as CFString, nil)
+            let UTTypeString = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, path!.extension as CFString, nil)
             let TypeCFString = UTTypeString as! CFString
             if UTTypeConformsTo(TypeCFString, kUTTypePDF) {
                 pdfArray.add(path as Any)
@@ -492,7 +496,7 @@ class KMBatchOperateLeftViewController: NSViewController,NSTableViewDelegate,NST
                 
                 if (file.fileType == .Image) {
                     var image = NSImage(contentsOfFile: file.filePath)
-                    cellView.textField?.stringValue = "(Int(image.size.width)) x (Int(image.size.height))"
+                    cellView.textField?.stringValue = String(Int(image!.size.width)) + "x" + String(Int(image!.size.height))
                 }
              
                 return cellView;
@@ -534,7 +538,7 @@ class KMBatchOperateLeftViewController: NSViewController,NSTableViewDelegate,NST
             
             if (file.fileType == .Image) {
                 var image = NSImage(contentsOfFile: file.filePath)
-                cellView.textField?.stringValue = "(Int(image.size.width)) x (Int(image.size.height))"
+                cellView.textField?.stringValue = String(Int(image!.size.width)) + "x" + String(Int(image!.size.height))
             }
          
             return cellView;
@@ -617,10 +621,10 @@ class KMBatchOperateLeftViewController: NSViewController,NSTableViewDelegate,NST
         if pboard.availableType(from: [.init(KMBatchDragType)]) != nil {
             guard let rowData = pboard.data(forType: .init(KMBatchDragType)),
                   let rowIndexes = NSKeyedUnarchiver.unarchiveObject(with: rowData) as? NSIndexSet else { return false }
-            var backUpArray = self.files
+            let backUpArray = self.files
             var referenceIndex = -1
             rowIndexes.enumerate(options: .reverse, using: { (idx, stop) in
-                var sortFile = backUpArray[idx]
+                let sortFile = backUpArray[idx]
                 if referenceIndex < 0 {
                     if idx > row {
                         self.files.remove(at: idx)
@@ -654,7 +658,7 @@ class KMBatchOperateLeftViewController: NSViewController,NSTableViewDelegate,NST
             else {
                 return false
             }
-            var allFilesArray = NSMutableArray()
+            let allFilesArray = NSMutableArray()
             for path in fileNames {
                 var isFolder = ObjCBool(false)
                 FileManager.default.fileExists(atPath: path, isDirectory: &isFolder)
@@ -662,7 +666,7 @@ class KMBatchOperateLeftViewController: NSViewController,NSTableViewDelegate,NST
                     let containFiles = fetchAvailableFilesInFolder(path)
                     allFilesArray.addObjects(from: containFiles)
                 } else {
-                    var UTTypeString = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, path.extension as CFString, nil)
+                    let UTTypeString = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, path.extension as CFString, nil)
                     let TypeCFString = UTTypeString as! CFString
                     
                     if self.type == .CreatePDF {
@@ -681,7 +685,7 @@ class KMBatchOperateLeftViewController: NSViewController,NSTableViewDelegate,NST
             lockFileIndex = 0
             for i in 0..<allFilesArray.count {
                 let filePath: String = allFilesArray[i] as! String
-                var UTTypeString = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, filePath.extension as CFString, nil)
+                let UTTypeString = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, filePath.extension as CFString, nil)
                 let TypeCFString = UTTypeString as! CFString
                 if UTTypeConformsTo(TypeCFString, kUTTypePDF) {
                     let document = PDFDocument(url: URL(fileURLWithPath: filePath))

+ 2 - 2
PDF Office/PDF Master/Class/Batch/WindowController/KMBatchOperateLeftViewController.xib

@@ -250,7 +250,7 @@
                                     </constraints>
                                     <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="KMImageNameEmptyListNor" id="ZKZ-Y3-Edy"/>
                                 </imageView>
-                                <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="6Hf-rN-RVl">
+                                <textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="6Hf-rN-RVl">
                                     <rect key="frame" x="87" y="33" width="102" height="17"/>
                                     <textFieldCell key="cell" title="Multiline Label" id="ssO-57-xns">
                                         <font key="font" metaFont="systemSemibold" size="14"/>
@@ -258,7 +258,7 @@
                                         <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                                     </textFieldCell>
                                 </textField>
-                                <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="tU6-rc-cEb">
+                                <textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="tU6-rc-cEb">
                                     <rect key="frame" x="87" y="8" width="102" height="17"/>
                                     <textFieldCell key="cell" alignment="center" title="Multiline Label" id="7H4-19-ztf">
                                         <font key="font" metaFont="system" size="14"/>

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

@@ -8,5 +8,5 @@
 import Cocoa
 
 class KMBatchOperateRightViewController: NSViewController{
-    
+    var compressViewController: KMBatchOperateCompressViewController?
 }

+ 3 - 3
PDF Office/PDF Master/Class/Batch/WindowController/KMBatchOperateSplitViewController.swift

@@ -30,8 +30,8 @@ class KMBatchOperateSplitViewController: NSSplitViewController{
         self.view.addTrackingArea(trackingArea)
     }
     
-//    func switchToOperateType(operateType: KMBatchOperationType, files: NSMutableArray) {
-//        self.leftFileListViewController.switchToOperateType(operateType: operateType, files: files)
+    func switchToOperateType(operateType: KMBatchOperationType, files: NSMutableArray) {
+        self.leftFileListViewController?.switchToOperateType(operateType, files: files as! [KMBatchOperateFile])
 //        self.rightPropertiesViewController.switchToOperateType(operateType: operateType, files: files)
-//    }
+    }
 }

+ 214 - 0
PDF Office/PDF Master/Class/Batch/WindowController/VC/KMBatchOperateCompressViewController.swift

@@ -0,0 +1,214 @@
+//
+//  KMBatchOperateCompressViewController.swift
+//  PDF Master
+//
+//  Created by kdanmobile on 2023/10/31.
+//
+
+import Cocoa
+
+class KMBatchOperateCompressViewController: KMBatchOperateBaseViewController{
+    
+    @IBOutlet var titleLabel: NSTextField!
+    
+    @IBOutlet var dpi300Button: NSButton!
+    
+    @IBOutlet var dpi300Label: NSTextField!
+    
+    @IBOutlet var dpi150Button: NSButton!
+    
+    @IBOutlet var dpi150Label: NSTextField!
+    
+    @IBOutlet var dpi72Button: NSButton!
+    
+    @IBOutlet var dpi72Label: NSTextField!
+    
+    @IBOutlet var dpi50Button: NSButton!
+    
+    @IBOutlet var dpi50Label: NSTextField!
+    
+    @IBOutlet var otherChoiceButton: NSButton!
+    
+    @IBOutlet var actionButton: NSButton!
+    
+    @IBOutlet var comprssSlider: KMSlider!
+    
+    @IBOutlet var lowLabel: NSTextField!
+    
+    @IBOutlet var highLabel: NSTextField!
+    
+    var currentType: NSNumber?
+    var savePath: String?
+    var haveFiles: Bool = false
+    
+    override var interfaceStatus: KMBatchOperateInterfaceStatus?{
+        set{
+            super.interfaceStatus = newValue
+            if newValue == .PrepareProcess {
+                DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) {
+                    var files = NSMutableArray()
+                    for url in self.successFilePathURLArray! {
+                        if FileManager.default.fileExists(atPath: url.path) {
+                            files.add(url)
+                        }
+                    }
+                    if files.count > 0 {
+                        let workspace = NSWorkspace.shared
+                        workspace.activateFileViewerSelecting(files as! [URL])
+                    }
+                }
+                self.actionButton.tag = 1
+                self.actionButton.title = NSLocalizedString("Compress", comment: "")
+                self.actionButton.setTitleColor(KMAppearance.Layout.w0Color())
+            } else {
+                self.actionButton.tag = 0
+                self.actionButton.title = NSLocalizedString("Cancel", comment: "")
+                self.actionButton.setTitleColor(KMAppearance.Layout.w0Color())
+            }
+        }
+        get{
+            return super.interfaceStatus
+        }
+    }
+    
+    deinit {
+        NotificationCenter.default.removeObserver(self)
+    }
+    
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        self.localizedLanguage()
+        self.configuUI()
+        
+        NotificationCenter.default.addObserver(self, selector: #selector(themeChanged(notification:)), name: NSNotification.Name("AppleInterfaceThemeChangedNotification"), object: nil)
+    }
+    func localizedLanguage() {
+        self.titleLabel.stringValue = NSLocalizedString("Optimization Options", comment: "")
+        self.actionButton.title = NSLocalizedString("Compress", comment: "")
+        self.dpi300Label.stringValue = NSLocalizedString("Large File Size(High Quality)", comment: "")
+        self.dpi150Label.stringValue = NSLocalizedString("Medium File Size(Medium Quality)", comment: "")
+        self.dpi72Label.stringValue = NSLocalizedString("Small File Size(Recommended Quality)", comment: "")
+        self.dpi50Label.stringValue = NSLocalizedString("Minimum File Size(Low Quality)", comment: "")
+        self.otherChoiceButton.title = NSLocalizedString("Other", comment: "")
+        self.lowLabel.stringValue = NSLocalizedString("Low Quality", comment: "")
+        self.highLabel.stringValue = NSLocalizedString("High Quality", comment: "")
+        self.lowLabel.stringValue = NSLocalizedString("Low Quality", comment: "")
+    }
+    func configuUI() {
+        self.view.wantsLayer = true 
+        self.updateViewColor()
+        self.dpi300Button.setTitleColor(KMAppearance.Layout.h0Color())
+        self.dpi150Button.setTitleColor(KMAppearance.Layout.h0Color())
+        self.dpi72Button.setTitleColor(KMAppearance.Layout.h0Color())
+        self.dpi50Button.setTitleColor(KMAppearance.Layout.h0Color())
+        self.otherChoiceButton.setTitleColor(KMAppearance.Layout.h0Color())
+        
+        self.currentType = 60
+        self.dpi72Button.state = .on
+        self.dpi50Button.state = .off
+        self.dpi300Button.state = .off
+        self.dpi150Button.state = .off
+        self.otherChoiceButton.state = .off
+        
+        self.highLabel.isEnabled = false
+        self.lowLabel.isEnabled = false
+        self.comprssSlider.isEnabled = false
+        self.comprssSlider.tipEnabled = false
+        
+        self.lowLabel.textColor = KMAppearance.Layout.h0Color()
+        self.highLabel.textColor = KMAppearance.Layout.h0Color()
+        self.lowLabel.alphaValue = 0.4
+        self.highLabel.alphaValue = 0.4
+        
+        self.actionButton.wantsLayer = true
+        if self.files!.count > 0 {
+            self.actionButton.layer!.backgroundColor = KMAppearance.Interactive.m0Color().cgColor
+            self.actionButton.setTitleColor(KMAppearance.Layout.w0Color())
+            self.haveFiles = true
+        } else {
+            self.actionButton.setTitleColor(KMAppearance.Layout.w0Color().withAlphaComponent(0.6))
+            self.actionButton.layer!.backgroundColor = KMAppearance.Interactive.m0Color().withAlphaComponent(0.6).cgColor
+            self.haveFiles = false
+        }
+        self.actionButton.layer!.cornerRadius = 1.0
+        
+        NotificationCenter.default.addObserver(self, selector: #selector(batchFilesCountNotification(notification:)), name: NSNotification.Name("KMBatchFilesCountNotification"), object: nil)
+    }
+    func updateViewColor() {
+        if KMAppearance.isDarkMode() {
+            self.view.layer?.backgroundColor = NSColor(red: 0.055, green: 0.067, blue: 0.078, alpha: 1).cgColor
+        } else {
+            self.view.layer?.backgroundColor = NSColor(red: 0.922, green: 0.925, blue: 0.941, alpha: 1).cgColor
+        }
+    }
+    @objc func themeChanged(notification: Notification) {
+        DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
+            self.updateViewColor()
+        }
+    }
+    @objc func batchFilesCountNotification(notification: Notification) {
+        let files = notification.object as? [Any]
+        if files!.count > 0 {
+            self.actionButton.layer?.backgroundColor = KMAppearance.Interactive.m0Color().cgColor
+            self.actionButton.setTitleColor(KMAppearance.Layout.w0Color())
+            self.haveFiles = true
+        } else {
+            self.actionButton.setTitleColor(KMAppearance.Layout.w0Color().withAlphaComponent(0.6))
+            self.actionButton.layer!.backgroundColor = KMAppearance.Interactive.m0Color().withAlphaComponent(0.6).cgColor
+            self.haveFiles = false
+        }
+    }
+    
+    @IBAction func buttonClicked_Action(_ sender: Any) {
+        if !self.haveFiles { return }
+        //点击开始
+        if (sender as AnyObject).tag == 1 {
+            self.beginBatchOperation()
+        } else if (sender as AnyObject).tag == 0 {
+            self.cancelBatchOperation()
+        }
+    }
+    
+    @IBAction func comprssVauleAction(_ sender: Any) {
+        self.currentType = (comprssSlider.integerValue) as NSNumber;
+    }
+    
+    @IBAction func buttonClicked_ChooseDPI(_ sender: NSButton) {
+        self.dpi300Button.state = .off
+        self.dpi150Button.state = .off
+        self.dpi72Button.state = .off
+        self.dpi50Button.state = .off
+        self.otherChoiceButton.state = .off
+        sender.state = .on
+        if sender.tag == 0 {
+            self.currentType = 120
+        } else if sender.tag == 1 {
+            self.currentType = 90
+        } else if sender.tag == 2 {
+            self.currentType = 60
+        } else if sender.tag == 3 {
+            self.currentType = 30
+        } else {
+            self.currentType = (self.comprssSlider.integerValue) as NSNumber
+        }
+        if sender.tag == 4 {
+            highLabel.isEnabled = true
+            lowLabel.isEnabled = true
+            comprssSlider.isEnabled = true
+            comprssSlider.tipEnabled = true
+            lowLabel.textColor = KMAppearance.Layout.h0Color()
+            highLabel.textColor = KMAppearance.Layout.h0Color()
+            self.lowLabel.alphaValue = 1
+            self.highLabel.alphaValue = 1
+        } else {
+            highLabel.isEnabled = false
+            lowLabel.isEnabled = false
+            comprssSlider.isEnabled = false
+            comprssSlider.tipEnabled = false
+            lowLabel.textColor = KMAppearance.Layout.h0Color()
+            highLabel.textColor = KMAppearance.Layout.h0Color()
+            self.lowLabel.alphaValue = 0.4
+            self.highLabel.alphaValue = 0.4
+        }
+    }
+}

+ 215 - 0
PDF Office/PDF Master/Class/Batch/WindowController/VC/KMBatchOperateCompressViewController.xib

@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="22154" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22154"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMBatchOperateCompressViewController" customModule="PDF_Master" customModuleProvider="target">
+            <connections>
+                <outlet property="actionButton" destination="0oc-wO-giJ" id="H39-W9-bBl"/>
+                <outlet property="comprssSlider" destination="ZM8-au-Zjj" id="3Ya-cJ-SgE"/>
+                <outlet property="dpi150Button" destination="U4U-em-sMp" id="MDZ-vW-xSl"/>
+                <outlet property="dpi150Label" destination="NJ8-R3-NNq" id="P3l-aM-hIK"/>
+                <outlet property="dpi300Button" destination="OzU-e9-6bT" id="SCJ-M4-ELX"/>
+                <outlet property="dpi300Label" destination="9XA-Ss-REU" id="6eo-Ro-vOf"/>
+                <outlet property="dpi50Button" destination="F9r-Rt-hvI" id="Wyy-5t-Muq"/>
+                <outlet property="dpi50Label" destination="G4p-Mj-Wqk" id="Gds-D0-xzg"/>
+                <outlet property="dpi72Button" destination="Nsj-my-flw" id="xZj-dg-3Tq"/>
+                <outlet property="dpi72Label" destination="s3M-WR-b0B" id="D5x-m4-rYj"/>
+                <outlet property="highLabel" destination="uQM-Hg-SLo" id="3wI-j6-K9j"/>
+                <outlet property="lowLabel" destination="tY3-My-5Ov" id="pgE-oh-hQk"/>
+                <outlet property="otherChoiceButton" destination="AR5-qb-z8e" id="z9K-kn-mFS"/>
+                <outlet property="titleLabel" destination="BGJ-le-5vT" id="6Xn-od-bMf"/>
+                <outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customView id="Hz6-mo-xeY">
+            <rect key="frame" x="0.0" y="0.0" width="480" height="299"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="72v-is-Qq6">
+                    <rect key="frame" x="0.0" y="296" width="480" height="5"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="1" id="quc-k2-w7g"/>
+                    </constraints>
+                </box>
+                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="9XA-Ss-REU">
+                    <rect key="frame" x="34" y="245" width="37" height="16"/>
+                    <textFieldCell key="cell" title="Label" id="EuU-hO-Up2">
+                        <font key="font" metaFont="system"/>
+                        <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                        <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                    </textFieldCell>
+                </textField>
+                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="NJ8-R3-NNq">
+                    <rect key="frame" x="34" y="218" width="37" height="16"/>
+                    <textFieldCell key="cell" title="Label" id="7Po-hc-8df">
+                        <font key="font" metaFont="system"/>
+                        <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                        <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                    </textFieldCell>
+                </textField>
+                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="s3M-WR-b0B">
+                    <rect key="frame" x="34" y="191" width="37" height="16"/>
+                    <textFieldCell key="cell" title="Label" id="i0p-bT-jDe">
+                        <font key="font" metaFont="system"/>
+                        <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                        <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                    </textFieldCell>
+                </textField>
+                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="G4p-Mj-Wqk">
+                    <rect key="frame" x="34" y="164" width="37" height="16"/>
+                    <textFieldCell key="cell" title="Label" id="9BY-68-WZA">
+                        <font key="font" metaFont="system"/>
+                        <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                        <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                    </textFieldCell>
+                </textField>
+                <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="OzU-e9-6bT">
+                    <rect key="frame" x="14" y="244" width="57" height="18"/>
+                    <buttonCell key="cell" type="radio" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="3x1-Ae-u97">
+                        <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+                        <font key="font" metaFont="cellTitle"/>
+                    </buttonCell>
+                    <connections>
+                        <action selector="buttonClicked_ChooseDPI:" target="-2" id="66D-aJ-08Q"/>
+                    </connections>
+                </button>
+                <button tag="1" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="U4U-em-sMp">
+                    <rect key="frame" x="14" y="217" width="57" height="18"/>
+                    <buttonCell key="cell" type="radio" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="1QH-PX-Ihr">
+                        <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+                        <font key="font" metaFont="cellTitle"/>
+                    </buttonCell>
+                    <connections>
+                        <action selector="buttonClicked_ChooseDPI:" target="-2" id="7wl-33-ML9"/>
+                    </connections>
+                </button>
+                <button tag="2" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Nsj-my-flw">
+                    <rect key="frame" x="14" y="190" width="57" height="18"/>
+                    <buttonCell key="cell" type="radio" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="BJM-O1-jfP">
+                        <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+                        <font key="font" metaFont="cellTitle"/>
+                    </buttonCell>
+                    <connections>
+                        <action selector="buttonClicked_ChooseDPI:" target="-2" id="WjF-bm-AdH"/>
+                    </connections>
+                </button>
+                <button tag="3" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="F9r-Rt-hvI">
+                    <rect key="frame" x="14" y="163" width="57" height="18"/>
+                    <buttonCell key="cell" type="radio" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="m2Y-Fl-32m">
+                        <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+                        <font key="font" metaFont="cellTitle"/>
+                    </buttonCell>
+                    <connections>
+                        <action selector="buttonClicked_ChooseDPI:" target="-2" id="Dcz-WW-AHw"/>
+                    </connections>
+                </button>
+                <button tag="4" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="AR5-qb-z8e">
+                    <rect key="frame" x="14" y="136.5" width="58" height="18"/>
+                    <buttonCell key="cell" type="radio" title="Radio" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="0v5-ap-CkP">
+                        <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+                        <font key="font" metaFont="cellTitle"/>
+                    </buttonCell>
+                    <connections>
+                        <action selector="buttonClicked_ChooseDPI:" target="-2" id="f7f-xL-i2z"/>
+                    </connections>
+                </button>
+                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="BGJ-le-5vT">
+                    <rect key="frame" x="14" y="272" width="42" height="17"/>
+                    <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="Och-Je-3zh">
+                        <font key="font" metaFont="systemBold" size="14"/>
+                        <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                        <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                    </textFieldCell>
+                </textField>
+                <button tag="1" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0oc-wO-giJ">
+                    <rect key="frame" x="16" y="20" width="448" height="32"/>
+                    <buttonCell key="cell" type="bevel" title="Button" bezelStyle="rounded" alignment="center" imageScaling="proportionallyDown" inset="2" id="IhC-Il-fg0">
+                        <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                        <font key="font" metaFont="system"/>
+                    </buttonCell>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="32" id="KlW-eT-EJK"/>
+                    </constraints>
+                    <connections>
+                        <action selector="buttonClicked_Action:" target="-2" id="cVx-s7-YUc"/>
+                    </connections>
+                </button>
+                <slider verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ZM8-au-Zjj" customClass="KMSlider">
+                    <rect key="frame" x="36" y="100" width="204" height="28"/>
+                    <constraints>
+                        <constraint firstAttribute="width" constant="200" id="stZ-Di-EVJ"/>
+                    </constraints>
+                    <sliderCell key="cell" state="on" alignment="left" minValue="1" maxValue="120" doubleValue="60" tickMarkPosition="above" sliderType="linear" id="CbN-px-RD0"/>
+                    <connections>
+                        <action selector="comprssVauleAction:" target="-2" id="R9C-l8-4aD"/>
+                    </connections>
+                </slider>
+                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="tY3-My-5Ov">
+                    <rect key="frame" x="36" y="85" width="37" height="16"/>
+                    <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="1C5-jz-2Kv">
+                        <font key="font" metaFont="system"/>
+                        <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                        <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                    </textFieldCell>
+                </textField>
+                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="uQM-Hg-SLo">
+                    <rect key="frame" x="203" y="85" width="37" height="16"/>
+                    <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="dmh-q4-Y71">
+                        <font key="font" metaFont="system"/>
+                        <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                        <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                    </textFieldCell>
+                </textField>
+            </subviews>
+            <constraints>
+                <constraint firstItem="9XA-Ss-REU" firstAttribute="centerY" secondItem="OzU-e9-6bT" secondAttribute="centerY" id="1p1-fT-TzM"/>
+                <constraint firstItem="G4p-Mj-Wqk" firstAttribute="top" secondItem="s3M-WR-b0B" secondAttribute="bottom" constant="11" id="38C-um-ZVN"/>
+                <constraint firstItem="tY3-My-5Ov" firstAttribute="leading" secondItem="ZM8-au-Zjj" secondAttribute="leading" id="3xK-Od-rc8"/>
+                <constraint firstItem="tY3-My-5Ov" firstAttribute="top" secondItem="ZM8-au-Zjj" secondAttribute="bottom" constant="5" id="3zc-HZ-9mW"/>
+                <constraint firstItem="9XA-Ss-REU" firstAttribute="trailing" secondItem="OzU-e9-6bT" secondAttribute="trailing" id="5Yl-eP-dd9"/>
+                <constraint firstItem="NJ8-R3-NNq" firstAttribute="top" secondItem="9XA-Ss-REU" secondAttribute="bottom" constant="11" id="6Km-Oy-l7a"/>
+                <constraint firstItem="AR5-qb-z8e" firstAttribute="top" secondItem="G4p-Mj-Wqk" secondAttribute="bottom" constant="11" id="89G-iF-i2d"/>
+                <constraint firstItem="uQM-Hg-SLo" firstAttribute="trailing" secondItem="ZM8-au-Zjj" secondAttribute="trailing" id="AyW-vw-hKS"/>
+                <constraint firstAttribute="trailing" secondItem="72v-is-Qq6" secondAttribute="trailing" id="DDf-yy-kjK"/>
+                <constraint firstItem="0oc-wO-giJ" firstAttribute="centerX" secondItem="Hz6-mo-xeY" secondAttribute="centerX" id="J3G-WV-qWm"/>
+                <constraint firstItem="0oc-wO-giJ" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="16" id="L6H-oZ-GtD"/>
+                <constraint firstItem="BGJ-le-5vT" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="10" id="M94-v9-QZI"/>
+                <constraint firstItem="U4U-em-sMp" firstAttribute="leading" secondItem="BGJ-le-5vT" secondAttribute="leading" id="OoI-JN-bQs"/>
+                <constraint firstAttribute="bottom" secondItem="0oc-wO-giJ" secondAttribute="bottom" constant="20" id="R9j-gx-MC7"/>
+                <constraint firstItem="AR5-qb-z8e" firstAttribute="leading" secondItem="BGJ-le-5vT" secondAttribute="leading" id="Sd9-Lg-XOh"/>
+                <constraint firstItem="NJ8-R3-NNq" firstAttribute="leading" secondItem="9XA-Ss-REU" secondAttribute="leading" id="Sig-4j-H53"/>
+                <constraint firstItem="F9r-Rt-hvI" firstAttribute="leading" secondItem="BGJ-le-5vT" secondAttribute="leading" id="TbI-AD-mVB"/>
+                <constraint firstItem="s3M-WR-b0B" firstAttribute="centerY" secondItem="Nsj-my-flw" secondAttribute="centerY" id="UtI-1M-Jg1"/>
+                <constraint firstItem="ZM8-au-Zjj" firstAttribute="top" secondItem="AR5-qb-z8e" secondAttribute="bottom" constant="12" id="W1x-Wd-n1w"/>
+                <constraint firstItem="ZM8-au-Zjj" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="38" id="XDr-vm-MLB"/>
+                <constraint firstItem="G4p-Mj-Wqk" firstAttribute="leading" secondItem="9XA-Ss-REU" secondAttribute="leading" id="Xgi-jK-m06"/>
+                <constraint firstItem="s3M-WR-b0B" firstAttribute="trailing" secondItem="Nsj-my-flw" secondAttribute="trailing" id="Yb1-x4-cTH"/>
+                <constraint firstItem="BGJ-le-5vT" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="16" id="ZUz-p7-LAt"/>
+                <constraint firstItem="OzU-e9-6bT" firstAttribute="leading" secondItem="BGJ-le-5vT" secondAttribute="leading" id="aZ6-vc-UIW"/>
+                <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="G4p-Mj-Wqk" secondAttribute="trailing" constant="16" id="akS-Dg-5W2"/>
+                <constraint firstItem="NJ8-R3-NNq" firstAttribute="trailing" secondItem="U4U-em-sMp" secondAttribute="trailing" id="bGC-oZ-6Su"/>
+                <constraint firstItem="Nsj-my-flw" firstAttribute="leading" secondItem="BGJ-le-5vT" secondAttribute="leading" id="bjU-Ku-Aug"/>
+                <constraint firstItem="uQM-Hg-SLo" firstAttribute="top" secondItem="ZM8-au-Zjj" secondAttribute="bottom" constant="5" id="bmu-hB-8AM"/>
+                <constraint firstItem="G4p-Mj-Wqk" firstAttribute="trailing" secondItem="F9r-Rt-hvI" secondAttribute="trailing" id="c5P-Me-caF"/>
+                <constraint firstItem="9XA-Ss-REU" firstAttribute="leading" secondItem="OzU-e9-6bT" secondAttribute="leading" constant="20" id="ec6-fM-a8w"/>
+                <constraint firstItem="72v-is-Qq6" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" id="gBv-gr-aPU"/>
+                <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="NJ8-R3-NNq" secondAttribute="trailing" constant="16" id="pSL-jc-LE0"/>
+                <constraint firstItem="72v-is-Qq6" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" id="qWM-3l-PvB"/>
+                <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="9XA-Ss-REU" secondAttribute="trailing" constant="16" id="sFz-9O-Yio"/>
+                <constraint firstItem="s3M-WR-b0B" firstAttribute="leading" secondItem="9XA-Ss-REU" secondAttribute="leading" id="sGV-MD-4BX"/>
+                <constraint firstItem="s3M-WR-b0B" firstAttribute="top" secondItem="NJ8-R3-NNq" secondAttribute="bottom" constant="11" id="sQu-XP-lgA"/>
+                <constraint firstItem="G4p-Mj-Wqk" firstAttribute="centerY" secondItem="F9r-Rt-hvI" secondAttribute="centerY" id="v5c-L4-RBT"/>
+                <constraint firstItem="NJ8-R3-NNq" firstAttribute="centerY" secondItem="U4U-em-sMp" secondAttribute="centerY" id="vwk-Vb-XvI"/>
+                <constraint firstItem="9XA-Ss-REU" firstAttribute="top" secondItem="BGJ-le-5vT" secondAttribute="bottom" constant="11" id="w02-pN-4np"/>
+                <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="s3M-WR-b0B" secondAttribute="trailing" constant="16" id="w9X-uE-LOg"/>
+            </constraints>
+            <point key="canvasLocation" x="-27" y="133.5"/>
+        </customView>
+    </objects>
+</document>

+ 2 - 2
PDF Office/PDF Master/Class/Home/ViewController/KMHomeViewController.xib

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