Browse Source

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

tangchao 1 year ago
parent
commit
1391cde2c4

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

@@ -2878,6 +2878,15 @@
 		BB9695B629BDB03E00FD68D3 /* InfoWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB9695B529BDB03E00FD68D3 /* InfoWindow.xib */; };
 		BB9695B729BDB03E00FD68D3 /* InfoWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB9695B529BDB03E00FD68D3 /* InfoWindow.xib */; };
 		BB9695B829BDB03E00FD68D3 /* InfoWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB9695B529BDB03E00FD68D3 /* InfoWindow.xib */; };
+		BB96A0B02AFCD56100559E24 /* KMToolCompareWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB96A0AF2AFCD56100559E24 /* KMToolCompareWindowController.swift */; };
+		BB96A0B12AFCD56100559E24 /* KMToolCompareWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB96A0AF2AFCD56100559E24 /* KMToolCompareWindowController.swift */; };
+		BB96A0B22AFCD56100559E24 /* KMToolCompareWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB96A0AF2AFCD56100559E24 /* KMToolCompareWindowController.swift */; };
+		BB96A0B42AFCD56B00559E24 /* KMToolCompareWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB96A0B32AFCD56B00559E24 /* KMToolCompareWindowController.xib */; };
+		BB96A0B52AFCD56B00559E24 /* KMToolCompareWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB96A0B32AFCD56B00559E24 /* KMToolCompareWindowController.xib */; };
+		BB96A0B62AFCD56B00559E24 /* KMToolCompareWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB96A0B32AFCD56B00559E24 /* KMToolCompareWindowController.xib */; };
+		BB96A0B82AFCE45800559E24 /* WaitingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB96A0B72AFCE45800559E24 /* WaitingView.swift */; };
+		BB96A0B92AFCE45800559E24 /* WaitingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB96A0B72AFCE45800559E24 /* WaitingView.swift */; };
+		BB96A0BA2AFCE45800559E24 /* WaitingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB96A0B72AFCE45800559E24 /* WaitingView.swift */; };
 		BB981E522AD4F638001988CA /* KMCoverButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB981E502AD4F637001988CA /* KMCoverButton.swift */; };
 		BB981E532AD4F638001988CA /* KMCoverButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB981E502AD4F637001988CA /* KMCoverButton.swift */; };
 		BB981E542AD4F638001988CA /* KMCoverButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB981E502AD4F637001988CA /* KMCoverButton.swift */; };
@@ -2974,6 +2983,7 @@
 		BBA93D3329BF0ECE0044E0DD /* SKKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = BBA93D3229BF0ECD0044E0DD /* SKKeychain.m */; };
 		BBA93D3429BF0ECE0044E0DD /* SKKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = BBA93D3229BF0ECD0044E0DD /* SKKeychain.m */; };
 		BBA93D3529BF0ECE0044E0DD /* SKKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = BBA93D3229BF0ECD0044E0DD /* SKKeychain.m */; };
+		BBAC26A12AFDF54F00563A08 /* KMConvertOperationQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBAC26A02AFDF54F00563A08 /* KMConvertOperationQueue.swift */; };
 		BBADCF582AF3C7B3004ECE0C /* KMBatchOperateAddWatermarkViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBADCF552AF3C7B2004ECE0C /* KMBatchOperateAddWatermarkViewController.xib */; };
 		BBADCF592AF3C7B3004ECE0C /* KMBatchOperateAddWatermarkViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBADCF552AF3C7B2004ECE0C /* KMBatchOperateAddWatermarkViewController.xib */; };
 		BBADCF5A2AF3C7B3004ECE0C /* KMBatchOperateAddWatermarkViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBADCF552AF3C7B2004ECE0C /* KMBatchOperateAddWatermarkViewController.xib */; };
@@ -4755,6 +4765,9 @@
 		BB9695B029BDA46500FD68D3 /* SKLocalization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SKLocalization.h; sourceTree = "<group>"; };
 		BB9695B129BDA46500FD68D3 /* SKLocalization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SKLocalization.m; sourceTree = "<group>"; };
 		BB9695B529BDB03E00FD68D3 /* InfoWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = InfoWindow.xib; sourceTree = "<group>"; };
+		BB96A0AF2AFCD56100559E24 /* KMToolCompareWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMToolCompareWindowController.swift; sourceTree = "<group>"; };
+		BB96A0B32AFCD56B00559E24 /* KMToolCompareWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMToolCompareWindowController.xib; sourceTree = "<group>"; };
+		BB96A0B72AFCE45800559E24 /* WaitingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WaitingView.swift; sourceTree = "<group>"; };
 		BB981E502AD4F637001988CA /* KMCoverButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMCoverButton.swift; sourceTree = "<group>"; };
 		BB981E512AD4F638001988CA /* KMPageIndicator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMPageIndicator.swift; sourceTree = "<group>"; };
 		BB981E582AD4F70D001988CA /* KMWelcomeWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMWelcomeWindowController.swift; sourceTree = "<group>"; };
@@ -4789,6 +4802,7 @@
 		BBA93D2C29BEBAA60044E0DD /* KMPreferenceEnum.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPreferenceEnum.swift; sourceTree = "<group>"; };
 		BBA93D3129BF0ECD0044E0DD /* SKKeychain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SKKeychain.h; sourceTree = "<group>"; };
 		BBA93D3229BF0ECD0044E0DD /* SKKeychain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SKKeychain.m; sourceTree = "<group>"; };
+		BBAC26A02AFDF54F00563A08 /* KMConvertOperationQueue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMConvertOperationQueue.swift; sourceTree = "<group>"; };
 		BBADCF552AF3C7B2004ECE0C /* KMBatchOperateAddWatermarkViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMBatchOperateAddWatermarkViewController.xib; sourceTree = "<group>"; };
 		BBADCF602AF3CB92004ECE0C /* KMWatermarkCollectionViewItem.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMWatermarkCollectionViewItem.xib; sourceTree = "<group>"; };
 		BBAFC8392985194800D0648E /* KMPDFEditAppendWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KMPDFEditAppendWindow.m; sourceTree = "<group>"; };
@@ -7643,6 +7657,8 @@
 			children = (
 				BB1A91692AFB7868005E5FD8 /* KMConvertWindowController.swift */,
 				BB1A916D2AFB7871005E5FD8 /* KMConvertWindowController.xib */,
+				BB96A0AF2AFCD56100559E24 /* KMToolCompareWindowController.swift */,
+				BB96A0B32AFCD56B00559E24 /* KMToolCompareWindowController.xib */,
 			);
 			path = NewController;
 			sourceTree = "<group>";
@@ -8010,6 +8026,7 @@
 				BB9DCC9E2A0A2B0A0024A6F1 /* KMConvertSettingView.swift */,
 				BB49ECE8293F32A400C82CA2 /* KMConvertWordSettingView.swift */,
 				BB49ECE4293EF54800C82CA2 /* KMCustomPDFView.swift */,
+				BB96A0B72AFCE45800559E24 /* WaitingView.swift */,
 			);
 			path = View;
 			sourceTree = "<group>";
@@ -8419,6 +8436,7 @@
 			isa = PBXGroup;
 			children = (
 				BB88E43A294023CB002B3655 /* KMDocumentModel.swift */,
+				BBAC26A02AFDF54F00563A08 /* KMConvertOperationQueue.swift */,
 			);
 			path = Model;
 			sourceTree = "<group>";
@@ -9919,6 +9937,7 @@
 				BB51074229A61B4100978662 /* ProgressSheet.xib in Resources */,
 				BB003031298D315E002DD1A0 /* KMPreferenceMarkupController.xib in Resources */,
 				BB1AEF3529F937A50048D179 /* PDF Master User Guide.pdf in Resources */,
+				BB96A0B42AFCD56B00559E24 /* KMToolCompareWindowController.xib in Resources */,
 				9F0CB49A29683E1000007028 /* KMPropertiesPanelTextSubVC.xib in Resources */,
 				BBB29BCE2AEA190D005F1B6B /* KMToolbarCustomViewController.xib in Resources */,
 				BBC70EA92AEA6EF800AC1585 /* KMToolbarCustomWindowController.xib in Resources */,
@@ -10156,6 +10175,7 @@
 				BB1BFF622AE9FA6C003EB179 /* KMBatchOperateBaseWindowController.xib in Resources */,
 				ADAFDA1D2AE8DD6600F084BC /* KMAdvertisementTableView.xib in Resources */,
 				9F0CB4B92977BC1000007028 /* KMPropertiesPanelPreviewSubVC.xib in Resources */,
+				BB96A0B52AFCD56B00559E24 /* KMToolCompareWindowController.xib in Resources */,
 				9F8539FD2947137500DF644E /* throbber_waiting.png in Resources */,
 				9F8539E42947126000DF644E /* KMChromiumToolbar.xib in Resources */,
 				ADF1569D29A63CBF001D1018 /* KMLightMember.xcassets in Resources */,
@@ -10411,6 +10431,7 @@
 				899700E428F3A9F2009AF911 /* KMHomeWindowController.xib in Resources */,
 				BBC348402955A60B008D2CD1 /* KMBackgroundPropertyInfoController.xib in Resources */,
 				9F0201832A1BAC1600C9B673 /* KMAIRewritingVC.xib in Resources */,
+				BB96A0B62AFCD56B00559E24 /* KMToolCompareWindowController.xib in Resources */,
 				9FDD0F9E2952FF4D000C4DAD /* comp-light.json in Resources */,
 				9F94747D29FA22700042F949 /* InfoPlist.strings in Resources */,
 				9FF94F0E29A62B5000B1EF69 /* KMDesignSelect.xib in Resources */,
@@ -10804,6 +10825,7 @@
 				BB10FAF62AFE2C2900F18D65 /* KMNumberArrayFormatter.swift in Sources */,
 				9F1F82D2292F6D510092C4B4 /* KMPDFInsertPreviewViewController.swift in Sources */,
 				AD02573F2A8601CD00EAD5D5 /* KMAppleLoginManager.swift in Sources */,
+				BB96A0B02AFCD56100559E24 /* KMToolCompareWindowController.swift in Sources */,
 				BBC70EB42AEA847500AC1585 /* KMToolbarCustomViewController.swift in Sources */,
 				BB86C1ED28F544F4005AD968 /* CPDFListView+Event.m in Sources */,
 				BB31DA5E2AFA1B03006D63CB /* KMFontWell.swift in Sources */,
@@ -10882,6 +10904,7 @@
 				9FCFEC702AC40F9B00EAD2CB /* CStampSignatureObject.swift in Sources */,
 				9FDD0F6B294AD12C000C4DAD /* KMMainViewController+UI.swift in Sources */,
 				9F02017E2A1BAC1600C9B673 /* KMAIRewritingVC.swift in Sources */,
+				BB96A0B82AFCE45800559E24 /* WaitingView.swift in Sources */,
 				9FCFECA02AD17B8A00EAD2CB /* SKProgressController.swift in Sources */,
 				89D9897428FE743E003A3E87 /* KMOutlineView.swift in Sources */,
 				AD5999362AD7D9C200412F8B /* KMPropertiesViewPopController.swift in Sources */,
@@ -11301,6 +11324,7 @@
 				89D2D2C5294972B900BFF5FE /* KMFormCellView.swift in Sources */,
 				BB897224294B07960045787C /* KMWatermarkAdjectiveTopBarItemView.swift in Sources */,
 				9F1F82BC292E01860092C4B4 /* KMCloudEmptyCollectionViewItem.swift in Sources */,
+				BBAC26A12AFDF54F00563A08 /* KMConvertOperationQueue.swift in Sources */,
 				AD9527EA2955520C0039D2BC /* KMBaseTextFieldModel.swift in Sources */,
 				BB146FEA299DC0D100784A6A /* GTLRDuration.m in Sources */,
 				BB146FFC299DC0D100784A6A /* OIDAuthState+Mac.m in Sources */,
@@ -11891,6 +11915,7 @@
 				89D2D2FC294C806000BFF5FE /* KMPDFThumbnailItem.swift in Sources */,
 				BB65A06C2AF8D8A1003A27A0 /* KMNotesPreferences.swift in Sources */,
 				9F0CB4EA2986559400007028 /* KMDesignToken+PaddingBottom.swift in Sources */,
+				BB96A0B12AFCD56100559E24 /* KMToolCompareWindowController.swift in Sources */,
 				9F1FE4AF29406E4700E952CA /* CTPresentationModeController.m in Sources */,
 				9F0CB4FA298655E500007028 /* KMDesignToken+Border.swift in Sources */,
 				ADD1B6E92946C02600C3FFF7 /* KMPrintChoosePageSizeMultipageView.swift in Sources */,
@@ -12268,6 +12293,7 @@
 				896DD4562985FB3200ADE514 /* KMPageDisplayThemeCollectionViewItem.swift in Sources */,
 				BBC348542958465C008D2CD1 /* KMBackgroundFilePropertyInfoController.swift in Sources */,
 				AD02573B2A8601AA00EAD5D5 /* KMLoginManager.swift in Sources */,
+				BB96A0B92AFCE45800559E24 /* WaitingView.swift in Sources */,
 				ADD1B70B29471FA500C3FFF7 /* KMPrintChoosePresenter.swift in Sources */,
 				AD8810AA29A8463600178CA1 /* KMAccountInfoWindowController.swift in Sources */,
 				89752DF329389F82003FF08E /* KMToolbarItem.m in Sources */,
@@ -12371,6 +12397,7 @@
 				BB0A55232A30968900B6E84B /* KMDesignBaseView.swift in Sources */,
 				AD9527C8295295110039D2BC /* KMPrintPrinterModel.swift in Sources */,
 				BBB9B32A299A5D6D004F3235 /* GTMAppAuthFetcherAuthorization+Keychain.m in Sources */,
+				BB96A0BA2AFCE45800559E24 /* WaitingView.swift in Sources */,
 				BB146FB0299DC0D100784A6A /* GTLRService.m in Sources */,
 				BB2F18482A0C7E250003F65E /* KMConvertBaseView.swift in Sources */,
 				AD867FC729DFFBC400F00440 /* KMAnnotationOutlineRowView.swift in Sources */,
@@ -12922,6 +12949,7 @@
 				BB146FFE299DC0D100784A6A /* OIDAuthState+Mac.m in Sources */,
 				AD88108F29A760D100178CA1 /* KMRegisterPresenter.swift in Sources */,
 				BB3AAB9229878CE000992A5A /* KMWatermarkAdjectivePropertyMainController.swift in Sources */,
+				BB96A0B22AFCD56100559E24 /* KMToolCompareWindowController.swift in Sources */,
 				9F0201802A1BAC1600C9B673 /* KMAIRewritingVC.swift in Sources */,
 				BBCE57122A72712200508EFC /* NSWindowController+KMExtension.swift in Sources */,
 				BB10FAF02AFE233C00F18D65 /* KMLineInspector.swift in Sources */,

+ 10 - 0
PDF Office/PDF Master/Class/Batch/Tools/KMBatchHeader.swift

@@ -45,6 +45,16 @@ import Foundation
     case AdvancedWord
 }
 
+@objc enum KMCompareWithToolType: Int {
+    case Convert = 0
+    case OCR
+    case PageEdit
+    case PDFEdit
+    case FromSign
+    case EditPDF
+    case Sign
+}
+
 @objc enum KMBatchOperationType: Int {
     case NotDetermined = 0
     case CreatePDF

+ 2 - 6
PDF Office/PDF Master/Class/PDFTools/AddHeaderFooter/Model/KMBatchAddHeaderFooterOperation.swift

@@ -94,15 +94,11 @@ class KMBatchAddHeaderFooterOperation: KMBatchOperation{
         var filePath = self.pdfDocument?.documentURL?.path
         let password = self.password
         if filePath == nil {
-            var str = String(format: "%@.pdf", KMLocalizedString("Untitled", nil))
+            let str = String(format: "%@.pdf", KMLocalizedString("Untitled", nil))
             let writeSuccess = self.pdfDocument!.write(to: URL(fileURLWithPath: (kTempSavePath?.stringByAppendingPathComponent(str))!))
             if writeSuccess {
                 let newDocument: CPDFDocument = CPDFDocument(url: URL(fileURLWithPath: (kTempSavePath?.stringByAppendingPathComponent(str))!))
-                if #available(macOS 13.0, *) {
-                    filePath = newDocument.documentURL?.path()
-                } else {
-                    // Fallback on earlier versions
-                }
+                filePath = newDocument.documentURL?.path
             } else {
                 NSSound.beep()
                 return

+ 16 - 16
PDF Office/PDF Master/Class/PDFTools/AddPassword/VC/KMBatchOperateAddPasswordViewController.xib

@@ -46,7 +46,7 @@
                         <constraint firstAttribute="height" constant="1" id="0dB-En-scn"/>
                     </constraints>
                 </box>
-                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="WH9-YI-qOJ">
+                <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="WH9-YI-qOJ">
                     <rect key="frame" x="14" y="566" width="390" height="17"/>
                     <textFieldCell key="cell" title="Label" id="01P-7a-fqT">
                         <font key="font" metaFont="systemBold" size="14"/>
@@ -54,7 +54,7 @@
                         <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                     </textFieldCell>
                 </textField>
-                <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="DhJ-5m-2ap">
+                <textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="DhJ-5m-2ap">
                     <rect key="frame" x="34" y="470" width="350" height="16"/>
                     <textFieldCell key="cell" selectable="YES" enabled="NO" title="Restrict printing and copying of the document." id="eLv-e1-44C">
                         <font key="font" metaFont="system"/>
@@ -75,7 +75,7 @@
                         <action selector="buttonAction_NeedOwnerPassword:" target="-2" id="IVn-TD-urF"/>
                     </connections>
                 </button>
-                <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Wnl-ub-aCR" customClass="NSSecureTextField" customModule="PDF_Master" customModuleProvider="target">
+                <textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Wnl-ub-aCR" customClass="NSSecureTextField" customModule="PDF_Master" customModuleProvider="target">
                     <rect key="frame" x="33" y="505" width="176" height="24"/>
                     <constraints>
                         <constraint firstAttribute="height" constant="24" id="AUi-Ff-HBA"/>
@@ -87,7 +87,7 @@
                         <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                     </textFieldCell>
                 </textField>
-                <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="k7w-MX-pe3" customClass="NSSecureTextField" customModule="PDF_Master" customModuleProvider="target">
+                <textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="k7w-MX-pe3" customClass="NSSecureTextField" customModule="PDF_Master" customModuleProvider="target">
                     <rect key="frame" x="33" y="437" width="176" height="24"/>
                     <constraints>
                         <constraint firstAttribute="height" constant="24" id="NBw-0c-qhR"/>
@@ -108,7 +108,7 @@
                         <action selector="buttonClickedHelp:" target="-2" id="TTq-MK-F6E"/>
                     </connections>
                 </button>
-                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="njT-1c-KYv">
+                <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="njT-1c-KYv">
                     <rect key="frame" x="51" y="412" width="160" height="15"/>
                     <textFieldCell key="cell" title="Check" id="bK5-w5-VVt">
                         <font key="font" metaFont="cellTitle"/>
@@ -126,7 +126,7 @@
                         <action selector="buttonAction_ForbidPrint:" target="-2" id="IEi-DW-hm8"/>
                     </connections>
                 </button>
-                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="vSh-Gt-ruS">
+                <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="vSh-Gt-ruS">
                     <rect key="frame" x="51" y="385" width="160" height="15"/>
                     <textFieldCell key="cell" title="Check" id="xYq-1H-Njs">
                         <font key="font" metaFont="cellTitle"/>
@@ -144,7 +144,7 @@
                         <action selector="buttonAction_ForbidCopy:" target="-2" id="q34-jk-cC4"/>
                     </connections>
                 </button>
-                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0TH-K7-3B0">
+                <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0TH-K7-3B0">
                     <rect key="frame" x="14" y="339" width="390" height="17"/>
                     <textFieldCell key="cell" title="Label" id="s8M-4s-ydW">
                         <font key="font" metaFont="systemBold" size="14"/>
@@ -152,7 +152,7 @@
                         <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                     </textFieldCell>
                 </textField>
-                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gMK-hN-4n6">
+                <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gMK-hN-4n6">
                     <rect key="frame" x="14" y="314" width="35" height="15"/>
                     <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="Qs0-ho-o0r">
                         <font key="font" metaFont="cellTitle"/>
@@ -160,7 +160,7 @@
                         <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                     </textFieldCell>
                 </textField>
-                <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3Ld-O7-I8s">
+                <textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3Ld-O7-I8s">
                     <rect key="frame" x="16" y="283" width="386" height="24"/>
                     <constraints>
                         <constraint firstAttribute="height" constant="24" id="ivi-a1-T3K"/>
@@ -174,7 +174,7 @@
                         <outlet property="nextKeyView" destination="Knr-KG-HzN" id="eQC-mk-IOO"/>
                     </connections>
                 </textField>
-                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="5Ia-uJ-1zk">
+                <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="5Ia-uJ-1zk">
                     <rect key="frame" x="14" y="258" width="35" height="15"/>
                     <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="a3j-bi-Gjh">
                         <font key="font" metaFont="cellTitle"/>
@@ -182,7 +182,7 @@
                         <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                     </textFieldCell>
                 </textField>
-                <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Knr-KG-HzN">
+                <textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Knr-KG-HzN">
                     <rect key="frame" x="16" y="227" width="386" height="24"/>
                     <constraints>
                         <constraint firstAttribute="height" constant="24" id="rqX-rD-fdB"/>
@@ -196,7 +196,7 @@
                         <outlet property="nextKeyView" destination="0db-BN-jf9" id="0j8-WR-hHO"/>
                     </connections>
                 </textField>
-                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="53H-47-woj">
+                <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="53H-47-woj">
                     <rect key="frame" x="14" y="202" width="35" height="15"/>
                     <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="JBs-PL-iXs">
                         <font key="font" metaFont="cellTitle"/>
@@ -204,7 +204,7 @@
                         <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                     </textFieldCell>
                 </textField>
-                <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0db-BN-jf9">
+                <textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0db-BN-jf9">
                     <rect key="frame" x="16" y="171" width="386" height="24"/>
                     <constraints>
                         <constraint firstAttribute="height" constant="24" id="GDb-y2-og8"/>
@@ -218,7 +218,7 @@
                         <outlet property="nextKeyView" destination="QQz-ZP-vnb" id="FxR-nb-L1q"/>
                     </connections>
                 </textField>
-                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="yxH-ic-i9s">
+                <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="yxH-ic-i9s">
                     <rect key="frame" x="14" y="146" width="35" height="15"/>
                     <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="xuB-7I-TLF">
                         <font key="font" metaFont="cellTitle"/>
@@ -226,7 +226,7 @@
                         <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                     </textFieldCell>
                 </textField>
-                <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="QQz-ZP-vnb">
+                <textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="QQz-ZP-vnb">
                     <rect key="frame" x="16" y="115" width="386" height="24"/>
                     <constraints>
                         <constraint firstAttribute="height" constant="24" id="fy5-n5-lXx"/>
@@ -263,7 +263,7 @@
                         <action selector="buttonClickedHelp:" target="-2" id="TMw-Ff-Iuv"/>
                     </connections>
                 </button>
-                <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="ejq-fj-BBb">
+                <textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="ejq-fj-BBb">
                     <rect key="frame" x="34" y="537" width="350" height="16"/>
                     <textFieldCell key="cell" selectable="YES" enabled="NO" title="Multiline Label" id="WNY-wr-3jj">
                         <font key="font" metaFont="system"/>

+ 16 - 0
PDF Office/PDF Master/Class/PDFTools/Convert/Model/KMConvertOperationQueue.swift

@@ -0,0 +1,16 @@
+//
+//  KMConvertOperationQueue.swift
+//  PDF Master
+//
+//  Created by liujiajie on 2023/11/10.
+//
+
+import Foundation
+
+class KMConvertOperationQueue: KMOperationQueue{
+    static let sharedQueue: KMConvertOperationQueue = {
+        let queue = KMConvertOperationQueue()
+        return queue
+    }()
+    
+}

+ 14 - 14
PDF Office/PDF Master/Class/PDFTools/Convert/NewController/KMConvertWindowController.swift

@@ -872,20 +872,20 @@ class KMConvertWindowController: NSWindowController, NSTextFieldDelegate, NSWind
         }
     }
     @IBAction func buttonClicked_MoreConvert(_ sender: Any) {
-//        var vc: KMToolCompareWindowController? = nil
-//        if .Word == self.convertType || .AdvancedWord == self.convertType {
-//            vc = KMToolCompareWindowController.toolCompare(withType: .convert, setSelectIndex: 1)
-//        } else if .Excel == self.convertType {
-//            vc = KMToolCompareWindowController.toolCompare(withType: .convert, setSelectIndex: 2)
-//        } else if .PPT == self.convertType {
-//            vc = KMToolCompareWindowController.toolCompare(withType: .convert, setSelectIndex: 3)
-//        } else if 7 < self.convertType?.rawValue ?? 0 && self.convertType?.rawValue ?? 0 < 15 {
-//            vc = KMToolCompareWindowController.toolCompare(withType: .convert, setSelectIndex: 4)
-//        } else {
-//            vc = KMToolCompareWindowController.toolCompare(withType: .convert, setSelectIndex: 0)
-//        }
-//        vc?.showWindow(nil) 
-//        self.buttonClicked_Cancel(cancelButton)
+        var vc: KMToolCompareWindowController? = nil
+        if .Word == self.convertType || .AdvancedWord == self.convertType {
+            vc = KMToolCompareWindowController.init(toolType: .Convert, selectNum: 1)
+        } else if .Excel == self.convertType {
+            vc = KMToolCompareWindowController.init(toolType: .Convert, selectNum: 2)
+        } else if .PPT == self.convertType {
+            vc = KMToolCompareWindowController.init(toolType: .Convert, selectNum: 3)
+        } else if 7 < self.convertType?.rawValue ?? 0 && self.convertType?.rawValue ?? 0 < 15 {
+            vc = KMToolCompareWindowController.init(toolType: .Convert, selectNum: 4)
+        } else {
+            vc = KMToolCompareWindowController.init(toolType: .Convert, selectNum: 0)
+        }
+        vc?.showWindow(nil) 
+        self.buttonClicked_Cancel(cancelButton)
     }
     @IBAction func buttonItemClick_SepSingle(_ sender: Any) {
         if .on == self.singleButton.state {

+ 98 - 0
PDF Office/PDF Master/Class/PDFTools/Convert/NewController/KMToolCompareWindowController.swift

@@ -0,0 +1,98 @@
+//
+//  KMToolCompareWindowController.swift
+//  PDF Master
+//
+//  Created by liujiajie on 2023/11/9.
+//
+
+import Cocoa
+
+var currentWindowController: KMToolCompareWindowController? = nil
+
+class KMToolCompareWindowController: NSWindowController{
+    var type: KMCompareWithToolType?
+
+    var selectIndex: Int = 0
+
+    @IBOutlet var box: NSBox!
+
+    var modalSession: NSApplication.ModalSession?
+    
+    deinit {
+        NotificationCenter.default.removeObserver(self)
+    }
+    
+    convenience init(toolType: KMCompareWithToolType, selectNum: Int) {
+        self.init(windowNibName: "KMToolCompareWindowController")
+        self.type = toolType
+        self.selectIndex = selectNum
+    }
+    
+    func toolCompareWith(toolType:KMCompareWithToolType, selectNum:Int) -> KMToolCompareWindowController {
+        if (currentWindowController != nil) {
+            return currentWindowController!
+        }
+        let vc = KMToolCompareWindowController(toolType: toolType, selectNum: selectNum)
+        currentWindowController = vc
+        return vc
+    }
+    
+    override func windowDidLoad() {
+        super.windowDidLoad()
+#if VERSION_DMG
+//        IAPProductsManager.defaultManager().loadProducts()
+        NotificationCenter.default.addObserver(self, selector: #selector(IAPProductLoadedNotification(notification:)), name: NSNotification.Name("KMIAPProductLoadedNotification"), object: nil)
+        NotificationCenter.default.addObserver(self, selector: #selector(IAPSubscriptionLoadedNotification(notification:)), name: NSNotification.Name("KMIAPSubscriptionLoadedNotification"), object: nil)
+        NotificationCenter.default.addObserver(self, selector: #selector(IAPProductPurchasedNotification(notification:)), name: NSNotification.Name("KMIAPProductPurchasedNotification"), object: nil)
+        NotificationCenter.default.addObserver(self, selector: #selector(IAPProductFailedNotification(notification:)), name: NSNotification.Name("KMIAPProductFailedNotification"), object: nil)
+        NotificationCenter.default.addObserver(self, selector: #selector(IAPProductRestoreFinishedNotification(notification:)), name: NSNotification.Name("KMIAPProductRestoreFinishedNotification"), object: nil)
+        NotificationCenter.default.addObserver(self, selector: #selector(IAPProductRestoreFailedNotification(notification:)), name: NSNotification.Name("KMIAPProductRestoreFailedNotification"), object: nil)
+#endif
+        
+    }
+    
+    func removeWaitingView(view: NSView) {
+        for subview in view.subviews {
+            if subview is WaitingView {
+                subview.removeFromSuperview()
+                break
+            }
+        }
+    }
+    
+    func reloadData() {
+//        if IAPProductsManager.defaultManager().isAvailableAllFunction {
+//            self.payConvertCompareViewController.reloadData()
+//        } else {
+//            self.convertCompareViewController.reloadData()
+//        }
+    }
+    
+    @objc func IAPProductFailedNotification(notification: NSNotification) {
+        self.removeWaitingView(view: (self.window?.contentView)!)
+    }
+  
+    @objc func IAPProductPurchasedNotification(notification: NSNotification) {
+        self.removeWaitingView(view: (self.window?.contentView)!)
+        self.reloadData()
+    }
+    
+    @objc func IAPProductLoadedNotification(notification: NSNotification) {
+        self.reloadData()
+    }
+
+    @objc func IAPProductRestoreFinishedNotification(notification: NSNotification) {
+        self.removeWaitingView(view: (self.window?.contentView)!)
+        self.reloadData()
+    }
+  
+    @objc func IAPProductRestoreFailedNotification(notification: NSNotification) {
+        self.removeWaitingView(view: (self.window?.contentView)!)
+    }
+   
+    @objc func IAPSubscriptionLoadedNotification(notification: NSNotification) {
+        self.removeWaitingView(view: (self.window?.contentView)!)
+        self.reloadData()
+    }
+   
+}

+ 47 - 0
PDF Office/PDF Master/Class/PDFTools/Convert/NewController/KMToolCompareWindowController.xib

@@ -0,0 +1,47 @@
+<?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="KMToolCompareWindowController">
+            <connections>
+                <outlet property="box" destination="itV-9f-OvL" id="tkj-Gf-2qv"/>
+                <outlet property="window" destination="F0z-JX-Cv5" id="gIp-Ho-8D9"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="documentWindow" titlebarAppearsTransparent="YES" titleVisibility="hidden" id="F0z-JX-Cv5">
+            <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
+            <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
+            <rect key="contentRect" x="374" y="227" width="596" height="404"/>
+            <rect key="screenRect" x="0.0" y="0.0" width="2560" height="1415"/>
+            <view key="contentView" wantsLayer="YES" id="se5-gp-TjO">
+                <rect key="frame" x="0.0" y="0.0" width="596" height="404"/>
+                <autoresizingMask key="autoresizingMask"/>
+                <subviews>
+                    <box boxType="custom" borderType="none" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="itV-9f-OvL">
+                        <rect key="frame" x="0.0" y="0.0" width="596" height="404"/>
+                        <view key="contentView" id="2J4-Kq-rG7">
+                            <rect key="frame" x="0.0" y="0.0" width="596" height="404"/>
+                            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        </view>
+                    </box>
+                </subviews>
+                <constraints>
+                    <constraint firstAttribute="bottom" secondItem="itV-9f-OvL" secondAttribute="bottom" id="0yA-eX-Jbe"/>
+                    <constraint firstItem="itV-9f-OvL" firstAttribute="top" secondItem="se5-gp-TjO" secondAttribute="top" id="DnU-fE-4f1"/>
+                    <constraint firstItem="itV-9f-OvL" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" id="qpL-Z5-ZuV"/>
+                    <constraint firstAttribute="trailing" secondItem="itV-9f-OvL" secondAttribute="trailing" id="xL9-xv-52W"/>
+                </constraints>
+            </view>
+            <connections>
+                <outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
+            </connections>
+            <point key="canvasLocation" x="231" y="133"/>
+        </window>
+    </objects>
+</document>

+ 56 - 0
PDF Office/PDF Master/Class/PDFTools/Convert/View/WaitingView.swift

@@ -0,0 +1,56 @@
+//
+//  WaitingView.swift
+//  PDF Master
+//
+//  Created by liujiajie on 2023/11/9.
+//
+
+import Cocoa
+
+class WaitingView: NSView{
+    var indicator: NSProgressIndicator?
+    override init(frame frameRect: NSRect) {
+        super.init(frame: frameRect)
+        var _indicator = NSProgressIndicator()
+        _indicator.isBezeled = false
+        _indicator.autoresizingMask = [.minXMargin, .maxXMargin, .minYMargin, .maxYMargin]
+        _indicator.style = .spinning
+        _indicator.controlSize = .regular
+        _indicator.usesThreadedAnimation = true
+        _indicator.sizeToFit()
+       self.addSubview(_indicator)
+       _indicator.center()
+        self.indicator = _indicator
+    }
+    
+    required init?(coder: NSCoder) {
+        super.init(coder: coder)
+    }
+    
+    func startAnimation() {
+        indicator!.startAnimation(nil)
+    }
+    
+    override func draw(_ dirtyRect: NSRect) {
+        NSColor(calibratedRed: 1.0, green: 1.0, blue: 1.0, alpha: 0.5).set()
+        NSBezierPath(rect: self.bounds).fill()
+    }
+    override func mouseDown(with theEvent: NSEvent) {
+        
+    } 
+    override func mouseUp(with theEvent: NSEvent) {
+        
+    }
+}
+
+extension NSView{
+    func center(){
+        guard let superview = self.superview else { return }
+        self.frame = NSMakeRect(
+            0.5 * (superview.frame.size.width - self.frame.size.width),
+            0.5 * (superview.frame.size.height - self.frame.size.height),
+            self.frame.size.width,
+            self.frame.size.height
+        )
+    }
+}

+ 85 - 2
PDF Office/PDF Master/Class/PDFTools/Merge/MergeNew/View/KMMergeBlankView/KMMergeBlankView.swift

@@ -7,12 +7,95 @@
 
 import Cocoa
 
-class KMMergeBlankView: NSView {
-
+typealias KMMergeBlankViewDragAction = (_ view: KMMergeBlankView, _ fileNames: [URL]) -> Void
+class KMMergeBlankView: KMBaseXibView {
+    @IBOutlet weak var selectViewBox: KMBox!
+    @IBOutlet weak var iconImageView: NSImageView!
+    @IBOutlet weak var titleLable: NSTextField!
+    @IBOutlet weak var subTitleLabel: NSTextField!
+    
+    var dragAction: KMMergeBlankViewDragAction?
+    
     override func draw(_ dirtyRect: NSRect) {
         super.draw(dirtyRect)
 
         // Drawing code here.
     }
     
+    override func setup() {
+        self.titleLable.stringValue = NSLocalizedString("Select Files", comment: "")
+        self.subTitleLabel.stringValue = NSLocalizedString("Drop files here or Click Add Files at upper left corner. You can drag files to reorder as you need.", comment: "")
+        
+        
+//        selectViewBox.moveCallback = { [unowned self] mouseEntered, mouseBox in
+//            if mouseEntered {
+//                iconImageView.image = NSImage(named: "KMImageNameEmptyListHov")
+//            } else {
+//                iconImageView.image = NSImage(named: "KMImageNameEmptyListNor")
+//            }
+//        }
+//        
+//        selectViewBox.downCallback = { [unowned self] downEntered, mouseBox, event in
+//            if downEntered {
+//                iconImageView.image = NSImage(named: "KMImageNameEmptyListPre")
+//            } else {
+//                iconImageView.image = NSImage(named: "KMImageNameEmptyListHov")
+//            }
+//        }
+        
+        registerForDraggedTypes([.fileURL])
+    }
+}
+
+extension KMMergeBlankView {
+    override func draggingExited(_ sender: NSDraggingInfo?) {
+
+    }
+
+    override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation {
+        let pboard = sender.draggingPasteboard
+        var isCanDrag = false
+        var result = NSDragOperation.copy
+        
+        if pboard.availableType(from: [.fileURL]) != nil {
+            if let fileNames = pboard.propertyList(forType: .fileURL) as? [String] {
+                for path in fileNames {
+                    if path.lowercased().hasSuffix("pdf") {
+                        isCanDrag = true
+                    } else {
+                        isCanDrag = false
+                        break
+                    }
+                }
+            }
+        }
+        
+        self.layer?.borderColor = NSColor.clear.cgColor
+        
+        if isCanDrag {
+            result = NSDragOperation.copy
+        }
+        
+        return result
+    }
+
+    override func prepareForDragOperation(_ sender: NSDraggingInfo) -> Bool {
+        let pboard = sender.draggingPasteboard
+        if pboard.availableType(from: [.fileURL]) != nil {
+            var urls: [URL] = []
+            for item in pboard.pasteboardItems! {
+                let fileURL = item.string(forType: .fileURL)
+                if (fileURL == nil) {
+                    continue
+                }
+                let path = URL.init(string: fileURL!)
+                urls.append(path!)
+                if (path == nil) {
+                    continue
+                }
+            }
+            dragAction?(self, urls)
+        }
+        return true
+    }
 }

+ 63 - 4
PDF Office/PDF Master/Class/PDFTools/Merge/MergeNew/View/KMMergeBlankView/KMMergeBlankView.xib

@@ -1,15 +1,74 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11134" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+<?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">
     <dependencies>
-        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11134"/>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22155"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>
-        <customObject id="-2" userLabel="File's Owner"/>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMMergeBlankView" customModule="PDF_Master" customModuleProvider="target">
+            <connections>
+                <outlet property="iconImageView" destination="Q2N-Tf-H5f" id="Afs-uj-IHu"/>
+                <outlet property="subTitleLabel" destination="5Oj-UO-Lu1" id="juH-rI-6Pj"/>
+                <outlet property="titleLable" destination="2fO-qA-Ys3" id="o2j-LY-F9d"/>
+            </connections>
+        </customObject>
         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
         <customObject id="-3" userLabel="Application" customClass="NSObject"/>
         <customView id="c22-O7-iKe">
             <rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
             <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <customView translatesAutoresizingMaskIntoConstraints="NO" id="VlN-ah-v0N">
+                    <rect key="frame" x="103" y="42" width="275" height="188"/>
+                    <subviews>
+                        <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Q2N-Tf-H5f">
+                            <rect key="frame" x="67" y="48" width="140" height="140"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="140" id="JMA-Gr-W5h"/>
+                                <constraint firstAttribute="height" constant="140" id="bTE-a4-TAO"/>
+                            </constraints>
+                            <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="KMImageNameEmptyListNor" id="3IP-Mo-Ab2"/>
+                        </imageView>
+                        <textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="2fO-qA-Ys3">
+                            <rect key="frame" x="91" y="32" width="92" height="16"/>
+                            <textFieldCell key="cell" title="Multiline Label" id="S3f-OA-K2O">
+                                <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 focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="5Oj-UO-Lu1">
+                            <rect key="frame" x="89" y="8" width="96" height="16"/>
+                            <textFieldCell key="cell" alignment="center" title="Multiline Label" id="Gay-dg-FTT">
+                                <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 firstAttribute="width" constant="275" id="1nX-kl-LGA"/>
+                        <constraint firstItem="Q2N-Tf-H5f" firstAttribute="centerX" secondItem="VlN-ah-v0N" secondAttribute="centerX" id="6qD-Ci-PB8"/>
+                        <constraint firstAttribute="bottom" secondItem="5Oj-UO-Lu1" secondAttribute="bottom" constant="8" id="Av7-oi-q7O"/>
+                        <constraint firstItem="2fO-qA-Ys3" firstAttribute="top" secondItem="Q2N-Tf-H5f" secondAttribute="bottom" id="E53-Ab-hG7"/>
+                        <constraint firstItem="5Oj-UO-Lu1" firstAttribute="top" secondItem="2fO-qA-Ys3" secondAttribute="bottom" constant="8" id="XLy-wr-E3U"/>
+                        <constraint firstItem="Q2N-Tf-H5f" firstAttribute="top" secondItem="VlN-ah-v0N" secondAttribute="top" id="avG-5M-qBC"/>
+                        <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="5Oj-UO-Lu1" secondAttribute="trailing" id="dfr-gS-ogu"/>
+                        <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="2fO-qA-Ys3" secondAttribute="trailing" id="dui-G5-IQa"/>
+                        <constraint firstItem="2fO-qA-Ys3" firstAttribute="centerX" secondItem="VlN-ah-v0N" secondAttribute="centerX" id="heE-V7-yq2"/>
+                        <constraint firstItem="5Oj-UO-Lu1" firstAttribute="centerX" secondItem="VlN-ah-v0N" secondAttribute="centerX" id="ixj-o8-d8U"/>
+                    </constraints>
+                </customView>
+            </subviews>
+            <constraints>
+                <constraint firstItem="VlN-ah-v0N" firstAttribute="centerX" secondItem="c22-O7-iKe" secondAttribute="centerX" id="Xrx-dv-7k1"/>
+                <constraint firstItem="VlN-ah-v0N" firstAttribute="centerY" secondItem="c22-O7-iKe" secondAttribute="centerY" id="zm0-x8-aD4"/>
+            </constraints>
+            <point key="canvasLocation" x="34" y="-72"/>
         </customView>
     </objects>
+    <resources>
+        <image name="KMImageNameEmptyListNor" width="200" height="200"/>
+    </resources>
 </document>

+ 69 - 7
PDF Office/PDF Master/Class/PDFTools/Merge/MergeNew/View/KMMergeView.swift

@@ -49,7 +49,7 @@ class KMMergeView: KMBaseXibView {
     var files: [KMFileAttribute] = [] //导入文件
     var lockFiles: [KMFileAttribute] = [] //存在密码文件
     var lockFilesIndex: Int = 0
-    
+    var newPageSize = CGSizeZero
     
     var insertRow: Int = 0
     override func draw(_ dirtyRect: NSRect) {
@@ -68,11 +68,15 @@ class KMMergeView: KMBaseXibView {
         tableview.dataSource = self
         tableview.allowsMultipleSelection = true
         
-        tableview.register(NSNib.init(nibNamed: "KMMergeTableViewCell", bundle: nil), forIdentifier: NSUserInterfaceItemIdentifier(rawValue: "KMMergeTableViewCell"))
+//        tableview.register(NSNib.init(nibNamed: "KMMergeTableViewCell", bundle: nil), forIdentifier: NSUserInterfaceItemIdentifier(rawValue: "KMMergeTableViewCell"))
         
         progress.isHidden = true
         
         boxLabel.textColor = KMAppearance.Layout.h0Color()
+        
+        blankView.dragAction = { [unowned self] view, filePaths in
+            self.addFilePaths(urls: filePaths)
+        }
     }
     
     override func updateLanguage() {
@@ -96,6 +100,12 @@ class KMMergeView: KMBaseXibView {
     
     override func reloadData() {
         self.updateButtonState()
+        if files.count != 0 {
+            self.blankView.isHidden = true
+        } else {
+            self.blankView.isHidden = false
+        }
+        
         self.tableview.reloadData()
     }
     
@@ -126,17 +136,24 @@ extension KMMergeView: NSTableViewDataSource {
     }
     
     func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
-        let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "KMMergeTableViewCell"), owner: self) as? KMMergeTableViewCell
-        cell?.removeAction = { [unowned self] view, model in
-            self.files.removeObject(model)
-            self.reloadData()
+        if let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier("KMMergeTableViewCell"), owner: nil) as? KMMergeTableViewCell {
+            // 配置单元格的显示内容
+            cell.removeAction = { [unowned self] view, model in
+                self.files.removeObject(model)
+                self.reloadData()
+            }
+            return cell
         }
-        return cell
+        return nil
     }
     
     func tableView(_ tableView: NSTableView, shouldSelect tableColumn: NSTableColumn?) -> Bool {
         return false
     }
+    
+    func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat {
+        return 60
+    }
 }
 
 extension KMMergeView: NSTableViewDelegate {
@@ -269,6 +286,9 @@ extension KMMergeView: NSTableViewDelegate {
 
 extension KMMergeView {
     @IBAction func clearButtonAction(_ sender: Any) {
+        self.files.removeAll()
+        self.reloadData()
+        
         guard let callBack = clearAction else { return }
         
         callBack(self)
@@ -291,12 +311,52 @@ extension KMMergeView {
         
         callBack(self)
     }
+    
+    @IBAction func sizeButtonAction(_ sender: NSButton) {
+        originalSizeButton.state = .off
+        A3SizeButton.state = .off
+        A4SizeButton.state = .off
+        USLetterSizeButton.state = .off
+        USLegalButton.state = .off
+        customSizeButton.state = .off
+        sender.state = .on
+        
+        pageSizeHeightTextField.isEnabled = sender.isEqual(customSizeButton)
+        pageSizeWidthTextField.isEnabled = sender.isEqual(customSizeButton)
+        
+        var size = CGSizeZero
+        switch sender.tag {
+        case 0:
+            break
+        case 1:
+            size = CGSizeMake(595, 841);
+            break;
+        case 2:
+            size = CGSizeMake(841, 1190);
+            break;
+        case 3:
+            size = CGSizeMake(612, 792);
+            break;
+        case 4:
+            size = CGSizeMake(612, 1108);
+            break;
+        case 5:
+            size = CGSizeMake(595, 841);
+            pageSizeWidthTextField.stringValue = size.width.description
+            pageSizeHeightTextField.stringValue = size.height.description
+            break;
+        default:
+            break
+        }
+        self.newPageSize = size
+    }
 }
 
 //MARK: public
 extension KMMergeView {
     func addFilePaths(urls: [URL]) {
         lockFiles.removeAll()
+        files.removeAll()
         
         for url in urls {
             let file = KMFileAttribute()
@@ -331,6 +391,8 @@ extension KMMergeView {
                 }
                 
             }
+        } else {
+            completion(true, "")
         }
     }
 }

+ 21 - 3
PDF Office/PDF Master/Class/PDFTools/Merge/MergeNew/View/KMMergeView.xib

@@ -42,9 +42,6 @@
                         <customView translatesAutoresizingMaskIntoConstraints="NO" id="etf-2M-YwD">
                             <rect key="frame" x="40" y="60" width="480" height="489"/>
                             <subviews>
-                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="Fxn-3r-IMx" customClass="KMMergeBlankView" customModule="PDF_Master" customModuleProvider="target">
-                                    <rect key="frame" x="0.0" y="0.0" width="480" height="489"/>
-                                </customView>
                                 <scrollView autohidesScrollers="YES" horizontalLineScroll="122" horizontalPageScroll="10" verticalLineScroll="122" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="eYV-Ln-Tgq">
                                     <rect key="frame" x="0.0" y="0.0" width="480" height="489"/>
                                     <clipView key="contentView" drawsBackground="NO" id="fdS-X3-PXq">
@@ -205,6 +202,9 @@
                                         <autoresizingMask key="autoresizingMask"/>
                                     </scroller>
                                 </scrollView>
+                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="Fxn-3r-IMx" customClass="KMMergeBlankView" customModule="PDF_Master" customModuleProvider="target">
+                                    <rect key="frame" x="0.0" y="0.0" width="480" height="489"/>
+                                </customView>
                             </subviews>
                             <constraints>
                                 <constraint firstItem="Fxn-3r-IMx" firstAttribute="leading" secondItem="etf-2M-YwD" secondAttribute="leading" id="462-eC-IZR"/>
@@ -281,6 +281,9 @@ Gw
                                             <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
                                             <font key="font" metaFont="system"/>
                                         </buttonCell>
+                                        <connections>
+                                            <action selector="sizeButtonAction:" target="-2" id="6wn-AB-Ppz"/>
+                                        </connections>
                                     </button>
                                     <button tag="1" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2ei-fd-tJ7">
                                         <rect key="frame" x="14" y="424" width="61" height="18"/>
@@ -288,6 +291,9 @@ Gw
                                             <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
                                             <font key="font" metaFont="system"/>
                                         </buttonCell>
+                                        <connections>
+                                            <action selector="sizeButtonAction:" target="-2" id="M9K-U9-GK5"/>
+                                        </connections>
                                     </button>
                                     <button tag="3" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="zI3-nm-B9g">
                                         <rect key="frame" x="14" y="370" width="61" height="18"/>
@@ -295,6 +301,9 @@ Gw
                                             <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
                                             <font key="font" metaFont="system"/>
                                         </buttonCell>
+                                        <connections>
+                                            <action selector="sizeButtonAction:" target="-2" id="YLf-6h-yeV"/>
+                                        </connections>
                                     </button>
                                     <button tag="2" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="hWH-Ju-iVA">
                                         <rect key="frame" x="14" y="397" width="61" height="18"/>
@@ -302,6 +311,9 @@ Gw
                                             <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
                                             <font key="font" metaFont="system"/>
                                         </buttonCell>
+                                        <connections>
+                                            <action selector="sizeButtonAction:" target="-2" id="TnE-QB-kJy"/>
+                                        </connections>
                                     </button>
                                     <button tag="4" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="PyK-Bm-Rx8">
                                         <rect key="frame" x="14" y="343" width="61" height="18"/>
@@ -309,6 +321,9 @@ Gw
                                             <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
                                             <font key="font" metaFont="system"/>
                                         </buttonCell>
+                                        <connections>
+                                            <action selector="sizeButtonAction:" target="-2" id="fKI-u0-OXu"/>
+                                        </connections>
                                     </button>
                                     <button tag="5" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="jFg-oQ-HUB">
                                         <rect key="frame" x="14" y="316" width="61" height="18"/>
@@ -316,6 +331,9 @@ Gw
                                             <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
                                             <font key="font" metaFont="system"/>
                                         </buttonCell>
+                                        <connections>
+                                            <action selector="sizeButtonAction:" target="-2" id="CkR-4f-Lia"/>
+                                        </connections>
                                     </button>
                                     <textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="LOP-cY-2ku">
                                         <rect key="frame" x="36" y="292" width="60" height="22"/>

+ 7 - 1
PDF Office/PDF Master/Class/PDFWindowController/Toolbar/KMToolbarViewController.swift

@@ -1286,7 +1286,7 @@ extension KMToolbarViewController {
             item?.titleName = NSLocalizedString("To Image", comment: "")
             item?.boxImagePosition = .imageExpandLeft
             item?.needExpandAction = true
-            item?.btnAction = #selector(conversionMenuItemAction)
+            item?.btnAction = #selector(convertToImage)
             
             let menuItem = NSMenuItem.init(title: "To Image", action: #selector(conversionMenuItemAction), target: self)
             let subMenu = NSMenu()
@@ -1339,6 +1339,12 @@ extension KMToolbarViewController {
                     
     }
     
+    @objc func convertToImage(_ sender: KMToolbarItem) {
+//        if let subMenu = sender.menuFormRepresentation?.submenu {
+//            subMenu.popUp(positioning: nil, at: sender.frame.origin, in: sender.superview)
+//        }
+    }
+    
     private func _setupFillSignItem(_ item: KMToolbarItemView?) {
         let identifier = item?.itemIdentifier
         if identifier == KMToolbarToolHookItemIdentifier {

+ 86 - 37
PDF Office/PDF Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift

@@ -1875,9 +1875,34 @@ extension KMMainViewController {
         } else {
             url = self.listView.document.documentURL
         }
+        self.showConvertWindow(convertT: convertT)
         
-        var convertWC = KMConvertWindowController(documemtV: self.document!, currentPage: self.listView.currentPage(), convertT: convertT) {
-            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.25) {
+//        let model = KMDocumentModel(url: url!)
+//        if (self.listView.document.password != nil) {
+//            let _ = model.unlock(self.listView.document.password)
+//        }
+//        model.currentIndex = self.listView.currentPageIndex
+//        windowController?.documentModel = model
+//        
+//        windowController?.itemClick = { [weak self] index in
+//            if (identifier != nil) {
+//                self?.toolbarController.cancelSelected(identifier!)
+//            }
+//            
+//            if (self?.currentWindowController == nil) {
+//                return
+//            }
+//            self?.view.window?.endSheet(self!.currentWindowController.window!)
+//            self?.currentWindowController = nil
+//        }
+//        
+//        self.view.window?.beginSheet((windowController?.window)!)
+//        self.currentWindowController = windowController
+    }
+    
+    func showConvertWindow(convertT: KMConvertType) {
+        let convertWC = KMConvertWindowController(documemtV: self.document!, currentPage: self.listView.currentPage(), convertT: convertT) {
+            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.25) { [self] in
                 var type: KMConvertWithPDFType = .WordAdvance
                 switch convertT {
                 case .Word:
@@ -1915,22 +1940,36 @@ extension KMMainViewController {
                 default:
                     break
                 }
-                let document = self.document
+//                let document = self.document
                 let batchWindowController = KMBatchOperateWindowController.sharedWindowController
                 
                 var needShowHint = false
-//                if KMConvertOperationQueue.sharedQueue().operations.count > 0 {
-//                    needShowHint = true
-//                } else {
-//                    if !(KMBatchOperateManager.defaultManager().files.value(forKey: "filePath") as? [String])?.contains(document.documentURL.path) {
-//                        let file = KMBatchOperateFile(filePath: document.documentURL.path, type: .Convert)
-//                        file.password = document.password
-//                        KMBatchOperateManager.defaultManager().files.append(file)
-//                    }
-//                    batchWindowController.switch(to: .Convert, files: KMBatchOperateManager.defaultManager().files)
-//                    batchWindowController.switch(to: type)
-//                }
-//                
+                if KMConvertOperationQueue.sharedQueue.operations.count > 0 {
+                    needShowHint = true
+                } else {
+                    var needContinue = false
+                    if KMBatchOperateManager.defaultManager.files?.count ?? 0 > 0 {
+                        let arr: [String] = converFilesToPath(files: KMBatchOperateManager.defaultManager.files!)
+                        let ss = self.document?.documentURL.path
+                        if arr.contains(ss!) {
+                            needContinue = false
+                        }else {
+                            needContinue = true
+                        }
+                    }else {
+                        needContinue = true
+                    }
+                    
+                    if needContinue {
+                        let ss = self.document?.documentURL.path
+                        let file = KMBatchOperateFile(filePath: ss!, type: .Convert)
+                        file.password = document?.password ?? ""
+                        KMBatchOperateManager.defaultManager.files?.append(file)
+                    }
+                    batchWindowController.switchToOperateType(.Convert, files: KMBatchOperateManager.defaultManager.files!)
+                    batchWindowController.switchToConvertType(convertType: type)
+                }
+
                 batchWindowController.window?.makeKeyAndOrderFront(nil)
                 if needShowHint {
                     batchWindowController.showIsConvertingHint()
@@ -1940,28 +1979,14 @@ extension KMMainViewController {
             }
         }
         self.km_beginSheet(windowC: convertWC)
-        
-//        let model = KMDocumentModel(url: url!)
-//        if (self.listView.document.password != nil) {
-//            let _ = model.unlock(self.listView.document.password)
-//        }
-//        model.currentIndex = self.listView.currentPageIndex
-//        windowController?.documentModel = model
-//        
-//        windowController?.itemClick = { [weak self] index in
-//            if (identifier != nil) {
-//                self?.toolbarController.cancelSelected(identifier!)
-//            }
-//            
-//            if (self?.currentWindowController == nil) {
-//                return
-//            }
-//            self?.view.window?.endSheet(self!.currentWindowController.window!)
-//            self?.currentWindowController = nil
-//        }
-//        
-//        self.view.window?.beginSheet((windowController?.window)!)
-//        self.currentWindowController = windowController
+    }
+    
+    func converFilesToPath(files: Array<KMBatchOperateFile>) -> [String] {
+        let newArr = NSMutableArray()
+        for item in files {
+            newArr.add(item.filePath)
+        }
+        return newArr as! [String]
     }
     
     internal func showPrintWindow(pageRange: KMPrintPageRange = KMPrintPageRange(type: .allPage, selectPages: [])) {
@@ -3052,6 +3077,7 @@ extension KMMainViewController : KMMainToolbarControllerDelegate {
             KMPrint("KMToolbarToolFormAlignIdentifier \(index)")
         } else if (toolbarItem.itemIdentifier == KMToolbarConversionImageItemIdentifier) {
             KMPrint("KMToolbarConversionImageItemIdentifier \(index)")
+            convertToImg(index: index)
         } else if (toolbarItem.itemIdentifier == KMToolbarConversionExportImageItemIdentifier) {
             KMPrint("KMToolbarConversionExportImageItemIdentifier \(index)")
         } else if (toolbarItem.itemIdentifier == KMToolbarConversionCreatePDFItemIdentifier) {
@@ -3064,6 +3090,29 @@ extension KMMainViewController : KMMainToolbarControllerDelegate {
         }
     }
     
+    func convertToImg(index: Int) {
+        var convertT: KMConvertType = .JPEG
+        switch index {
+        case 7:
+            convertT = .JPEG
+        case 8:
+            convertT = .JPG
+        case 9:
+            convertT = .PNG
+        case 10:
+            convertT = .GIF
+        case 11:
+            convertT = .TIFF
+        case 12:
+            convertT = .TGA
+        case 13:
+            convertT = .BMP
+        default:
+            convertT = .JPEG
+        }
+        showConvertWindow(convertT: convertT)
+    }
+    
     func toolbarViewController(_ viewController: KMToolbarViewController, searchAction searchString: String) {
         Swift.debugPrint("Search Result " + searchString)
     }