Browse Source

总结-合并功能开发

tangchao 2 năm trước cách đây
mục cha
commit
3943d71501
28 tập tin đã thay đổi với 2711 bổ sung188 xóa
  1. 94 0
      PDF Office/PDF Office.xcodeproj/project.pbxproj
  2. BIN
      PDF Office/PDF Office.xcodeproj/project.xcworkspace/xcuserdata/kdanmobile.xcuserdatad/UserInterfaceState.xcuserstate
  3. 187 186
      PDF Office/PDF Office/Class/Home/ViewController/KMHomeViewController+Action.swift
  4. 16 0
      PDF Office/PDF Office/Class/Merge/OCPart/KMBatchTableRowView.h
  5. 39 0
      PDF Office/PDF Office/Class/Merge/OCPart/KMBatchTableRowView.m
  6. 30 0
      PDF Office/PDF Office/Class/Merge/OCPart/KMBlankView.h
  7. 64 0
      PDF Office/PDF Office/Class/Merge/OCPart/KMBlankView.m
  8. 36 0
      PDF Office/PDF Office/Class/Merge/OCPart/KMFileAttribute.h
  9. 198 0
      PDF Office/PDF Office/Class/Merge/OCPart/KMFileAttribute.m
  10. 20 0
      PDF Office/PDF Office/Class/Merge/OCPart/KMPDFEditAppendCustomView.h
  11. 75 0
      PDF Office/PDF Office/Class/Merge/OCPart/KMPDFEditAppendCustomView.m
  12. 32 0
      PDF Office/PDF Office/Class/Merge/OCPart/KMPDFEditAppendWindow.h
  13. 1143 0
      PDF Office/PDF Office/Class/Merge/OCPart/KMPDFEditAppendWindow.m
  14. 553 0
      PDF Office/PDF Office/Class/Merge/OCPart/KMPDFEditAppendWindow.xib
  15. 16 0
      PDF Office/PDF Office/Class/Merge/OCPart/KMSavePanelAccessoryController.h
  16. 46 0
      PDF Office/PDF Office/Class/Merge/OCPart/KMSavePanelAccessoryController.m
  17. 40 0
      PDF Office/PDF Office/Class/Merge/OCPart/KMSavePanelAccessoryController.xib
  18. 16 0
      PDF Office/PDF Office/Class/Merge/OCPart/KMTableRowView.h
  19. 44 0
      PDF Office/PDF Office/Class/Merge/OCPart/KMTableRowView.m
  20. 2 0
      PDF Office/PDF Office/Class/PDFTools/Convert/Controller/KMConvertBaseWindowController.swift
  21. 19 2
      PDF Office/PDF Office/Class/PDFTools/Convert/Controller/KMConvertPPTsWindowController.swift
  22. 2 0
      PDF Office/PDF Office/Class/PDFWindowController/Toolbar/KMToolbarController.swift
  23. 18 0
      PDF Office/PDF Office/Class/PDFWindowController/Toolbar/KMToolbarViewController.swift
  24. 1 0
      PDF Office/PDF Office/Class/PDFWindowController/Toolbar/PublicKey.swift
  25. 17 0
      PDF Office/PDF Office/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift
  26. 1 0
      PDF Office/PDF Office/PDF Office DMG-Bridging-Header.h
  27. 1 0
      PDF Office/PDF Office/PDF Office Pro-Bridging-Header.h
  28. 1 0
      PDF Office/PDF Office/PDF Office-Bridging-Header.h

+ 94 - 0
PDF Office/PDF Office.xcodeproj/project.pbxproj

@@ -1561,6 +1561,33 @@
 		BBA8B7B3293635D80097D183 /* KMPasswordInputWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBA8B7B2293635D80097D183 /* KMPasswordInputWindow.xib */; };
 		BBA8B7B4293635D80097D183 /* KMPasswordInputWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBA8B7B2293635D80097D183 /* KMPasswordInputWindow.xib */; };
 		BBA8B7B5293635D80097D183 /* KMPasswordInputWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBA8B7B2293635D80097D183 /* KMPasswordInputWindow.xib */; };
+		BBAFC83C2985194800D0648E /* KMPDFEditAppendWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = BBAFC8392985194800D0648E /* KMPDFEditAppendWindow.m */; };
+		BBAFC83D2985194800D0648E /* KMPDFEditAppendWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = BBAFC8392985194800D0648E /* KMPDFEditAppendWindow.m */; };
+		BBAFC83E2985194800D0648E /* KMPDFEditAppendWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = BBAFC8392985194800D0648E /* KMPDFEditAppendWindow.m */; };
+		BBAFC83F2985194800D0648E /* KMPDFEditAppendWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBAFC83B2985194800D0648E /* KMPDFEditAppendWindow.xib */; };
+		BBAFC8402985194800D0648E /* KMPDFEditAppendWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBAFC83B2985194800D0648E /* KMPDFEditAppendWindow.xib */; };
+		BBAFC8412985194800D0648E /* KMPDFEditAppendWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBAFC83B2985194800D0648E /* KMPDFEditAppendWindow.xib */; };
+		BBAFC844298519A500D0648E /* KMFileAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = BBAFC842298519A400D0648E /* KMFileAttribute.m */; };
+		BBAFC845298519A500D0648E /* KMFileAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = BBAFC842298519A400D0648E /* KMFileAttribute.m */; };
+		BBAFC846298519A500D0648E /* KMFileAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = BBAFC842298519A400D0648E /* KMFileAttribute.m */; };
+		BBAFC84A298519F700D0648E /* KMSavePanelAccessoryController.m in Sources */ = {isa = PBXBuildFile; fileRef = BBAFC847298519F600D0648E /* KMSavePanelAccessoryController.m */; };
+		BBAFC84B298519F700D0648E /* KMSavePanelAccessoryController.m in Sources */ = {isa = PBXBuildFile; fileRef = BBAFC847298519F600D0648E /* KMSavePanelAccessoryController.m */; };
+		BBAFC84C298519F700D0648E /* KMSavePanelAccessoryController.m in Sources */ = {isa = PBXBuildFile; fileRef = BBAFC847298519F600D0648E /* KMSavePanelAccessoryController.m */; };
+		BBAFC84D298519F700D0648E /* KMSavePanelAccessoryController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBAFC849298519F600D0648E /* KMSavePanelAccessoryController.xib */; };
+		BBAFC84E298519F700D0648E /* KMSavePanelAccessoryController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBAFC849298519F600D0648E /* KMSavePanelAccessoryController.xib */; };
+		BBAFC84F298519F700D0648E /* KMSavePanelAccessoryController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBAFC849298519F600D0648E /* KMSavePanelAccessoryController.xib */; };
+		BBAFC85229851A9800D0648E /* KMBatchTableRowView.m in Sources */ = {isa = PBXBuildFile; fileRef = BBAFC85129851A9800D0648E /* KMBatchTableRowView.m */; };
+		BBAFC85329851A9800D0648E /* KMBatchTableRowView.m in Sources */ = {isa = PBXBuildFile; fileRef = BBAFC85129851A9800D0648E /* KMBatchTableRowView.m */; };
+		BBAFC85429851A9800D0648E /* KMBatchTableRowView.m in Sources */ = {isa = PBXBuildFile; fileRef = BBAFC85129851A9800D0648E /* KMBatchTableRowView.m */; };
+		BBAFC85829851AF200D0648E /* KMBlankView.m in Sources */ = {isa = PBXBuildFile; fileRef = BBAFC85529851AF200D0648E /* KMBlankView.m */; };
+		BBAFC85929851AF200D0648E /* KMBlankView.m in Sources */ = {isa = PBXBuildFile; fileRef = BBAFC85529851AF200D0648E /* KMBlankView.m */; };
+		BBAFC85A29851AF200D0648E /* KMBlankView.m in Sources */ = {isa = PBXBuildFile; fileRef = BBAFC85529851AF200D0648E /* KMBlankView.m */; };
+		BBAFC85B29851AF200D0648E /* KMTableRowView.m in Sources */ = {isa = PBXBuildFile; fileRef = BBAFC85629851AF200D0648E /* KMTableRowView.m */; };
+		BBAFC85C29851AF200D0648E /* KMTableRowView.m in Sources */ = {isa = PBXBuildFile; fileRef = BBAFC85629851AF200D0648E /* KMTableRowView.m */; };
+		BBAFC85D29851AF200D0648E /* KMTableRowView.m in Sources */ = {isa = PBXBuildFile; fileRef = BBAFC85629851AF200D0648E /* KMTableRowView.m */; };
+		BBAFC86029851B2D00D0648E /* KMPDFEditAppendCustomView.m in Sources */ = {isa = PBXBuildFile; fileRef = BBAFC85F29851B2D00D0648E /* KMPDFEditAppendCustomView.m */; };
+		BBAFC86129851B2D00D0648E /* KMPDFEditAppendCustomView.m in Sources */ = {isa = PBXBuildFile; fileRef = BBAFC85F29851B2D00D0648E /* KMPDFEditAppendCustomView.m */; };
+		BBAFC86229851B2D00D0648E /* KMPDFEditAppendCustomView.m in Sources */ = {isa = PBXBuildFile; fileRef = BBAFC85F29851B2D00D0648E /* KMPDFEditAppendCustomView.m */; };
 		BBB14A532978DD5400936EDB /* KMRedactTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB14A522978DD5400936EDB /* KMRedactTools.swift */; };
 		BBB14A542978DD5400936EDB /* KMRedactTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB14A522978DD5400936EDB /* KMRedactTools.swift */; };
 		BBB14A552978DD5400936EDB /* KMRedactTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB14A522978DD5400936EDB /* KMRedactTools.swift */; };
@@ -2665,6 +2692,22 @@
 		BBA8B7A92935DC120097D183 /* KMRemovePasswordResultTipView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMRemovePasswordResultTipView.swift; sourceTree = "<group>"; };
 		BBA8B7AE293600D70097D183 /* KMPasswordInputWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPasswordInputWindow.swift; sourceTree = "<group>"; };
 		BBA8B7B2293635D80097D183 /* KMPasswordInputWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMPasswordInputWindow.xib; sourceTree = "<group>"; };
+		BBAFC8392985194800D0648E /* KMPDFEditAppendWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KMPDFEditAppendWindow.m; sourceTree = "<group>"; };
+		BBAFC83A2985194800D0648E /* KMPDFEditAppendWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMPDFEditAppendWindow.h; sourceTree = "<group>"; };
+		BBAFC83B2985194800D0648E /* KMPDFEditAppendWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMPDFEditAppendWindow.xib; sourceTree = "<group>"; };
+		BBAFC842298519A400D0648E /* KMFileAttribute.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KMFileAttribute.m; sourceTree = "<group>"; };
+		BBAFC843298519A400D0648E /* KMFileAttribute.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMFileAttribute.h; sourceTree = "<group>"; };
+		BBAFC847298519F600D0648E /* KMSavePanelAccessoryController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KMSavePanelAccessoryController.m; sourceTree = "<group>"; };
+		BBAFC848298519F600D0648E /* KMSavePanelAccessoryController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMSavePanelAccessoryController.h; sourceTree = "<group>"; };
+		BBAFC849298519F600D0648E /* KMSavePanelAccessoryController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMSavePanelAccessoryController.xib; sourceTree = "<group>"; };
+		BBAFC85029851A9700D0648E /* KMBatchTableRowView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMBatchTableRowView.h; sourceTree = "<group>"; };
+		BBAFC85129851A9800D0648E /* KMBatchTableRowView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KMBatchTableRowView.m; sourceTree = "<group>"; };
+		BBAFC85529851AF200D0648E /* KMBlankView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KMBlankView.m; sourceTree = "<group>"; };
+		BBAFC85629851AF200D0648E /* KMTableRowView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KMTableRowView.m; sourceTree = "<group>"; };
+		BBAFC85729851AF200D0648E /* KMTableRowView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMTableRowView.h; sourceTree = "<group>"; };
+		BBAFC85E29851B2D00D0648E /* KMPDFEditAppendCustomView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMPDFEditAppendCustomView.h; sourceTree = "<group>"; };
+		BBAFC85F29851B2D00D0648E /* KMPDFEditAppendCustomView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KMPDFEditAppendCustomView.m; sourceTree = "<group>"; };
+		BBAFC86329851B5900D0648E /* KMBlankView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMBlankView.h; sourceTree = "<group>"; };
 		BBB14A522978DD5400936EDB /* KMRedactTools.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMRedactTools.swift; sourceTree = "<group>"; };
 		BBB14A562978E75D00936EDB /* KMRedactMutilPageFlagWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMRedactMutilPageFlagWindowController.swift; sourceTree = "<group>"; };
 		BBB14A5A2978EBBE00936EDB /* KMRedactMutilPageFlagContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMRedactMutilPageFlagContentView.swift; sourceTree = "<group>"; };
@@ -4835,6 +4878,7 @@
 		BB99ACBA292DDFEC0048AFD9 /* Merge */ = {
 			isa = PBXGroup;
 			children = (
+				BBAFC8382985191200D0648E /* OCPart */,
 				BB6B4C06292F53AD0071CA06 /* Model */,
 				BB99ACC8292DEE450048AFD9 /* View */,
 				BB99ACBB292DE04F0048AFD9 /* Controller */,
@@ -4879,6 +4923,29 @@
 			path = Window;
 			sourceTree = "<group>";
 		};
+		BBAFC8382985191200D0648E /* OCPart */ = {
+			isa = PBXGroup;
+			children = (
+				BBAFC85029851A9700D0648E /* KMBatchTableRowView.h */,
+				BBAFC85129851A9800D0648E /* KMBatchTableRowView.m */,
+				BBAFC86329851B5900D0648E /* KMBlankView.h */,
+				BBAFC85529851AF200D0648E /* KMBlankView.m */,
+				BBAFC843298519A400D0648E /* KMFileAttribute.h */,
+				BBAFC842298519A400D0648E /* KMFileAttribute.m */,
+				BBAFC85E29851B2D00D0648E /* KMPDFEditAppendCustomView.h */,
+				BBAFC85F29851B2D00D0648E /* KMPDFEditAppendCustomView.m */,
+				BBAFC83A2985194800D0648E /* KMPDFEditAppendWindow.h */,
+				BBAFC8392985194800D0648E /* KMPDFEditAppendWindow.m */,
+				BBAFC83B2985194800D0648E /* KMPDFEditAppendWindow.xib */,
+				BBAFC848298519F600D0648E /* KMSavePanelAccessoryController.h */,
+				BBAFC847298519F600D0648E /* KMSavePanelAccessoryController.m */,
+				BBAFC849298519F600D0648E /* KMSavePanelAccessoryController.xib */,
+				BBAFC85729851AF200D0648E /* KMTableRowView.h */,
+				BBAFC85629851AF200D0648E /* KMTableRowView.m */,
+			);
+			path = OCPart;
+			sourceTree = "<group>";
+		};
 		BBB14A512978DD4200936EDB /* Tools */ = {
 			isa = PBXGroup;
 			children = (
@@ -5658,6 +5725,7 @@
 				BBEC00C2295C306400A26C98 /* KMBatesPropertyController.xib in Resources */,
 				BBD1F77F296F9BE000343885 /* KMPageEditSettingBaseWindowController.xib in Resources */,
 				BB24D4AA2977BE6700041659 /* KMRedactConfirmWindowController.xib in Resources */,
+				BBAFC84D298519F700D0648E /* KMSavePanelAccessoryController.xib in Resources */,
 				F3A9DC81294309D80074E5D2 /* CPDFListEditAnnotationViewController.xib in Resources */,
 				89E4E7852967BF5A002DBA6F /* KMCustomizeStampViewController.xib in Resources */,
 				F359917B292B7B8A000D25DE /* InitialUserDefaults.plist in Resources */,
@@ -5672,6 +5740,7 @@
 				9F8539FF2947137500DF644E /* throbber.png in Resources */,
 				9F1F82CD292F6CF90092C4B4 /* KMPDFInsertPageWindow.xib in Resources */,
 				8997011928F40898009AF911 /* KMThumbnailViewController.xib in Resources */,
+				BBAFC83F2985194800D0648E /* KMPDFEditAppendWindow.xib in Resources */,
 				9FA607E128FD4C9F00B46586 /* KMHomePopViewController.xib in Resources */,
 				9F0CB4B82977BC1000007028 /* KMPropertiesPanelPreviewSubVC.xib in Resources */,
 				89D2D2B92947316900BFF5FE /* Quick Start Guide_Widget.pdf in Resources */,
@@ -5852,8 +5921,10 @@
 				F3A9DC82294309D80074E5D2 /* CPDFListEditAnnotationViewController.xib in Resources */,
 				8942F7F42926087200389627 /* KMSearchViewController.xib in Resources */,
 				9FAAA336290BD0A20046FFCE /* KMHistoryFileCollectionViewItem.xib in Resources */,
+				BBAFC8402985194800D0648E /* KMPDFEditAppendWindow.xib in Resources */,
 				F3B7DF9E2948565000333201 /* CPDFListHoverAnnotationViewController.xib in Resources */,
 				BBC3481029558DC1008D2CD1 /* KMBackgroundController.xib in Resources */,
+				BBAFC84E298519F700D0648E /* KMSavePanelAccessoryController.xib in Resources */,
 				AD9527B329503D620039D2BC /* Untitled.pdf in Resources */,
 				BB5DF1ED2959C5CB0025CDA1 /* KMHeaderFooterPreviewController.xib in Resources */,
 				ADB1FE622975189600ED072D /* KMBatchProcessingDeleteTableCell.xib in Resources */,
@@ -6090,6 +6161,7 @@
 				BB4EEF3229763EE7003A3537 /* KMRedactBaseWindowController.xib in Resources */,
 				9F853A0A2947137500DF644E /* newtab.pdf in Resources */,
 				8997011328F40842009AF911 /* KMOutlineViewController.xib in Resources */,
+				BBAFC8412985194800D0648E /* KMPDFEditAppendWindow.xib in Resources */,
 				ADB1FE8429752F3200ED072D /* KMBatchSecurityView.xib in Resources */,
 				9FBA0EE628FEC253001117AF /* KMProductPromotionViewController.xib in Resources */,
 				89E9B3FB295BE2EC00AEFA61 /* KMEditPDFTextPropertyViewController.xib in Resources */,
@@ -6121,6 +6193,7 @@
 				8997013028F42F15009AF911 /* Biochemistry.pdf in Resources */,
 				9F8539DC294318D600DF644E /* TabsImage.xcassets in Resources */,
 				BBC745EF295F067B0072C2ED /* KMCropSettingWindowController.xib in Resources */,
+				BBAFC84F298519F700D0648E /* KMSavePanelAccessoryController.xib in Resources */,
 				BBEC00C4295C306400A26C98 /* KMBatesPropertyController.xib in Resources */,
 				9F8539D029430BF300DF644E /* KMBrowserWindowController.xib in Resources */,
 				BBFE6E622930809A00142C01 /* KMMergeCollectionPageViewItem.xib in Resources */,
@@ -6319,6 +6392,7 @@
 				9FAAA332290BD0A20046FFCE /* KMHistoryFileCollectionViewItem.swift in Sources */,
 				ADD1B6AB2941E97F00C3FFF7 /* KMPrintWindowController.swift in Sources */,
 				BB8F454F295A9FA50037EA22 /* KMCreateHeaderFooterController.swift in Sources */,
+				BBAFC84A298519F700D0648E /* KMSavePanelAccessoryController.m in Sources */,
 				BBC745F2295F0DD00072C2ED /* KMCropSettingPageSizeView.swift in Sources */,
 				ADCB98E12924776F00B51A03 /* KMBatchProcessingSizeTableCell.swift in Sources */,
 				F3599222292CA27B000D25DE /* CPDFListViewRuntime.m in Sources */,
@@ -6370,6 +6444,7 @@
 				9F1FE4B129406E4700E952CA /* CTTabWindowController.m in Sources */,
 				F37322F9292DF9410013862C /* CPDFRedactAnnotation+PDFListView.m in Sources */,
 				8942F80E29277BAF00389627 /* NSMenu+Category.m in Sources */,
+				BBAFC844298519A500D0648E /* KMFileAttribute.m in Sources */,
 				9F1FE4BD29406E4700E952CA /* URLDropTarget.m in Sources */,
 				8942F80329262B2E00389627 /* KMSideViewController.swift in Sources */,
 				899700FE28F40710009AF911 /* KMBookMarkViewController.swift in Sources */,
@@ -6382,6 +6457,7 @@
 				9FDD0F802952FC36000C4DAD /* KMComponentLibraryTool.swift in Sources */,
 				BBFE6E582930724B00142C01 /* KMMergePageModel.swift in Sources */,
 				BB897229294B08720045787C /* KMWatermarkAdjectiveTopBarItemModel.swift in Sources */,
+				BBAFC85B29851AF200D0648E /* KMTableRowView.m in Sources */,
 				F34BF92129530320002C25A2 /* NSString+PDFListView.m in Sources */,
 				89E4E7222963FB23002DBA6F /* KMGeneralButton.m in Sources */,
 				BB49ECF1293F40F500C82CA2 /* KMConvertPageRangeSettingItemView.swift in Sources */,
@@ -6445,6 +6521,7 @@
 				9F1FE4AE29406E4700E952CA /* CTPresentationModeController.m in Sources */,
 				89E4E746296418ED002DBA6F /* TextFieldFormatter.m in Sources */,
 				89E4E7182963F5D4002DBA6F /* KMSelfSignAnnotation.m in Sources */,
+				BBAFC86029851B2D00D0648E /* KMPDFEditAppendCustomView.m in Sources */,
 				BBC3481C295593F0008D2CD1 /* KMBackgroundListController.swift in Sources */,
 				9F1F82DA292F84D60092C4B4 /* KMHomeInsertActionViewController.swift in Sources */,
 				ADD1B6E82946C02600C3FFF7 /* KMPrintChoosePageSizeMultipageView.swift in Sources */,
@@ -6507,6 +6584,7 @@
 				BB86C1FD28F54923005AD968 /* NSEvent_SKExtensions.m in Sources */,
 				9F0CB4A7296CF19600007028 /* KMPropertiesPanelListMenuSubVC.swift in Sources */,
 				BB49ED21293F527700C82CA2 /* KMConvertExcelSettingView.swift in Sources */,
+				BBAFC85829851AF200D0648E /* KMBlankView.m in Sources */,
 				8942F80929275CBC00389627 /* KMOCToolClass.m in Sources */,
 				BB8F4569295ABDC10037EA22 /* KMWatermarkAdjectiveBaseModel.swift in Sources */,
 				9F0CB4B52977BC1000007028 /* KMPropertiesPanelPreviewSubVC.swift in Sources */,
@@ -6581,6 +6659,7 @@
 				89D2D2C5294972B900BFF5FE /* KMFormCellView.swift in Sources */,
 				BB897224294B07960045787C /* KMWatermarkAdjectiveTopBarItemView.swift in Sources */,
 				9F1F82BC292E01860092C4B4 /* KMCloudEmptyCollectionViewItem.swift in Sources */,
+				BBAFC85229851A9800D0648E /* KMBatchTableRowView.m in Sources */,
 				ADB1FE4329700DAD00ED072D /* KMBatchCollectionViewModel.swift in Sources */,
 				F34BF93F29530D02002C25A2 /* NSBezierPath+PDFListView.m in Sources */,
 				AD9527EA2955520C0039D2BC /* KMBaseTextFieldModel.swift in Sources */,
@@ -6604,6 +6683,7 @@
 				9F1FE4F629406E4700E952CA /* CTFloatingBarBackingView.m in Sources */,
 				BB897256294C559F0045787C /* KMWatermarkPropertyCreateController.swift in Sources */,
 				BBB14A532978DD5400936EDB /* KMRedactTools.swift in Sources */,
+				BBAFC83C2985194800D0648E /* KMPDFEditAppendWindow.m in Sources */,
 				89E4E6F52963D1E9002DBA6F /* KMAnnotationPropertiesColorManager.m in Sources */,
 				9FDD0F8C2952FCE0000C4DAD /* KMGlobalParser.swift in Sources */,
 				BB897251294C3F660045787C /* KMMenuTableView.swift in Sources */,
@@ -6807,6 +6887,7 @@
 				9FDD0FAF29534FDC000C4DAD /* KMCompLight.swift in Sources */,
 				89D9897528FE743E003A3E87 /* KMOutlineView.swift in Sources */,
 				BB8F4550295A9FA50037EA22 /* KMCreateHeaderFooterController.swift in Sources */,
+				BBAFC84B298519F700D0648E /* KMSavePanelAccessoryController.m in Sources */,
 				BBC745F3295F0DD00072C2ED /* KMCropSettingPageSizeView.swift in Sources */,
 				9F8DDF2E2924B855006CDC73 /* KMPDFToolsViewController.swift in Sources */,
 				F34BF92229530320002C25A2 /* NSString+PDFListView.m in Sources */,
@@ -6858,6 +6939,7 @@
 				F3A9DC7F294309D80074E5D2 /* CPDFListEditAnnotationViewController.m in Sources */,
 				AD9527CB295297B70039D2BC /* KMPrintModel.swift in Sources */,
 				9F1FE4B829406E4700E952CA /* CTBrowserFrameView.m in Sources */,
+				BBAFC845298519A500D0648E /* KMFileAttribute.m in Sources */,
 				89D9897928FE895A003A3E87 /* KMOutlineCellView.swift in Sources */,
 				9F1FE4D629406E4700E952CA /* NSPasteboard+Utils.m in Sources */,
 				9F1FE4B229406E4700E952CA /* CTTabWindowController.m in Sources */,
@@ -6870,6 +6952,7 @@
 				BB86C1F328F54535005AD968 /* CPDFListView+KeyEvent.m in Sources */,
 				BB897247294C19980045787C /* KMWatermarkAdjectiveListController.swift in Sources */,
 				9F1FE4A929406E4700E952CA /* CTBrowserWindowController.m in Sources */,
+				BBAFC85C29851AF200D0648E /* KMTableRowView.m in Sources */,
 				AD9527DC2952EE700039D2BC /* KMPrintPage_C.swift in Sources */,
 				89E4E7232963FB23002DBA6F /* KMGeneralButton.m in Sources */,
 				BB246DA528F6B492005E8F52 /* NSBezierPath_SKExtensions.m in Sources */,
@@ -6933,6 +7016,7 @@
 				9FAAA33A290F72CC0046FFCE /* KMHistoryFileCollectionView.swift in Sources */,
 				89E4E747296418ED002DBA6F /* TextFieldFormatter.m in Sources */,
 				89E4E7192963F5D4002DBA6F /* KMSelfSignAnnotation.m in Sources */,
+				BBAFC86129851B2D00D0648E /* KMPDFEditAppendCustomView.m in Sources */,
 				BBC3481D295593F0008D2CD1 /* KMBackgroundListController.swift in Sources */,
 				89D2D2FC294C806000BFF5FE /* KMPDFThumbnailItem.swift in Sources */,
 				F3732300292DF9410013862C /* CPDFAnnotation+PDFListView.m in Sources */,
@@ -6995,6 +7079,7 @@
 				ADD1B6C82942E83000C3FFF7 /* KMPrintBottomView.swift in Sources */,
 				9F0CB4A8296CF19600007028 /* KMPropertiesPanelListMenuSubVC.swift in Sources */,
 				ADD1B7032946C8AD00C3FFF7 /* KMBaseTextField.swift in Sources */,
+				BBAFC85929851AF200D0648E /* KMBlankView.m in Sources */,
 				8942F818292B678100389627 /* KMAnnotationTableCellView.swift in Sources */,
 				BB8F456A295ABDC10037EA22 /* KMWatermarkAdjectiveBaseModel.swift in Sources */,
 				9F0CB4B62977BC1000007028 /* KMPropertiesPanelPreviewSubVC.swift in Sources */,
@@ -7069,6 +7154,7 @@
 				9F1FE50329406E4700E952CA /* CTTabStripModelOrderController.m in Sources */,
 				F34BF93629530708002C25A2 /* NSImage+PDFListView.m in Sources */,
 				BB49ECFF293F459500C82CA2 /* KMConvertPPTsWindowController.swift in Sources */,
+				BBAFC85329851A9800D0648E /* KMBatchTableRowView.m in Sources */,
 				ADB1FE4429700DAD00ED072D /* KMBatchCollectionViewModel.swift in Sources */,
 				9F1F82EB2935D02E0092C4B4 /* KMComboBox.swift in Sources */,
 				AD9527EB2955520C0039D2BC /* KMBaseTextFieldModel.swift in Sources */,
@@ -7092,6 +7178,7 @@
 				AD9527C3295294EF0039D2BC /* KMPrintPaperModel.swift in Sources */,
 				9F1FE4DC29406E4700E952CA /* NSURL+Utils.m in Sources */,
 				BBB14A542978DD5400936EDB /* KMRedactTools.swift in Sources */,
+				BBAFC83D2985194800D0648E /* KMPDFEditAppendWindow.m in Sources */,
 				89E4E6F62963D1E9002DBA6F /* KMAnnotationPropertiesColorManager.m in Sources */,
 				F359916A29261F0E000D25DE /* CPDFListView+Tool.m in Sources */,
 				9F1FE4F729406E4700E952CA /* CTFloatingBarBackingView.m in Sources */,
@@ -7206,8 +7293,10 @@
 				F3732316292DF9410013862C /* CPDFTextAnnotation+PDFListView.m in Sources */,
 				F37322EC292DF9410013862C /* CPDFStampAnnotation+PDFListView.m in Sources */,
 				BB8F4562295AA39F0037EA22 /* KMHeaderFooterModel.swift in Sources */,
+				BBAFC85429851A9800D0648E /* KMBatchTableRowView.m in Sources */,
 				BB89723C294B3C840045787C /* KMWatermarkPropertyController.swift in Sources */,
 				9FBA0F0029015A82001117AF /* KMFastToolCollectionViewItem.swift in Sources */,
+				BBAFC85A29851AF200D0648E /* KMBlankView.m in Sources */,
 				BB1EC8002967B26700EC0BC3 /* KMPDFEditViewController.swift in Sources */,
 				BB86C22028F561F8005AD968 /* SKRuntime.m in Sources */,
 				BB162E90294FFC0C0088E9D1 /* KMWatermarkPDFView.swift in Sources */,
@@ -7221,11 +7310,13 @@
 				BBFE6E5F2930809A00142C01 /* KMMergeCollectionPageViewItem.swift in Sources */,
 				ADBA0466292CB90B00BF9184 /* KMBatchProcessingTableRowView.swift in Sources */,
 				BB897243294C028A0045787C /* KMWatermarkAdjectiveSegementControl.swift in Sources */,
+				BBAFC84C298519F700D0648E /* KMSavePanelAccessoryController.m in Sources */,
 				9F1FE4B629406E4700E952CA /* CTBrowser.m in Sources */,
 				9FDD0FAC29534FCC000C4DAD /* KMAliasLight.swift in Sources */,
 				BBF38A64294F53FD0086D025 /* KMWatermarkFileView.swift in Sources */,
 				899700F828F4051B009AF911 /* KMAnnotationViewController.swift in Sources */,
 				ADB1FE4A2970264500ED072D /* KMBatchCollectionViewPrensenter.swift in Sources */,
+				BBAFC83E2985194800D0648E /* KMPDFEditAppendWindow.m in Sources */,
 				F36AD77929642FE80015AD53 /* CPDFListView+UndoManager.m in Sources */,
 				BBB14A5D2978EBBE00936EDB /* KMRedactMutilPageFlagContentView.swift in Sources */,
 				8942F7C12923670F00389627 /* KMBOTAManagerClass.swift in Sources */,
@@ -7372,6 +7463,7 @@
 				ADB1FE8029752F2900ED072D /* KMBatchSecurityView.swift in Sources */,
 				BBC3485029582920008D2CD1 /* KMBackgroundColorView.swift in Sources */,
 				ADB1FE982975300B00ED072D /* KMBatchHeaderAndFooterView.swift in Sources */,
+				BBAFC86229851B2D00D0648E /* KMPDFEditAppendCustomView.m in Sources */,
 				BB4EEF3A2976451E003A3537 /* KMRedactContentBaseView.swift in Sources */,
 				BBC3483029559E12008D2CD1 /* KMBackgroundModel.swift in Sources */,
 				F3732313292DF9410013862C /* CPDFSignatureWidgetAnnotation+PDFListView.m in Sources */,
@@ -7502,6 +7594,7 @@
 				ADB2D6E8294740F30029D2B3 /* KMPrintPaperSetWindowController.swift in Sources */,
 				89E4E7372964148E002DBA6F /* KMAnnotationPropertiesViewController.m in Sources */,
 				ADB1FE8829752F4C00ED072D /* KMBatchWatermarkView.swift in Sources */,
+				BBAFC846298519A500D0648E /* KMFileAttribute.m in Sources */,
 				F37322F8292DF9410013862C /* CSelfSignAnnotation.m in Sources */,
 				BB8F457C295AFB330037EA22 /* KMHeaderFooterFontInfoView.swift in Sources */,
 				BB8F4584295B0F900037EA22 /* KMHeaderFooterMarginInfoView.swift in Sources */,
@@ -7536,6 +7629,7 @@
 				AD9527D92952ED970039D2BC /* KMPrintPresenter_C.swift in Sources */,
 				BB1AF3F42938AD8B00EEC459 /* KMCustomAlertView.swift in Sources */,
 				BB2EDF6F296ECE17003BCF58 /* KMPageEditInsertDirectionItemView.swift in Sources */,
+				BBAFC85D29851AF200D0648E /* KMTableRowView.m in Sources */,
 				8942F80529262B2E00389627 /* KMSideViewController.swift in Sources */,
 				8942F819292B678100389627 /* KMAnnotationTableCellView.swift in Sources */,
 				BB162E99295062CD0088E9D1 /* KMPageRangeTools.swift in Sources */,

BIN
PDF Office/PDF Office.xcodeproj/project.xcworkspace/xcuserdata/kdanmobile.xcuserdatad/UserInterfaceState.xcuserstate


+ 187 - 186
PDF Office/PDF Office/Class/Home/ViewController/KMHomeViewController+Action.swift

@@ -386,192 +386,193 @@ extension KMHomeViewController {
     }
     
     func fastTool_ConvertPDF() {    // 转换PDF
-        let alert = NSAlert()
-        alert.messageText = NSLocalizedString("请选择类型", comment: "")
-        
-        let view = NSComboBox()
-        view.isEditable = false
-        view.frame = NSMakeRect(0, 0, 200, 30)
-        view.addItems(withObjectValues: ["Word", "Excel", "PPT/RTF/HTML/Text", "CSV", "Image"])
-        view.selectItem(at: 0)
-        alert.accessoryView = view
-        alert.addButton(withTitle: NSLocalizedString("确定", comment: ""))
-        alert.addButton(withTitle: NSLocalizedString("取消", comment: ""))
-        
-        let response = alert.runModal()
-        if response != .alertFirstButtonReturn { /// 取消
-            return
-        }
-        
-        /// 确定
-        let panel = NSOpenPanel()
-        panel.allowedFileTypes = ["pdf"]
-        panel.beginSheetModal(for: self.view.window!, completionHandler: {[self] response in
-            if response == .cancel {
-                return
-            }
-            
-            let model = KMDocumentModel()
-            model.documentURL = panel.url!
-            if model.isLocked && model.isEncrypt {
-                let passwordInputWindow = KMPasswordInputWindow().window()
-                passwordInputWindow?.documentURL = model.documentURL
-                passwordInputWindow?.type = .owner
-                
-                passwordInputWindow?.itemClick = {
-                    [self] (index: Int, string: String) in
-                    
-                    self.view.window?.endSheet(passwordInputWindow!)
-                    if index == 2 { /// 解密成功
-                        model.owerPassword = string
-                        
-                        var windowController: KMConvertBaseWindowController!
-                        if view.indexOfSelectedItem == 0 { /// Word
-                            windowController = KMConvertWordWindowController(windowNibName: "KMConvertBaseWindowController")
-                        } else if view.indexOfSelectedItem == 1 {
-                            windowController = KMConvertExcelWindowController(windowNibName: "KMConvertBaseWindowController")
-                        } else if view.indexOfSelectedItem == 2 {
-                            windowController = KMConvertPPTsWindowController(windowNibName: "KMConvertBaseWindowController")
-                        } else if view.indexOfSelectedItem == 3 {
-                            windowController = KMConvertCSVWindowController(windowNibName: "KMConvertBaseWindowController")
-                        } else if view.indexOfSelectedItem == 4 {
-                            windowController = KMConvertImageWindowController(windowNibName: "KMConvertBaseWindowController")
-                        }
-                        
-//                        windowController.documentURL = panel.url!
-                        windowController.documentModel = model
-                        
-                        windowController.itemClick = {
-                           [self] (index: Int) in
-                            if index == 1 { /// 批量转档
-                                self.view.window?.endSheet(convertWindowController.window!)
-                            } else if index == 2 { /// 关闭
-                                self.view.window?.endSheet(convertWindowController.window!)
-                            }
-                        }
-                        
-                        self.view.window?.beginSheet(windowController.window!)
-                        convertWindowController = windowController
-                    }
-                }
-                self.view.window?.beginSheet(passwordInputWindow!)
-                return
-            } else if (model.isLocked) {
-                let passwordInputWindow = KMPasswordInputWindow().window()
-                passwordInputWindow?.documentURL = model.documentURL
-                passwordInputWindow?.type = .open
-                
-                passwordInputWindow?.itemClick = {
-                    [self] (index: Int, string: String) in
-                    
-                    self.view.window?.endSheet(passwordInputWindow!)
-                    if index == 2 { /// 解密成功
-                        model.password = string
-                        
-                        var windowController: KMConvertBaseWindowController!
-                        if view.indexOfSelectedItem == 0 { /// Word
-                            windowController = KMConvertWordWindowController(windowNibName: "KMConvertBaseWindowController")
-                        } else if view.indexOfSelectedItem == 1 {
-                            windowController = KMConvertExcelWindowController(windowNibName: "KMConvertBaseWindowController")
-                        } else if view.indexOfSelectedItem == 2 {
-                            windowController = KMConvertPPTsWindowController(windowNibName: "KMConvertBaseWindowController")
-                        } else if view.indexOfSelectedItem == 3 {
-                            windowController = KMConvertCSVWindowController(windowNibName: "KMConvertBaseWindowController")
-                        } else if view.indexOfSelectedItem == 4 {
-                            windowController = KMConvertImageWindowController(windowNibName: "KMConvertBaseWindowController")
-                        }
-                        
-//                        windowController.documentURL = panel.url!
-                        windowController.documentModel = model
-                        
-                        windowController.itemClick = {
-                           [self] (index: Int) in
-                            if index == 1 { /// 批量转档
-                                self.view.window?.endSheet(convertWindowController.window!)
-                            } else if index == 2 { /// 关闭
-                                self.view.window?.endSheet(convertWindowController.window!)
-                            }
-                        }
-                        
-                        self.view.window?.beginSheet(windowController.window!)
-                        convertWindowController = windowController
-                    }
-                }
-                self.view.window?.beginSheet(passwordInputWindow!)
-                return
-            } else if (model.isEncrypt) {
-                let passwordInputWindow = KMPasswordInputWindow().window()
-                passwordInputWindow?.documentURL = model.documentURL
-                passwordInputWindow?.type = .owner
-                
-                passwordInputWindow?.itemClick = {
-                    [self] (index: Int, string: String) in
-                    
-                    self.view.window?.endSheet(passwordInputWindow!)
-                    if index == 2 { /// 解密成功
-                        model.owerPassword = string
-                        
-                        var windowController: KMConvertBaseWindowController!
-                        if view.indexOfSelectedItem == 0 { /// Word
-                            windowController = KMConvertWordWindowController(windowNibName: "KMConvertBaseWindowController")
-                        } else if view.indexOfSelectedItem == 1 {
-                            windowController = KMConvertExcelWindowController(windowNibName: "KMConvertBaseWindowController")
-                        } else if view.indexOfSelectedItem == 2 {
-                            windowController = KMConvertPPTsWindowController(windowNibName: "KMConvertBaseWindowController")
-                        } else if view.indexOfSelectedItem == 3 {
-                            windowController = KMConvertCSVWindowController(windowNibName: "KMConvertBaseWindowController")
-                        } else if view.indexOfSelectedItem == 4 {
-                            windowController = KMConvertImageWindowController(windowNibName: "KMConvertBaseWindowController")
-                        }
-                        
-//                        windowController.documentURL = panel.url!
-                        windowController.documentModel = model
-                        
-                        windowController.itemClick = {
-                           [self] (index: Int) in
-                            if index == 1 { /// 批量转档
-                                self.view.window?.endSheet(convertWindowController.window!)
-                            } else if index == 2 { /// 关闭
-                                self.view.window?.endSheet(convertWindowController.window!)
-                            }
-                        }
-                        
-                        self.view.window?.beginSheet(windowController.window!)
-                        convertWindowController = windowController
-                    }
-                }
-                self.view.window?.beginSheet(passwordInputWindow!)
-                return
-            }
-            
-            var windowController: KMConvertBaseWindowController!
-            if view.indexOfSelectedItem == 0 { /// Word
-                windowController = KMConvertWordWindowController(windowNibName: "KMConvertBaseWindowController")
-            } else if view.indexOfSelectedItem == 1 {
-                windowController = KMConvertExcelWindowController(windowNibName: "KMConvertBaseWindowController")
-            } else if view.indexOfSelectedItem == 2 {
-                windowController = KMConvertPPTsWindowController(windowNibName: "KMConvertBaseWindowController")
-            } else if view.indexOfSelectedItem == 3 {
-                windowController = KMConvertCSVWindowController(windowNibName: "KMConvertBaseWindowController")
-            } else if view.indexOfSelectedItem == 4 {
-                windowController = KMConvertImageWindowController(windowNibName: "KMConvertBaseWindowController")
-            }
-            
-//            windowController.documentURL = panel.url!
-            windowController.documentModel = model
-            
-            windowController.itemClick = {
-               [self] (index: Int) in
-                if index == 1 { /// 批量转档
-                    self.view.window?.endSheet(convertWindowController.window!)
-                } else if index == 2 { /// 关闭
-                    self.view.window?.endSheet(convertWindowController.window!)
-                }
-            }
-            
-            self.view.window?.beginSheet(windowController.window!)
-            convertWindowController = windowController
-        })
+//        let alert = NSAlert()
+//        alert.messageText = NSLocalizedString("请选择类型", comment: "")
+//
+//        let view = NSComboBox()
+//        view.isEditable = false
+//        view.frame = NSMakeRect(0, 0, 200, 30)
+//        view.addItems(withObjectValues: ["Word", "Excel", "PPT/RTF/HTML/Text", "CSV", "Image"])
+//        view.selectItem(at: 0)
+//        alert.accessoryView = view
+//        alert.addButton(withTitle: NSLocalizedString("确定", comment: ""))
+//        alert.addButton(withTitle: NSLocalizedString("取消", comment: ""))
+//
+//        let response = alert.runModal()
+//        if response != .alertFirstButtonReturn { /// 取消
+//            return
+//        }
+//
+//        /// 确定
+//        let panel = NSOpenPanel()
+//        panel.allowedFileTypes = ["pdf"]
+//        panel.beginSheetModal(for: self.view.window!, completionHandler: {[self] response in
+//            if response == .cancel {
+//                return
+//            }
+//
+//            let model = KMDocumentModel()
+//            model.documentURL = panel.url!
+//            if model.isLocked && model.isEncrypt {
+//                let passwordInputWindow = KMPasswordInputWindow().window()
+//                passwordInputWindow?.documentURL = model.documentURL
+//                passwordInputWindow?.type = .owner
+//
+//                passwordInputWindow?.itemClick = {
+//                    [self] (index: Int, string: String) in
+//
+//                    self.view.window?.endSheet(passwordInputWindow!)
+//                    if index == 2 { /// 解密成功
+//                        model.owerPassword = string
+//
+//                        var windowController: KMConvertBaseWindowController!
+//                        if view.indexOfSelectedItem == 0 { /// Word
+//                            windowController = KMConvertWordWindowController(windowNibName: "KMConvertBaseWindowController")
+//                        } else if view.indexOfSelectedItem == 1 {
+//                            windowController = KMConvertExcelWindowController(windowNibName: "KMConvertBaseWindowController")
+//                        } else if view.indexOfSelectedItem == 2 {
+//                            windowController = KMConvertPPTsWindowController(windowNibName: "KMConvertBaseWindowController")
+//                        } else if view.indexOfSelectedItem == 3 {
+//                            windowController = KMConvertCSVWindowController(windowNibName: "KMConvertBaseWindowController")
+//                        } else if view.indexOfSelectedItem == 4 {
+//                            windowController = KMConvertImageWindowController(windowNibName: "KMConvertBaseWindowController")
+//                        }
+//
+////                        windowController.documentURL = panel.url!
+//                        windowController.documentModel = model
+//
+//                        windowController.itemClick = {
+//                           [self] (index: Int) in
+//                            if index == 1 { /// 批量转档
+//                                self.view.window?.endSheet(convertWindowController.window!)
+//                            } else if index == 2 { /// 关闭
+//                                self.view.window?.endSheet(convertWindowController.window!)
+//                            }
+//                        }
+//
+//                        self.view.window?.beginSheet(windowController.window!)
+//                        convertWindowController = windowController
+//                    }
+//                }
+//                self.view.window?.beginSheet(passwordInputWindow!)
+//                return
+//            } else if (model.isLocked) {
+//                let passwordInputWindow = KMPasswordInputWindow().window()
+//                passwordInputWindow?.documentURL = model.documentURL
+//                passwordInputWindow?.type = .open
+//
+//                passwordInputWindow?.itemClick = {
+//                    [self] (index: Int, string: String) in
+//
+//                    self.view.window?.endSheet(passwordInputWindow!)
+//                    if index == 2 { /// 解密成功
+//                        model.password = string
+//
+//                        var windowController: KMConvertBaseWindowController!
+//                        if view.indexOfSelectedItem == 0 { /// Word
+//                            windowController = KMConvertWordWindowController(windowNibName: "KMConvertBaseWindowController")
+//                        } else if view.indexOfSelectedItem == 1 {
+//                            windowController = KMConvertExcelWindowController(windowNibName: "KMConvertBaseWindowController")
+//                        } else if view.indexOfSelectedItem == 2 {
+//                            windowController = KMConvertPPTsWindowController(windowNibName: "KMConvertBaseWindowController")
+//                        } else if view.indexOfSelectedItem == 3 {
+//                            windowController = KMConvertCSVWindowController(windowNibName: "KMConvertBaseWindowController")
+//                        } else if view.indexOfSelectedItem == 4 {
+//                            windowController = KMConvertImageWindowController(windowNibName: "KMConvertBaseWindowController")
+//                        }
+//
+////                        windowController.documentURL = panel.url!
+//                        windowController.documentModel = model
+//
+//                        windowController.itemClick = {
+//                           [self] (index: Int) in
+//                            if index == 1 { /// 批量转档
+//                                self.view.window?.endSheet(convertWindowController.window!)
+//                            } else if index == 2 { /// 关闭
+//                                self.view.window?.endSheet(convertWindowController.window!)
+//                            }
+//                        }
+//
+//                        self.view.window?.beginSheet(windowController.window!)
+//                        convertWindowController = windowController
+//                    }
+//                }
+//                self.view.window?.beginSheet(passwordInputWindow!)
+//                return
+//            } else if (model.isEncrypt) {
+//                let passwordInputWindow = KMPasswordInputWindow().window()
+//                passwordInputWindow?.documentURL = model.documentURL
+//                passwordInputWindow?.type = .owner
+//
+//                passwordInputWindow?.itemClick = {
+//                    [self] (index: Int, string: String) in
+//
+//                    self.view.window?.endSheet(passwordInputWindow!)
+//                    if index == 2 { /// 解密成功
+//                        model.owerPassword = string
+//
+//                        var windowController: KMConvertBaseWindowController!
+//                        if view.indexOfSelectedItem == 0 { /// Word
+//                            windowController = KMConvertWordWindowController(windowNibName: "KMConvertBaseWindowController")
+//                        } else if view.indexOfSelectedItem == 1 {
+//                            windowController = KMConvertExcelWindowController(windowNibName: "KMConvertBaseWindowController")
+//                        } else if view.indexOfSelectedItem == 2 {
+//                            windowController = KMConvertPPTsWindowController(windowNibName: "KMConvertBaseWindowController")
+//                        } else if view.indexOfSelectedItem == 3 {
+//                            windowController = KMConvertCSVWindowController(windowNibName: "KMConvertBaseWindowController")
+//                        } else if view.indexOfSelectedItem == 4 {
+//                            windowController = KMConvertImageWindowController(windowNibName: "KMConvertBaseWindowController")
+//                        }
+//
+////                        windowController.documentURL = panel.url!
+//                        windowController.documentModel = model
+//
+//                        windowController.itemClick = {
+//                           [self] (index: Int) in
+//                            if index == 1 { /// 批量转档
+//                                self.view.window?.endSheet(convertWindowController.window!)
+//                            } else if index == 2 { /// 关闭
+//                                self.view.window?.endSheet(convertWindowController.window!)
+//                            }
+//                        }
+//
+//                        self.view.window?.beginSheet(windowController.window!)
+//                        convertWindowController = windowController
+//                    }
+//                }
+//                self.view.window?.beginSheet(passwordInputWindow!)
+//                return
+//            }
+//
+//            var windowController: KMConvertBaseWindowController!
+//            if view.indexOfSelectedItem == 0 { /// Word
+//                windowController = KMConvertWordWindowController(windowNibName: "KMConvertBaseWindowController")
+//            } else if view.indexOfSelectedItem == 1 {
+//                windowController = KMConvertExcelWindowController(windowNibName: "KMConvertBaseWindowController")
+//            } else if view.indexOfSelectedItem == 2 {
+//                windowController = KMConvertPPTsWindowController(windowNibName: "KMConvertBaseWindowController")
+//            } else if view.indexOfSelectedItem == 3 {
+//                windowController = KMConvertCSVWindowController(windowNibName: "KMConvertBaseWindowController")
+//            } else if view.indexOfSelectedItem == 4 {
+//                windowController = KMConvertImageWindowController(windowNibName: "KMConvertBaseWindowController")
+//            }
+//
+////            windowController.documentURL = panel.url!
+//            windowController.documentModel = model
+//
+//            windowController.itemClick = {
+//               [self] (index: Int) in
+//                if index == 1 { /// 批量转档
+//                    self.view.window?.endSheet(convertWindowController.window!)
+//                } else if index == 2 { /// 关闭
+//                    self.view.window?.endSheet(convertWindowController.window!)
+//                }
+//            }
+//
+//            self.view.window?.beginSheet(windowController.window!)
+//            convertWindowController = windowController
+//        })
+        KMBatchWindowController.openFile(nil)
     }
     
     func fastTool_ImageToPDF() {    // 图片转PDF

+ 16 - 0
PDF Office/PDF Office/Class/Merge/OCPart/KMBatchTableRowView.h

@@ -0,0 +1,16 @@
+//
+//  KMBatchTableRowView.h
+//  PDF Reader Pro Edition
+//
+//  Created by zhipeng jiang on 2020/11/2.
+//
+
+#import "KMTableRowView.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KMBatchTableRowView : KMTableRowView
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 39 - 0
PDF Office/PDF Office/Class/Merge/OCPart/KMBatchTableRowView.m

@@ -0,0 +1,39 @@
+//
+//  KMBatchTableRowView.m
+//  PDF Reader Pro Edition
+//
+//  Created by zhipeng jiang on 2020/11/2.
+//
+
+#import "KMBatchTableRowView.h"
+
+@implementation KMBatchTableRowView
+
+#pragma mark - Mouse Event
+
+- (void)mouseExited:(NSEvent *)event {
+    [super mouseExited:event];
+    for (NSUInteger i = 0; i < self.subviews.count; i++) {
+        NSView *v = [self.subviews objectAtIndex:i];
+        for (NSUInteger j = 0; j < v.subviews.count; j++) {
+            NSView *sub = [v.subviews objectAtIndex:j];
+            if ([sub isKindOfClass:[NSButton class]]) {
+                sub.hidden = YES;
+            }
+        }
+    }
+}
+
+- (void)mouseEntered:(NSEvent *)event {
+    [super mouseEntered:event];
+    for (NSUInteger i = 0; i < self.subviews.count; i++) {
+        NSView *v = [self.subviews objectAtIndex:i];
+        for (NSUInteger j = 0; j < v.subviews.count; j++) {
+            NSView *sub = [v.subviews objectAtIndex:j];
+            if ([sub isKindOfClass:[NSButton class]]) {
+                sub.hidden = NO;
+            }
+        }
+    }
+}
+@end

+ 30 - 0
PDF Office/PDF Office/Class/Merge/OCPart/KMBlankView.h

@@ -0,0 +1,30 @@
+//
+//  KMBlankView.h
+//  PDF Reader Pro Edition
+//
+//  Created by zhipeng jiang on 2020/12/23.
+//
+
+#import <Cocoa/Cocoa.h>
+#import "KMPDFEditAppendCustomView.h"
+
+typedef NS_ENUM(NSUInteger, KMBlankViewMouseEventType) {
+    KMBlankViewMouseEventType_MouseEnter,
+    KMBlankViewMouseEventType_MouseExit,
+    KMBlankViewMouseEventType_MouseDown,
+    KMBlankViewMouseEventType_MouseUp
+};
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KMBlankView : NSView
+
+@property (nonatomic,assign) IBOutlet NSTextField *titleLabel;
+@property (nonatomic,assign) IBOutlet NSTextField *secondTitleLabel;
+@property (nonatomic,assign) IBOutlet NSImageView *imageView;
+@property (assign) IBOutlet KMPDFEditAppendCustomView *customView;
+@property (nonatomic, copy) void(^mouseActionCallBack)(KMBlankViewMouseEventType mouseType);
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 64 - 0
PDF Office/PDF Office/Class/Merge/OCPart/KMBlankView.m

@@ -0,0 +1,64 @@
+//
+//  KMBlankView.m
+//  PDF Reader Pro Edition
+//
+//  Created by zhipeng jiang on 2020/12/23.
+//
+
+#import "KMBlankView.h"
+
+@implementation KMBlankView
+
+-(void)awakeFromNib {
+    [super awakeFromNib];
+    self.titleLabel.font = [NSFont systemFontOfSize:14 weight:NSFontWeightSemibold];
+//    self.titleLabel.textColor = [KMAppearance KMColor_Layout_H1];
+    self.secondTitleLabel.font = [NSFont systemFontOfSize:14];
+//    self.secondTitleLabel.textColor = [KMAppearance KMColor_Layout_H2];
+    
+    self.titleLabel.stringValue = @"";
+    self.secondTitleLabel.stringValue = @"";
+    [self addTrackingArea];
+    self.wantsLayer = YES;
+}
+
+- (void)addTrackingArea {
+    NSTrackingArea *trackingArea = [[NSTrackingArea alloc] initWithRect:self.imageView.bounds options:NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways owner:self userInfo:nil];
+    [self.imageView addTrackingArea:trackingArea];
+//    [trackingArea release];
+}
+
+- (void)mouseEntered:(NSEvent *)event {
+    [super mouseEntered:event];
+    if (self.mouseActionCallBack) {
+        self.mouseActionCallBack(KMBlankViewMouseEventType_MouseEnter);
+    }
+}
+
+- (void)mouseExited:(NSEvent *)event {
+    [super mouseExited:event];
+    
+    if (self.mouseActionCallBack) {
+        self.mouseActionCallBack(KMBlankViewMouseEventType_MouseExit);
+    }
+}
+
+- (void)mouseDown:(NSEvent *)event {
+    [super mouseDown:event];
+    NSPoint point = [event locationInWindow];
+    point = [self convertPoint:point toView:self.imageView];
+    if (self.mouseActionCallBack && CGRectContainsPoint(self.imageView.bounds, point)) {
+        self.mouseActionCallBack(KMBlankViewMouseEventType_MouseDown);
+    }
+}
+
+- (void)mouseUp:(NSEvent *)event {
+    [super mouseUp:event];
+    NSPoint point = [event locationInWindow];
+    point = [self convertPoint:point toView:self.imageView];
+    if (self.mouseActionCallBack && CGRectContainsPoint(self.imageView.bounds, point)) {
+        self.mouseActionCallBack(KMBlankViewMouseEventType_MouseUp);
+    }
+}
+
+@end

+ 36 - 0
PDF Office/PDF Office/Class/Merge/OCPart/KMFileAttribute.h

@@ -0,0 +1,36 @@
+//
+//  KMFileAttribute.h
+//  PDF to Word
+//
+//  Created by wangshuai on 13-8-14.
+//  Copyright (c) 2013年 kdanmobile. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import <Quartz/Quartz.h>
+
+typedef NS_OPTIONS(NSUInteger, KMPDFSelectPageStringType) {
+    KMPDFSeleectPageType_AllPages   = 0 ,
+    KMPDFSeleectPageType_OnlyOdd,
+    KMPDFSeleectPageType_OnlyEven,
+    KMPDFSeleectPageType_PagesString,
+};
+
+@interface KMFileAttribute : NSObject{
+    NSString        *_filePath;
+    BOOL            _bAllPage;
+    NSMutableArray  *_selectPages;
+    NSString        *_pagesString;
+    
+    BOOL            _isLocked;
+    NSString        *_password;
+}
+@property (nonatomic,retain) NSString *filePath;
+@property (nonatomic,retain) PDFDocument *pdfDocument;
+@property (nonatomic) BOOL bAllPage;
+@property (nonatomic,retain) NSMutableArray *selectPages;
+@property (nonatomic,retain) NSString *pagesString;
+@property (nonatomic) BOOL isLocked;
+@property (nonatomic,retain) NSString *password;
+@property (nonatomic,assign) KMPDFSelectPageStringType pagesType;
+@end

+ 198 - 0
PDF Office/PDF Office/Class/Merge/OCPart/KMFileAttribute.m

@@ -0,0 +1,198 @@
+//
+//  KMFileAttribute.m
+//  PDF to Word
+//
+//  Created by wangshuai on 13-8-14.
+//  Copyright (c) 2013年 kdanmobile. All rights reserved.
+//
+
+#import "KMFileAttribute.h"
+#import <Quartz/Quartz.h>
+
+@implementation KMFileAttribute
+@synthesize filePath = _filePath;
+@synthesize bAllPage = _bAllPage;
+@synthesize selectPages = _selectPages;
+@synthesize pagesString = _pagesString;
+@synthesize isLocked = _isLocked;
+@synthesize password = _password;
+
+- (id)init
+{
+    self = [super init];
+    if (self) {
+        _bAllPage = YES;
+        _isLocked = NO;
+        _password = nil;
+        _pagesString = @"";
+    }
+    return self;
+}
+
+- (void)dealloc
+{
+//    [_pdfDocument release];
+//    [_filePath release];
+//    [_pagesString release];
+//    [_password release];
+//    [_selectPages release];
+    
+//    [super dealloc];
+}
+
+- (NSMutableArray*)selectPages
+{
+    [self isInvalidString:_pagesString];
+    if (!_bAllPage) {
+        [self QuickSort:_selectPages StartIndex:0 EndIndex:[_selectPages count]-1];
+    }
+    return _selectPages;
+}
+
+- (BOOL)isInvalidString:(NSString*)text
+{
+    PDFDocument * document;
+    if (_pdfDocument) {
+        document = self.pdfDocument;
+    } else {
+       document = [[PDFDocument alloc] initWithURL:[NSURL fileURLWithPath:self.filePath]];
+    }
+    
+    NSInteger pageNumber = [document pageCount];
+    if (_bAllPage) {
+        _selectPages = [[NSMutableArray alloc] init];
+        for (int i=1; i<=pageNumber; i++) {
+            [_selectPages addObject:[NSNumber numberWithInteger:i]];
+        }
+        return NO;
+    }
+    NSMutableArray *pageNumbers = [[NSMutableArray alloc] init];
+    BOOL isInvalid = NO;
+    unichar c;
+    for (int i=0; i<[text length]; i++) {
+        c = [text characterAtIndex:i];
+        if (c!='0'&&c!='1'&&c!='2'&&c!='3'&&c!='4'&&c!='5'&&c!='6'&&c!='7'&&c!='8'&&c!='9'&&c!=','&&c!='-') {
+            isInvalid = YES;
+            break;
+        }else{
+            isInvalid = NO;
+        }
+    }
+    if (!isInvalid) {
+        NSArray *array = [text componentsSeparatedByString:@","];
+        for(NSString *s in array){
+            if ([s isEqualToString:@""]) {
+                isInvalid = YES;
+                break;
+            }else{
+                NSArray *pages = [s componentsSeparatedByString:@"-"];
+                if ([pages count]>2) {
+                    isInvalid = YES;
+                    break;
+                }else if([pages count]==1){
+                    NSString *p = [pages objectAtIndex:0];
+                    if ([p isEqualToString:@""]||[p intValue]>pageNumber||[p integerValue]==0) {
+                        isInvalid = YES;
+                        break;
+                    }else{
+                        BOOL isEqual = NO;
+                        for(NSNumber *pageNumber in pageNumbers){
+                            if ([pageNumber integerValue]==[p integerValue]) {
+                                isEqual = YES;
+                                isInvalid = YES;
+                                break;
+                            }
+                        }
+                        if (!isEqual) {
+                            [pageNumbers addObject:[NSNumber numberWithInteger:[p integerValue]]];
+                        }
+                    }
+                }else if([pages count]==2){
+                    NSString *p1 = [pages objectAtIndex:0];
+                    NSString *p2 = [pages objectAtIndex:1];
+                    if ([p1 isEqualToString:@""]||[p2 isEqualToString:@""]||
+                        [p1 intValue]>=[p2 intValue]||[p2 intValue]>pageNumber||[p1 integerValue]==0) {
+                        isInvalid = YES;
+                        break;
+                    }else{
+                        BOOL isEqual = NO;
+                        for (int i=[p1 intValue]; i<=[p2 intValue]; i++) {
+                            for(NSNumber *pageNumber in pageNumbers){
+                                if ([pageNumber integerValue]==i) {
+                                    isEqual = YES;
+                                    isInvalid = YES;
+                                    break;
+                                }
+                            }
+                        }
+                        if (!isEqual) {
+                            for (int i=[p1 intValue]; i<=[p2 intValue]; i++) {
+                                [pageNumbers addObject:[NSNumber numberWithInteger:i]];
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+    if ([text length]==0) {
+        isInvalid = YES;
+    }
+    if (isInvalid) {
+        _selectPages = nil;
+    }else{
+        _selectPages = pageNumbers;
+    }
+    return isInvalid;
+}
+
+-(void)QuickSort:(NSMutableArray *)list StartIndex:(NSInteger)startIndex EndIndex:(NSInteger)endIndex{
+    
+    if(startIndex >= endIndex)return;
+    
+    NSNumber * temp = [list objectAtIndex:startIndex];
+    NSInteger tempIndex = startIndex;
+    
+    for(NSInteger i = startIndex + 1 ; i <= endIndex ; i++){
+        
+        NSNumber *t = [list objectAtIndex:i];
+        
+        if([temp intValue] > [t intValue]){
+            
+            tempIndex = tempIndex + 1;
+            
+            [list exchangeObjectAtIndex:tempIndex withObjectAtIndex:i];
+            
+        }
+        
+    }
+    
+    [list exchangeObjectAtIndex:tempIndex withObjectAtIndex:startIndex];
+    [self QuickSort:list StartIndex:startIndex EndIndex:tempIndex-1];
+    [self QuickSort:list StartIndex:tempIndex+1 EndIndex:endIndex];
+}
+
+/* let the image browser knows we use a path representation */
+//- (NSString *)imageRepresentationType
+//{
+//	return IKImageBrowserPathRepresentationType;
+//}
+
+/* give our representation to the image browser */
+- (id)imageRepresentation
+{
+	return self.filePath;
+}
+
+/* use the absolute filepath as identifier */
+- (NSString *)imageUID
+{
+    return self.filePath;
+}
+
+- (NSString*)imageTitle
+{
+    return [[self.filePath lastPathComponent] stringByDeletingPathExtension];
+}
+
+@end

+ 20 - 0
PDF Office/PDF Office/Class/Merge/OCPart/KMPDFEditAppendCustomView.h

@@ -0,0 +1,20 @@
+//
+//  KMPDFEditAppendCustomView.h
+//  PDF Reader Pro Edition
+//
+//  Created by KdanWJ on 2021/5/13.
+//
+
+#import <Cocoa/Cocoa.h>
+
+//typedef void(^DragEnteredCallBack)(BOOL isDragEntered);
+typedef void(^DragSuccessCallBack)(NSMutableArray *fileNames);
+
+@interface KMPDFEditAppendCustomView : NSView
+
+//@property(nonatomic , copy) DragEnteredCallBack dragEnteredBlock;
+
+@property(nonatomic , copy) DragSuccessCallBack dragSuccessBlock;
+
+@end
+

+ 75 - 0
PDF Office/PDF Office/Class/Merge/OCPart/KMPDFEditAppendCustomView.m

@@ -0,0 +1,75 @@
+//
+//  KMPDFEditAppendCustomView.m
+//  PDF Reader Pro Edition
+//
+//  Created by KdanWJ on 2021/5/13.
+//
+
+#import "KMPDFEditAppendCustomView.h"
+//#import "SKDocumentController.h"
+//#import "NSError_SKExtensions.h"
+
+@implementation KMPDFEditAppendCustomView
+
+- (void)dealloc {
+//    Block_release(_dragEnteredBlock);
+//    Block_release(_dragSuccessBlock);
+    
+//    [super dealloc];
+}
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    
+    [self registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]];
+}
+
+- (void)draggingExited:(nullable id <NSDraggingInfo>)sender
+{
+//    if (self.dragEnteredBlock) {
+//        self.dragEnteredBlock(NO);
+//    }
+}
+
+- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender
+{
+//    if (self.dragEnteredBlock) {
+//        self.dragEnteredBlock(YES);
+//    }
+    NSPasteboard *pboard = [sender draggingPasteboard];
+    BOOL isCanDrag = NO;
+    NSDragOperation result = NSDragOperationNone;
+    if ([pboard availableTypeFromArray:[NSArray arrayWithObject:NSFilenamesPboardType]])
+    {
+        NSArray *fileNames = [pboard propertyListForType:NSFilenamesPboardType];
+        for (NSString* path in fileNames) {
+            if ([[path lowercaseString] hasSuffix:@"pdf"]) {
+                isCanDrag = YES;
+            }else{
+                isCanDrag = NO;
+                break;
+            }
+        }
+    }
+    self.layer.borderColor = [NSColor clearColor].CGColor;
+
+    if (isCanDrag) {
+        
+        result = NSDragOperationCopy;
+    }
+    return result;
+}
+
+- (BOOL)prepareForDragOperation:(id<NSDraggingInfo>)sender
+{
+    NSPasteboard *pboard = [sender draggingPasteboard];
+    if ([pboard availableTypeFromArray:[NSArray arrayWithObject:NSFilenamesPboardType]]) {
+        NSMutableArray *fileNames = [pboard propertyListForType:NSFilenamesPboardType];
+        if (self.dragSuccessBlock) {
+            self.dragSuccessBlock(fileNames);
+        }
+    }
+    return YES;
+}
+
+@end

+ 32 - 0
PDF Office/PDF Office/Class/Merge/OCPart/KMPDFEditAppendWindow.h

@@ -0,0 +1,32 @@
+//
+//  KMPDFEditAppendWindow.h
+//  PDF Reader
+//
+//  Created by 丁林圭 on 2017/5/11.
+//  Copyright © 2017年 zhangjie. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+#import <Quartz/Quartz.h>
+#import <ComPDFKit/ComPDFKit.h>
+
+@interface KMPDFEditAppendTabelViewCell :NSTableCellView
+@end
+
+#define moniker(x) ((x) >= 1024 ? ((x) < 1048576 ? 'M':'G'):'K')
+#define truesize(x) ( (x) >= 1024 ?( (x) < 1048576 ? (x)/1024.0 : (x)/1048576.0) : (x))
+
+typedef NS_OPTIONS(NSUInteger, KMPDFPageEditType) {
+    KMPDFPageEditAppend  = 1 ,
+    KMPDFPageEditMerge ,
+    };
+
+@interface KMPDFEditAppendWindow : NSWindowController
+@property (nonatomic,copy) void (^saveAsPDFFilePath) (NSString *filePath);
+
+- (id)initWithFilePaths:(NSArray *)files;
+- (id)initWithPDFDocument:(CPDFDocument *)document;
+
+- (void)beginSheetModalForWindow:(NSWindow *)window completionHandler:(void (^)(BOOL isSuccessfully ,NSIndexSet * selectedIndexSet))handler;
+
+@end

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1143 - 0
PDF Office/PDF Office/Class/Merge/OCPart/KMPDFEditAppendWindow.m


+ 553 - 0
PDF Office/PDF Office/Class/Merge/OCPart/KMPDFEditAppendWindow.xib

@@ -0,0 +1,553 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="18122" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="18122"/>
+        <capability name="Named colors" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMPDFEditAppendWindow">
+            <connections>
+                <outlet property="A3SizeButton" destination="pEb-Zq-aIJ" id="gry-Y0-7bt"/>
+                <outlet property="A4SizeButton" destination="djx-Wp-Ly9" id="MVb-9y-4Sj"/>
+                <outlet property="USLegalButton" destination="Dbh-FL-cvn" id="TIb-fe-N91"/>
+                <outlet property="USLetterSizeButton" destination="T6f-rX-54f" id="6b0-w0-IBg"/>
+                <outlet property="addFileButton" destination="efw-wZ-r7Y" id="rcx-lu-s27"/>
+                <outlet property="appendButton" destination="YEl-By-aRx" id="jlX-4M-Lb6"/>
+                <outlet property="blankImage" destination="IqC-f7-Lnl" id="qLC-78-jO9"/>
+                <outlet property="blankLabel" destination="1dO-kv-PuF" id="R9f-G4-kJu"/>
+                <outlet property="blankView" destination="EEC-VI-dAb" id="gV3-A9-nB3"/>
+                <outlet property="box" destination="SNg-B0-ys5" id="KA3-jP-eHb"/>
+                <outlet property="boxLabel" destination="B6i-nd-oNy" id="j4S-an-LAY"/>
+                <outlet property="cancelButton" destination="cDq-K2-M6M" id="0gk-w3-suo"/>
+                <outlet property="clearButton" destination="Zrt-3W-HbQ" id="aAf-35-9So"/>
+                <outlet property="customSizeButton" destination="sRv-B4-8bK" id="OMg-Td-LM8"/>
+                <outlet property="myBlankView" destination="Bxz-CR-NgQ" id="fja-0n-Ywh"/>
+                <outlet property="originalSizeButton" destination="KyV-U2-Jil" id="Rlv-YD-yRy"/>
+                <outlet property="pageSizeHeightTextField" destination="1M5-tW-MRF" id="bNO-kG-Ire"/>
+                <outlet property="pageSizeUnitLabel" destination="m7b-I1-lQz" id="d0K-s6-gTj"/>
+                <outlet property="pageSizeWidthHeightConnectorTextField" destination="buB-SK-8mO" id="DsJ-yT-ms4"/>
+                <outlet property="pageSizeWidthTextField" destination="h32-rZ-jac" id="sSv-Me-CsH"/>
+                <outlet property="progress" destination="Uex-2T-CgC" id="GaY-Fo-8ie"/>
+                <outlet property="tableView" destination="hj6-Zp-r0z" id="spR-sp-6TP"/>
+                <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="default" id="F0z-JX-Cv5">
+            <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
+            <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
+            <rect key="contentRect" x="196" y="240" width="947" height="618"/>
+            <rect key="screenRect" x="0.0" y="0.0" width="2560" height="1415"/>
+            <value key="minSize" type="size" width="618" height="567"/>
+            <value key="maxSize" type="size" width="1000" height="927"/>
+            <view key="contentView" wantsLayer="YES" id="se5-gp-TjO">
+                <rect key="frame" x="0.0" y="0.0" width="947" height="596"/>
+                <autoresizingMask key="autoresizingMask"/>
+                <subviews>
+                    <scrollView autohidesScrollers="YES" horizontalLineScroll="122" horizontalPageScroll="10" verticalLineScroll="122" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ggk-eO-LzC">
+                        <rect key="frame" x="40" y="60" width="480" height="489"/>
+                        <clipView key="contentView" drawsBackground="NO" id="Mfh-Ax-kRE">
+                            <rect key="frame" x="1" y="1" width="478" height="487"/>
+                            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                            <subviews>
+                                <tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnSelection="YES" multipleSelection="NO" autosaveColumns="NO" rowHeight="120" rowSizeStyle="automatic" viewBased="YES" id="hj6-Zp-r0z">
+                                    <rect key="frame" x="0.0" y="0.0" width="478" height="487"/>
+                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                    <size key="intercellSpacing" width="3" height="2"/>
+                                    <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                    <color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
+                                    <tableColumns>
+                                        <tableColumn width="437" minWidth="40" maxWidth="1000" id="pjX-oF-3Od">
+                                            <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
+                                                <color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
+                                                <color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
+                                            </tableHeaderCell>
+                                            <textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="HJ8-Y9-a13">
+                                                <font key="font" metaFont="system"/>
+                                                <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                                                <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                            </textFieldCell>
+                                            <tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
+                                            <prototypeCellViews>
+                                                <tableCellView identifier="KMPDFEditAppendTableViewCell" id="kJM-8r-UtU" customClass="KMPDFEditAppendTabelViewCell">
+                                                    <rect key="frame" x="11" y="1" width="446" height="120"/>
+                                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                                    <subviews>
+                                                        <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="PgT-U2-qfU">
+                                                            <rect key="frame" x="18" y="52" width="24" height="16"/>
+                                                            <constraints>
+                                                                <constraint firstAttribute="width" constant="20" id="Hwf-fT-ly0"/>
+                                                            </constraints>
+                                                            <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="1" id="Pa0-Jp-rrY">
+                                                                <font key="font" metaFont="system"/>
+                                                                <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                                                <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+                                                            </textFieldCell>
+                                                        </textField>
+                                                        <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="tPy-ai-Cdt">
+                                                            <rect key="frame" x="50" y="10" width="80" height="90"/>
+                                                            <constraints>
+                                                                <constraint firstAttribute="width" constant="80" id="akZ-3c-hXT"/>
+                                                            </constraints>
+                                                            <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSAdvanced" id="Sd3-jX-Ogs"/>
+                                                        </imageView>
+                                                        <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="eNU-Sm-LND">
+                                                            <rect key="frame" x="138" y="84" width="85" height="16"/>
+                                                            <textFieldCell key="cell" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="FileName.pdf" id="Ylr-ds-9Tk">
+                                                                <font key="font" metaFont="system"/>
+                                                                <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                                                <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+                                                            </textFieldCell>
+                                                        </textField>
+                                                        <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="398-sK-K5V">
+                                                            <rect key="frame" x="138" y="64" width="39" height="16"/>
+                                                            <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="2.0M" id="oVW-8o-Cnt">
+                                                                <font key="font" metaFont="system"/>
+                                                                <color key="textColor" name="systemGrayColor" catalog="System" colorSpace="catalog"/>
+                                                                <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+                                                            </textFieldCell>
+                                                        </textField>
+                                                        <comboBox verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="8V9-7o-ppF">
+                                                            <rect key="frame" x="140" y="10" width="289" height="25"/>
+                                                            <comboBoxCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" drawsBackground="YES" completes="NO" numberOfVisibleItems="5" id="7AZ-7i-5XC">
+                                                                <font key="font" metaFont="system"/>
+                                                                <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                                                                <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                                                <objectValues>
+                                                                    <string>Item 1</string>
+                                                                    <string>Item 2</string>
+                                                                    <string>Item 3</string>
+                                                                </objectValues>
+                                                            </comboBoxCell>
+                                                        </comboBox>
+                                                        <box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="RnQ-bh-CRD">
+                                                            <rect key="frame" x="0.0" y="-2" width="446" height="5"/>
+                                                        </box>
+                                                        <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Xwh-TX-M2m">
+                                                            <rect key="frame" x="203" y="64" width="61" height="16"/>
+                                                            <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="23 Pages" id="5dj-sT-DqB">
+                                                                <font key="font" metaFont="system"/>
+                                                                <color key="textColor" name="systemGrayColor" catalog="System" colorSpace="catalog"/>
+                                                                <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+                                                            </textFieldCell>
+                                                        </textField>
+                                                        <button translatesAutoresizingMaskIntoConstraints="NO" id="uvu-07-lWB">
+                                                            <rect key="frame" x="418" y="84" width="16" height="16"/>
+                                                            <constraints>
+                                                                <constraint firstAttribute="width" constant="16" id="5d9-Mx-d6v"/>
+                                                                <constraint firstAttribute="height" constant="16" id="7hC-bG-sOG"/>
+                                                            </constraints>
+                                                            <buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="KMImageNameUXIconBtnCloseNor" imagePosition="only" alignment="center" imageScaling="proportionallyUpOrDown" inset="2" id="NIS-J9-zD9">
+                                                                <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                                                <font key="font" metaFont="system"/>
+                                                            </buttonCell>
+                                                            <connections>
+                                                                <action selector="buttonClicked_Remove:" target="kJM-8r-UtU" id="baP-ig-Qb8"/>
+                                                            </connections>
+                                                        </button>
+                                                        <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="u5l-4V-ll2">
+                                                            <rect key="frame" x="138" y="38" width="77" height="16"/>
+                                                            <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Page Range" id="3Io-PJ-v5k">
+                                                                <font key="font" metaFont="system"/>
+                                                                <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                                                <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+                                                            </textFieldCell>
+                                                        </textField>
+                                                    </subviews>
+                                                    <constraints>
+                                                        <constraint firstItem="8V9-7o-ppF" firstAttribute="top" secondItem="u5l-4V-ll2" secondAttribute="bottom" constant="5" id="0xy-X1-DzD"/>
+                                                        <constraint firstItem="u5l-4V-ll2" firstAttribute="leading" secondItem="eNU-Sm-LND" secondAttribute="leading" id="3ot-Gg-1bN"/>
+                                                        <constraint firstItem="Xwh-TX-M2m" firstAttribute="centerY" secondItem="398-sK-K5V" secondAttribute="centerY" id="5pu-hm-FH4"/>
+                                                        <constraint firstItem="eNU-Sm-LND" firstAttribute="leading" secondItem="tPy-ai-Cdt" secondAttribute="trailing" constant="10" id="9wn-tY-jx1"/>
+                                                        <constraint firstItem="tPy-ai-Cdt" firstAttribute="top" secondItem="kJM-8r-UtU" secondAttribute="top" constant="20" id="BcY-tn-OGJ"/>
+                                                        <constraint firstAttribute="trailing" secondItem="uvu-07-lWB" secondAttribute="trailing" constant="12" id="Cd6-ND-V0v"/>
+                                                        <constraint firstAttribute="trailing" secondItem="8V9-7o-ppF" secondAttribute="trailing" constant="20" id="CeS-8N-Qeh"/>
+                                                        <constraint firstItem="RnQ-bh-CRD" firstAttribute="leading" secondItem="kJM-8r-UtU" secondAttribute="leading" id="HWw-5d-7fB"/>
+                                                        <constraint firstItem="Xwh-TX-M2m" firstAttribute="leading" secondItem="398-sK-K5V" secondAttribute="trailing" constant="30" id="Jdw-wf-Ajy"/>
+                                                        <constraint firstItem="eNU-Sm-LND" firstAttribute="top" secondItem="tPy-ai-Cdt" secondAttribute="top" id="Lg6-Pj-uGv"/>
+                                                        <constraint firstItem="8V9-7o-ppF" firstAttribute="leading" secondItem="u5l-4V-ll2" secondAttribute="leading" id="Lj2-dw-F6S"/>
+                                                        <constraint firstItem="uvu-07-lWB" firstAttribute="centerY" secondItem="eNU-Sm-LND" secondAttribute="centerY" id="Nbm-qA-G62"/>
+                                                        <constraint firstItem="tPy-ai-Cdt" firstAttribute="leading" secondItem="PgT-U2-qfU" secondAttribute="trailing" constant="10" id="Q7x-lw-PLk"/>
+                                                        <constraint firstItem="398-sK-K5V" firstAttribute="top" secondItem="eNU-Sm-LND" secondAttribute="bottom" constant="4" id="UpJ-Bz-5kl"/>
+                                                        <constraint firstItem="uvu-07-lWB" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="eNU-Sm-LND" secondAttribute="trailing" priority="999" id="dtj-HK-6Bf"/>
+                                                        <constraint firstAttribute="trailing" secondItem="RnQ-bh-CRD" secondAttribute="trailing" id="fTz-Mj-im0"/>
+                                                        <constraint firstAttribute="bottom" secondItem="tPy-ai-Cdt" secondAttribute="bottom" constant="10" id="h7e-aA-8S8"/>
+                                                        <constraint firstItem="u5l-4V-ll2" firstAttribute="leading" secondItem="398-sK-K5V" secondAttribute="leading" id="iN2-Rp-FL0"/>
+                                                        <constraint firstAttribute="bottom" secondItem="RnQ-bh-CRD" secondAttribute="bottom" id="jjs-ci-KgJ"/>
+                                                        <constraint firstItem="u5l-4V-ll2" firstAttribute="top" secondItem="398-sK-K5V" secondAttribute="bottom" constant="10" id="pmJ-LN-yTJ"/>
+                                                        <constraint firstItem="PgT-U2-qfU" firstAttribute="centerY" secondItem="kJM-8r-UtU" secondAttribute="centerY" id="pqi-5f-Kaq"/>
+                                                        <constraint firstItem="PgT-U2-qfU" firstAttribute="leading" secondItem="kJM-8r-UtU" secondAttribute="leading" constant="20" id="vnY-oc-fF3"/>
+                                                    </constraints>
+                                                    <connections>
+                                                        <outlet property="fileImage" destination="tPy-ai-Cdt" id="v8V-YY-7w4"/>
+                                                        <outlet property="fileNameLabel" destination="eNU-Sm-LND" id="kO4-XE-9cc"/>
+                                                        <outlet property="indexLabel" destination="PgT-U2-qfU" id="VRx-5w-GWu"/>
+                                                        <outlet property="pageCountLabel" destination="Xwh-TX-M2m" id="HZY-Rn-dnq"/>
+                                                        <outlet property="pageRangeBox" destination="8V9-7o-ppF" id="eLB-0c-0Oj"/>
+                                                        <outlet property="pageRangeLabel" destination="u5l-4V-ll2" id="ESe-r2-bDz"/>
+                                                        <outlet property="sizeLabel" destination="398-sK-K5V" id="NP9-LD-Dbc"/>
+                                                    </connections>
+                                                </tableCellView>
+                                            </prototypeCellViews>
+                                        </tableColumn>
+                                    </tableColumns>
+                                </tableView>
+                            </subviews>
+                            <nil key="backgroundColor"/>
+                        </clipView>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="489" id="09E-fS-UGH"/>
+                            <constraint firstAttribute="width" constant="480" id="yWQ-fV-ium"/>
+                        </constraints>
+                        <scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="uXJ-M9-xFS">
+                            <rect key="frame" x="1" y="428" width="478" height="16"/>
+                            <autoresizingMask key="autoresizingMask"/>
+                        </scroller>
+                        <scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="TlK-eh-6A5">
+                            <rect key="frame" x="224" y="17" width="15" height="102"/>
+                            <autoresizingMask key="autoresizingMask"/>
+                        </scroller>
+                    </scrollView>
+                    <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Zrt-3W-HbQ">
+                        <rect key="frame" x="33" y="13" width="66" height="32"/>
+                        <buttonCell key="cell" type="push" title="Clear" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="dK6-4V-Tdc">
+                            <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                            <font key="font" metaFont="system"/>
+                        </buttonCell>
+                        <connections>
+                            <action selector="buttonItemClicked_Clear:" target="-2" id="XhU-7q-IYq"/>
+                        </connections>
+                    </button>
+                    <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="YEl-By-aRx">
+                        <rect key="frame" x="852" y="13" width="82" height="32"/>
+                        <buttonCell key="cell" type="push" title="Append" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="icc-Tq-CDm">
+                            <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                            <font key="font" metaFont="system"/>
+                            <string key="keyEquivalent" base64-UTF8="YES">
+DQ
+</string>
+                        </buttonCell>
+                        <connections>
+                            <action selector="buttonItemClicked_Append:" target="-2" id="nA8-kc-p2I"/>
+                        </connections>
+                    </button>
+                    <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="cDq-K2-M6M">
+                        <rect key="frame" x="783" y="13" width="76" height="32"/>
+                        <buttonCell key="cell" type="push" title="Cancel" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Uz2-68-OHs">
+                            <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                            <font key="font" metaFont="system"/>
+                            <string key="keyEquivalent" base64-UTF8="YES">
+Gw
+</string>
+                        </buttonCell>
+                        <connections>
+                            <action selector="buttonItemClicked_Cancel:" target="-2" id="PfF-XD-RE7"/>
+                        </connections>
+                    </button>
+                    <progressIndicator wantsLayer="YES" horizontalHuggingPriority="750" verticalHuggingPriority="750" maxValue="100" bezeled="NO" indeterminate="YES" controlSize="small" style="spinning" translatesAutoresizingMaskIntoConstraints="NO" id="Uex-2T-CgC">
+                        <rect key="frame" x="466" y="290" width="16" height="16"/>
+                    </progressIndicator>
+                    <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="efw-wZ-r7Y">
+                        <rect key="frame" x="33" y="550" width="94" height="32"/>
+                        <constraints>
+                            <constraint firstAttribute="width" constant="80" id="zDw-Vg-YiU"/>
+                        </constraints>
+                        <buttonCell key="cell" type="push" title="Add" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="PVV-Tc-yRt">
+                            <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                            <font key="font" metaFont="system"/>
+                        </buttonCell>
+                        <connections>
+                            <action selector="buttonItemClicked_AddFile:" target="-2" id="QfI-ip-i9z"/>
+                        </connections>
+                    </button>
+                    <box title="Box" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="SNg-B0-ys5">
+                        <rect key="frame" x="531" y="56" width="379" height="495"/>
+                        <view key="contentView" id="0Wa-d4-jxC">
+                            <rect key="frame" x="3" y="3" width="373" height="489"/>
+                            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                            <subviews>
+                                <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="KyV-U2-Jil">
+                                    <rect key="frame" x="14" y="453" width="61" height="18"/>
+                                    <buttonCell key="cell" type="radio" title="Radio" bezelStyle="regularSquare" imagePosition="left" alignment="left" state="on" inset="2" id="ozh-fs-0dm">
+                                        <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+                                        <font key="font" metaFont="system"/>
+                                    </buttonCell>
+                                    <connections>
+                                        <action selector="buttonClicked_ChooseSize:" target="-2" id="kfh-II-I8s"/>
+                                    </connections>
+                                </button>
+                                <button verticalHuggingPriority="750" tag="1" translatesAutoresizingMaskIntoConstraints="NO" id="djx-Wp-Ly9">
+                                    <rect key="frame" x="14" y="426" width="61" height="18"/>
+                                    <buttonCell key="cell" type="radio" title="Radio" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="ABF-am-tZt">
+                                        <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+                                        <font key="font" metaFont="system"/>
+                                    </buttonCell>
+                                    <connections>
+                                        <action selector="buttonClicked_ChooseSize:" target="-2" id="TDh-ZX-xrj"/>
+                                    </connections>
+                                </button>
+                                <button verticalHuggingPriority="750" tag="3" translatesAutoresizingMaskIntoConstraints="NO" id="T6f-rX-54f">
+                                    <rect key="frame" x="14" y="372" width="61" height="18"/>
+                                    <buttonCell key="cell" type="radio" title="Radio" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="DU3-mS-aFM">
+                                        <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+                                        <font key="font" metaFont="system"/>
+                                    </buttonCell>
+                                    <connections>
+                                        <action selector="buttonClicked_ChooseSize:" target="-2" id="YUP-KD-QhC"/>
+                                    </connections>
+                                </button>
+                                <button verticalHuggingPriority="750" tag="2" translatesAutoresizingMaskIntoConstraints="NO" id="pEb-Zq-aIJ">
+                                    <rect key="frame" x="14" y="399" width="61" height="18"/>
+                                    <buttonCell key="cell" type="radio" title="Radio" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="SGM-ye-BbG">
+                                        <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+                                        <font key="font" metaFont="system"/>
+                                    </buttonCell>
+                                    <connections>
+                                        <action selector="buttonClicked_ChooseSize:" target="-2" id="q3A-wB-oye"/>
+                                    </connections>
+                                </button>
+                                <button verticalHuggingPriority="750" tag="4" translatesAutoresizingMaskIntoConstraints="NO" id="Dbh-FL-cvn">
+                                    <rect key="frame" x="14" y="345" width="61" height="18"/>
+                                    <buttonCell key="cell" type="radio" title="Radio" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="1HW-mv-cj5">
+                                        <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+                                        <font key="font" metaFont="system"/>
+                                    </buttonCell>
+                                    <connections>
+                                        <action selector="buttonClicked_ChooseSize:" target="-2" id="6tA-Gi-yyN"/>
+                                    </connections>
+                                </button>
+                                <button verticalHuggingPriority="750" tag="5" translatesAutoresizingMaskIntoConstraints="NO" id="sRv-B4-8bK">
+                                    <rect key="frame" x="14" y="318" width="61" height="18"/>
+                                    <buttonCell key="cell" type="radio" title="Radio" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="VPb-Cv-oOC">
+                                        <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+                                        <font key="font" metaFont="system"/>
+                                    </buttonCell>
+                                    <connections>
+                                        <action selector="buttonClicked_ChooseSize:" target="-2" id="Elm-EU-BIl"/>
+                                    </connections>
+                                </button>
+                                <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="h32-rZ-jac">
+                                    <rect key="frame" x="36" y="294" width="60" height="22"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="22" id="0aD-4q-yXa"/>
+                                        <constraint firstAttribute="width" constant="60" id="crZ-gN-gek"/>
+                                    </constraints>
+                                    <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="center" drawsBackground="YES" id="5le-fL-zJ4">
+                                        <font key="font" metaFont="system"/>
+                                        <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                                        <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                    </textFieldCell>
+                                </textField>
+                                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="buB-SK-8mO">
+                                    <rect key="frame" x="102" y="297" width="11" height="16"/>
+                                    <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="x" id="4gU-Us-N60">
+                                        <font key="font" metaFont="system"/>
+                                        <color key="textColor" name="KM_242424_Color40"/>
+                                        <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+                                    </textFieldCell>
+                                </textField>
+                                <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1M5-tW-MRF">
+                                    <rect key="frame" x="119" y="294" width="60" height="22"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="60" id="NNi-a8-ugp"/>
+                                        <constraint firstAttribute="height" constant="22" id="UIu-wF-ft6"/>
+                                    </constraints>
+                                    <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="center" drawsBackground="YES" id="hth-64-6pz">
+                                        <font key="font" metaFont="system"/>
+                                        <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                                        <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                    </textFieldCell>
+                                </textField>
+                                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="m7b-I1-lQz">
+                                    <rect key="frame" x="182" y="297" width="27" height="16"/>
+                                    <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="mm" id="xDF-xV-HvN">
+                                        <font key="font" metaFont="system"/>
+                                        <color key="textColor" name="KM_242424_Color40"/>
+                                        <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+                                    </textFieldCell>
+                                </textField>
+                            </subviews>
+                            <constraints>
+                                <constraint firstItem="T6f-rX-54f" firstAttribute="leading" secondItem="KyV-U2-Jil" secondAttribute="leading" id="2XE-tE-vKT"/>
+                                <constraint firstItem="buB-SK-8mO" firstAttribute="centerY" secondItem="h32-rZ-jac" secondAttribute="centerY" id="3xu-9F-kAz"/>
+                                <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="KyV-U2-Jil" secondAttribute="trailing" id="56U-zl-kTu"/>
+                                <constraint firstItem="sRv-B4-8bK" firstAttribute="top" secondItem="Dbh-FL-cvn" secondAttribute="bottom" constant="11" id="5xw-9p-xC7"/>
+                                <constraint firstItem="h32-rZ-jac" firstAttribute="leading" secondItem="0Wa-d4-jxC" secondAttribute="leading" constant="36" id="6lm-4Q-nUp"/>
+                                <constraint firstItem="Dbh-FL-cvn" firstAttribute="top" secondItem="T6f-rX-54f" secondAttribute="bottom" constant="11" id="6zc-i0-bJ6"/>
+                                <constraint firstItem="T6f-rX-54f" firstAttribute="top" secondItem="pEb-Zq-aIJ" secondAttribute="bottom" constant="11" id="7od-T4-Q06"/>
+                                <constraint firstItem="m7b-I1-lQz" firstAttribute="centerY" secondItem="h32-rZ-jac" secondAttribute="centerY" id="9Jv-YW-mxe"/>
+                                <constraint firstItem="1M5-tW-MRF" firstAttribute="leading" secondItem="buB-SK-8mO" secondAttribute="trailing" constant="8" id="F4H-Pc-HKp"/>
+                                <constraint firstItem="Dbh-FL-cvn" firstAttribute="leading" secondItem="KyV-U2-Jil" secondAttribute="leading" id="HvZ-4i-VwG"/>
+                                <constraint firstItem="djx-Wp-Ly9" firstAttribute="leading" secondItem="KyV-U2-Jil" secondAttribute="leading" id="JXb-56-CaK"/>
+                                <constraint firstItem="pEb-Zq-aIJ" firstAttribute="leading" secondItem="KyV-U2-Jil" secondAttribute="leading" id="LfS-Oc-RUf"/>
+                                <constraint firstItem="pEb-Zq-aIJ" firstAttribute="top" secondItem="djx-Wp-Ly9" secondAttribute="bottom" constant="11" id="SH4-M3-J8Q"/>
+                                <constraint firstItem="buB-SK-8mO" firstAttribute="leading" secondItem="h32-rZ-jac" secondAttribute="trailing" constant="8" id="TP5-M2-iJZ"/>
+                                <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="T6f-rX-54f" secondAttribute="trailing" id="TQR-0Q-fuE"/>
+                                <constraint firstItem="1M5-tW-MRF" firstAttribute="centerY" secondItem="h32-rZ-jac" secondAttribute="centerY" id="UiJ-UO-ubD"/>
+                                <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="Dbh-FL-cvn" secondAttribute="trailing" id="WsP-KS-9R9"/>
+                                <constraint firstItem="sRv-B4-8bK" firstAttribute="leading" secondItem="KyV-U2-Jil" secondAttribute="leading" id="Za4-2A-pKe"/>
+                                <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="m7b-I1-lQz" secondAttribute="trailing" id="fEv-Af-YtF"/>
+                                <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="sRv-B4-8bK" secondAttribute="trailing" id="mUp-fO-2WQ"/>
+                                <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="pEb-Zq-aIJ" secondAttribute="trailing" id="oea-Sg-Avd"/>
+                                <constraint firstItem="h32-rZ-jac" firstAttribute="top" secondItem="sRv-B4-8bK" secondAttribute="bottom" constant="3" id="pP3-Be-L4d"/>
+                                <constraint firstItem="djx-Wp-Ly9" firstAttribute="top" secondItem="KyV-U2-Jil" secondAttribute="bottom" constant="11" id="pWl-9Y-l4v"/>
+                                <constraint firstItem="KyV-U2-Jil" firstAttribute="leading" secondItem="0Wa-d4-jxC" secondAttribute="leading" constant="16" id="sfJ-rG-RRI"/>
+                                <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="djx-Wp-Ly9" secondAttribute="trailing" id="vEe-lD-0Jo"/>
+                                <constraint firstItem="m7b-I1-lQz" firstAttribute="leading" secondItem="1M5-tW-MRF" secondAttribute="trailing" constant="5" id="wM8-8k-RHL"/>
+                                <constraint firstItem="m7b-I1-lQz" firstAttribute="centerY" secondItem="1M5-tW-MRF" secondAttribute="centerY" id="wlA-ln-yZn"/>
+                                <constraint firstItem="KyV-U2-Jil" firstAttribute="top" secondItem="0Wa-d4-jxC" secondAttribute="top" constant="19" id="xBn-7o-DqM"/>
+                            </constraints>
+                        </view>
+                    </box>
+                    <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="B6i-nd-oNy">
+                        <rect key="frame" x="532" y="558" width="37" height="18"/>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="18" id="Isi-Re-R0F"/>
+                        </constraints>
+                        <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="fBP-Wv-FZk">
+                            <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="YEl-By-aRx" firstAttribute="centerY" secondItem="cDq-K2-M6M" secondAttribute="centerY" id="2JM-5Y-xaF"/>
+                    <constraint firstItem="efw-wZ-r7Y" firstAttribute="leading" secondItem="Ggk-eO-LzC" secondAttribute="leading" id="3Ms-pF-92w"/>
+                    <constraint firstItem="SNg-B0-ys5" firstAttribute="top" secondItem="Ggk-eO-LzC" secondAttribute="top" id="EIV-N9-5mk"/>
+                    <constraint firstAttribute="bottom" secondItem="Ggk-eO-LzC" secondAttribute="bottom" constant="60" id="FmD-vC-lz3"/>
+                    <constraint firstItem="SNg-B0-ys5" firstAttribute="bottom" secondItem="Ggk-eO-LzC" secondAttribute="bottom" id="GbZ-tV-MXY"/>
+                    <constraint firstItem="Ggk-eO-LzC" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" constant="40" id="LEN-lk-9rV"/>
+                    <constraint firstItem="Zrt-3W-HbQ" firstAttribute="leading" secondItem="Ggk-eO-LzC" secondAttribute="leading" id="LHb-x4-Yzy"/>
+                    <constraint firstItem="efw-wZ-r7Y" firstAttribute="top" secondItem="se5-gp-TjO" secondAttribute="top" constant="19" id="QbT-yD-N7A"/>
+                    <constraint firstAttribute="trailing" secondItem="YEl-By-aRx" secondAttribute="trailing" constant="20" id="VZh-DF-M7D"/>
+                    <constraint firstItem="YEl-By-aRx" firstAttribute="leading" secondItem="cDq-K2-M6M" secondAttribute="trailing" constant="7" id="bpl-s3-hBh"/>
+                    <constraint firstAttribute="trailing" secondItem="SNg-B0-ys5" secondAttribute="trailing" constant="40" id="d0q-Hn-baS"/>
+                    <constraint firstItem="SNg-B0-ys5" firstAttribute="leading" secondItem="Ggk-eO-LzC" secondAttribute="trailing" constant="14" id="gNP-Dq-gpr"/>
+                    <constraint firstItem="B6i-nd-oNy" firstAttribute="leading" secondItem="SNg-B0-ys5" secondAttribute="leading" id="iGS-z2-cY0"/>
+                    <constraint firstItem="Uex-2T-CgC" firstAttribute="centerX" secondItem="se5-gp-TjO" secondAttribute="centerX" id="oIl-2n-ghc"/>
+                    <constraint firstAttribute="bottom" secondItem="YEl-By-aRx" secondAttribute="bottom" constant="20" id="pdc-GK-bLG"/>
+                    <constraint firstItem="Uex-2T-CgC" firstAttribute="centerY" secondItem="se5-gp-TjO" secondAttribute="centerY" id="t3J-uR-7G2"/>
+                    <constraint firstItem="Ggk-eO-LzC" firstAttribute="top" secondItem="efw-wZ-r7Y" secondAttribute="bottom" constant="8" id="xfl-Qb-QH3"/>
+                    <constraint firstItem="B6i-nd-oNy" firstAttribute="centerY" secondItem="efw-wZ-r7Y" secondAttribute="centerY" id="xid-xj-9OX"/>
+                    <constraint firstAttribute="bottom" secondItem="Zrt-3W-HbQ" secondAttribute="bottom" constant="20" id="yPE-8o-ux5"/>
+                </constraints>
+            </view>
+            <connections>
+                <outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
+            </connections>
+            <point key="canvasLocation" x="481.5" y="246.5"/>
+        </window>
+        <customView id="EEC-VI-dAb">
+            <rect key="frame" x="0.0" y="0.0" width="300" height="151"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="IqC-f7-Lnl">
+                    <rect key="frame" x="85" y="21" width="130" height="130"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="130" id="XFM-Ht-WVP"/>
+                        <constraint firstAttribute="width" constant="130" id="yRj-eN-lTo"/>
+                    </constraints>
+                    <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="KMImageNameEmptyFile" id="pVm-Ye-CAM"/>
+                </imageView>
+                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1dO-kv-PuF">
+                    <rect key="frame" x="-2" y="0.0" width="304" height="16"/>
+                    <constraints>
+                        <constraint firstAttribute="width" constant="300" id="DGQ-Lx-g1U"/>
+                    </constraints>
+                    <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="center" title="No file added. Click &quot;Add&quot; to continue." id="yYu-jg-Dfs">
+                        <font key="font" metaFont="system"/>
+                        <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                        <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+                    </textFieldCell>
+                </textField>
+            </subviews>
+            <constraints>
+                <constraint firstItem="IqC-f7-Lnl" firstAttribute="centerX" secondItem="EEC-VI-dAb" secondAttribute="centerX" id="9fR-st-jS0"/>
+                <constraint firstItem="IqC-f7-Lnl" firstAttribute="top" secondItem="EEC-VI-dAb" secondAttribute="top" id="DwE-sG-73z"/>
+                <constraint firstItem="1dO-kv-PuF" firstAttribute="leading" secondItem="EEC-VI-dAb" secondAttribute="leading" id="JXC-IZ-QdN"/>
+                <constraint firstAttribute="trailing" secondItem="1dO-kv-PuF" secondAttribute="trailing" id="QwC-pm-aSq"/>
+                <constraint firstAttribute="bottom" secondItem="1dO-kv-PuF" secondAttribute="bottom" id="flM-aT-lzx"/>
+                <constraint firstItem="1dO-kv-PuF" firstAttribute="top" secondItem="IqC-f7-Lnl" secondAttribute="bottom" constant="5" id="tRO-pf-Sm1"/>
+            </constraints>
+            <point key="canvasLocation" x="87" y="-266"/>
+        </customView>
+        <customView id="Bxz-CR-NgQ" customClass="KMBlankView">
+            <rect key="frame" x="0.0" y="0.0" width="770" height="419"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <customView translatesAutoresizingMaskIntoConstraints="NO" id="h67-mo-mZ1">
+                    <rect key="frame" x="248" y="116" width="275" height="188"/>
+                    <subviews>
+                        <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="t1l-8E-kYD">
+                            <rect key="frame" x="67" y="48" width="140" height="140"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="140" id="ohT-2c-1nR"/>
+                                <constraint firstAttribute="height" constant="140" id="zC5-ij-Qwj"/>
+                            </constraints>
+                            <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="KMImageNameEmptyListNor" id="EWq-IE-D3x"/>
+                        </imageView>
+                        <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="YH7-eM-Mb2">
+                            <rect key="frame" x="91" y="32" width="92" height="16"/>
+                            <textFieldCell key="cell" title="Multiline Label" id="KRo-Gz-2n3">
+                                <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 verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="loI-T9-Pz8">
+                            <rect key="frame" x="89" y="8" width="96" height="16"/>
+                            <textFieldCell key="cell" alignment="center" title="Multiline Label" id="PzF-HN-Jsi">
+                                <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>
+                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="yde-fB-mTL" customClass="KMPDFEditAppendCustomView">
+                            <rect key="frame" x="0.0" y="0.0" width="275" height="188"/>
+                        </customView>
+                    </subviews>
+                    <constraints>
+                        <constraint firstItem="t1l-8E-kYD" firstAttribute="centerX" secondItem="h67-mo-mZ1" secondAttribute="centerX" id="4iH-n5-pFE"/>
+                        <constraint firstItem="t1l-8E-kYD" firstAttribute="top" secondItem="h67-mo-mZ1" secondAttribute="top" id="CP1-ys-0NX"/>
+                        <constraint firstItem="YH7-eM-Mb2" firstAttribute="centerX" secondItem="h67-mo-mZ1" secondAttribute="centerX" id="Gxz-2u-WTF"/>
+                        <constraint firstAttribute="bottom" secondItem="yde-fB-mTL" secondAttribute="bottom" id="HER-UR-l1m"/>
+                        <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="loI-T9-Pz8" secondAttribute="trailing" id="Jaz-ML-ErA"/>
+                        <constraint firstAttribute="trailing" secondItem="yde-fB-mTL" secondAttribute="trailing" id="PXy-Zk-Odl"/>
+                        <constraint firstItem="loI-T9-Pz8" firstAttribute="centerX" secondItem="h67-mo-mZ1" secondAttribute="centerX" id="Q6Z-sZ-aV5"/>
+                        <constraint firstItem="yde-fB-mTL" firstAttribute="top" secondItem="h67-mo-mZ1" secondAttribute="top" id="Zw8-rC-Vir"/>
+                        <constraint firstItem="YH7-eM-Mb2" firstAttribute="top" secondItem="t1l-8E-kYD" secondAttribute="bottom" id="ggr-Dl-gbb"/>
+                        <constraint firstItem="loI-T9-Pz8" firstAttribute="top" secondItem="YH7-eM-Mb2" secondAttribute="bottom" constant="8" id="kBC-ma-7G2"/>
+                        <constraint firstAttribute="bottom" secondItem="loI-T9-Pz8" secondAttribute="bottom" constant="8" id="kVL-N3-yfm"/>
+                        <constraint firstAttribute="width" constant="275" id="nKK-U8-7fX"/>
+                        <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="YH7-eM-Mb2" secondAttribute="trailing" id="x3g-rc-dzz"/>
+                        <constraint firstItem="yde-fB-mTL" firstAttribute="leading" secondItem="h67-mo-mZ1" secondAttribute="leading" id="zGa-U9-Ahz"/>
+                    </constraints>
+                </customView>
+            </subviews>
+            <constraints>
+                <constraint firstItem="h67-mo-mZ1" firstAttribute="centerX" secondItem="Bxz-CR-NgQ" secondAttribute="centerX" id="QIV-Ne-18k"/>
+                <constraint firstItem="h67-mo-mZ1" firstAttribute="centerY" secondItem="Bxz-CR-NgQ" secondAttribute="centerY" id="p7U-T9-Ar7"/>
+            </constraints>
+            <connections>
+                <outlet property="customView" destination="yde-fB-mTL" id="UIb-V0-7ai"/>
+                <outlet property="imageView" destination="t1l-8E-kYD" id="dtz-Tg-gUG"/>
+                <outlet property="secondTitleLabel" destination="loI-T9-Pz8" id="XSV-VX-aVh"/>
+                <outlet property="titleLabel" destination="YH7-eM-Mb2" id="7Cf-Yu-NGQ"/>
+            </connections>
+            <point key="canvasLocation" x="-156" y="835"/>
+        </customView>
+    </objects>
+    <resources>
+        <image name="KMImageNameEmptyFile" width="130" height="130"/>
+        <image name="KMImageNameEmptyListNor" width="200" height="200"/>
+        <image name="KMImageNameUXIconBtnCloseNor" width="16" height="16"/>
+        <image name="NSAdvanced" width="32" height="32"/>
+        <namedColor name="KM_242424_Color40">
+            <color red="0.14100000262260437" green="0.14100000262260437" blue="0.14100000262260437" alpha="0.40000000596046448" colorSpace="custom" customColorSpace="sRGB"/>
+        </namedColor>
+    </resources>
+</document>

+ 16 - 0
PDF Office/PDF Office/Class/Merge/OCPart/KMSavePanelAccessoryController.h

@@ -0,0 +1,16 @@
+//
+//  KMSavePanelAccessoryController.h
+//  PDF Reader
+//
+//  Created by 蒋志鹏 on 2018/9/26.
+//  Copyright © 2018年 Kdan Mobile. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+static NSString *KMAutoOpenDocumentKey = @"KMAutoOpenDocumentKey";
+@interface KMSavePanelAccessoryController : NSViewController
+
+@property (assign) IBOutlet NSButton *openAutomaticButton;
+
+@end

+ 46 - 0
PDF Office/PDF Office/Class/Merge/OCPart/KMSavePanelAccessoryController.m

@@ -0,0 +1,46 @@
+//
+//  KMSavePanelAccessoryController.m
+//  PDF Reader
+//
+//  Created by 蒋志鹏 on 2018/9/26.
+//  Copyright © 2018年 Kdan Mobile. All rights reserved.
+//
+
+#import "KMSavePanelAccessoryController.h"
+
+@interface KMSavePanelAccessoryController ()
+
+@end
+
+@implementation KMSavePanelAccessoryController
+
+-  (instancetype)init
+{
+    self = [super initWithNibName:@"KMSavePanelAccessoryController" bundle:nil];
+    if (self) {
+        
+    }
+    return self;
+    
+}
+
+- (void)awakeFromNib
+{
+    [super awakeFromNib];
+    self.openAutomaticButton.title = NSLocalizedString(@"Open the document after saving", nil);
+      NSUserDefaults *standUserDefault = [NSUserDefaults standardUserDefaults];
+    BOOL autoOpen = [standUserDefault boolForKey:KMAutoOpenDocumentKey];
+    if (autoOpen) {
+        self.openAutomaticButton.state = NSControlStateValueOn;
+    } else {
+        self.openAutomaticButton.state = NSControlStateValueOff;
+    }
+}
+
+- (IBAction)buttonClicked_OpenAutomatic:(NSButton *)sender
+{
+    NSUserDefaults *standUserDefault = [NSUserDefaults standardUserDefaults];
+    [standUserDefault setBool:sender.state == NSControlStateValueOn ? YES : NO forKey:KMAutoOpenDocumentKey];
+    [standUserDefault synchronize];
+}
+@end

+ 40 - 0
PDF Office/PDF Office/Class/Merge/OCPart/KMSavePanelAccessoryController.xib

@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14113" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14113"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMSavePanelAccessoryController">
+            <connections>
+                <outlet property="openAutomaticButton" destination="NPu-wD-FJY" id="sB2-tM-cdd"/>
+                <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="362" height="54"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="NPu-wD-FJY">
+                    <rect key="frame" x="122" y="18" width="119" height="18"/>
+                    <buttonCell key="cell" type="check" title="Open automatic" bezelStyle="regularSquare" imagePosition="left" inset="2" id="gER-AG-REK">
+                        <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+                        <font key="font" metaFont="system"/>
+                    </buttonCell>
+                    <connections>
+                        <action selector="buttonClicked_OpenAutomatic:" target="-2" id="cKP-VT-hpX"/>
+                    </connections>
+                </button>
+            </subviews>
+            <constraints>
+                <constraint firstAttribute="bottom" secondItem="NPu-wD-FJY" secondAttribute="bottom" constant="20" id="14V-oS-oH9"/>
+                <constraint firstItem="NPu-wD-FJY" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="20" id="SpB-Zt-3AX"/>
+                <constraint firstItem="NPu-wD-FJY" firstAttribute="centerX" secondItem="Hz6-mo-xeY" secondAttribute="centerX" id="gm7-cV-AaZ"/>
+            </constraints>
+            <point key="canvasLocation" x="170" y="47"/>
+        </customView>
+    </objects>
+</document>

+ 16 - 0
PDF Office/PDF Office/Class/Merge/OCPart/KMTableRowView.h

@@ -0,0 +1,16 @@
+//
+//  KMTableRowView.h
+//  PDF Reader Pro Edition
+//
+//  Created by zhipeng jiang on 2020/11/25.
+//
+
+#import <Cocoa/Cocoa.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KMTableRowView : NSTableRowView
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 44 - 0
PDF Office/PDF Office/Class/Merge/OCPart/KMTableRowView.m

@@ -0,0 +1,44 @@
+//
+//  KMTableRowView.m
+//  PDF Reader Pro Edition
+//
+//  Created by zhipeng jiang on 2020/11/25.
+//
+
+#import "KMTableRowView.h"
+
+@implementation KMTableRowView
+
+
+#pragma mark - init Methods
+
+- (instancetype)init {
+    self = [super init];
+    if (self) {
+        [self addTrackingArea];
+    }
+    return self;
+}
+
+#pragma mark - Private Methods
+
+- (void)addTrackingArea {
+    NSTrackingArea *trackingArea = [[NSTrackingArea alloc] initWithRect:self.bounds options:NSTrackingMouseEnteredAndExited | NSTrackingInVisibleRect | NSTrackingActiveAlways |NSTrackingMouseMoved owner:self userInfo:nil];
+    [self addTrackingArea:trackingArea];
+//    [trackingArea release];
+}
+
+- (void)drawSelectionInRect:(NSRect)dirtyRect {
+    NSRect selectionRect = self.bounds;
+//    [[KMAppearance KMColor_Status_Sel] setFill];
+    /// [self colorFromHexString:@"#4982E6" alpha:0.2];
+    [[NSColor lightGrayColor] setFill];
+    NSBezierPath *selectionPath = [NSBezierPath bezierPathWithRoundedRect:selectionRect xRadius:0 yRadius:0];
+    [selectionPath fill];
+}
+
+- (void)mouseEntered:(NSEvent *)event {
+    [super mouseEntered:event];
+}
+
+@end

+ 2 - 0
PDF Office/PDF Office/Class/PDFTools/Convert/Controller/KMConvertBaseWindowController.swift

@@ -93,6 +93,8 @@ class KMConvertBaseWindowController: NSWindowController {
     private var maskView: NSButton!
     private var indicator: NSProgressIndicator!
     
+    var subType: Int = 0
+    
     override func windowDidLoad() {
         super.windowDidLoad()
         

+ 19 - 2
PDF Office/PDF Office/Class/PDFTools/Convert/Controller/KMConvertPPTsWindowController.swift

@@ -12,7 +12,16 @@ class KMConvertPPTsWindowController: KMConvertBaseWindowController {
     override func windowDidLoad() {
         super.windowDidLoad()
 
-        titleLabel.stringValue = NSLocalizedString("PDF转PPT", comment: "")
+        if (self.subType == 1) {
+            titleLabel.stringValue = NSLocalizedString("PDF转PPT", comment: "")
+        } else if (self.subType == 2) {
+            titleLabel.stringValue = NSLocalizedString("PDF转RTF", comment: "")
+        } else if (self.subType == 3) {
+            titleLabel.stringValue = NSLocalizedString("PDF转HTML", comment: "")
+        } else if (self.subType == 4) {
+            titleLabel.stringValue = NSLocalizedString("PDF转Text", comment: "")
+        }
+        
         let view = KMConvertPPTsSettingView.createFromNib()
         view?.frame = rightScrollView.bounds
         view?.autoresizingMask = NSView.AutoresizingMask(rawValue: 18)
@@ -42,7 +51,15 @@ class KMConvertPPTsWindowController: KMConvertBaseWindowController {
     }
     
     override func convertModelAppendParams(convert: KMPDFConvert) {
-        convert.convertType = .ppt
+        if (self.subType == 1) {
+            convert.convertType = .ppt
+        } else if (self.subType == 2) {
+            convert.convertType = .rtf
+        } else if (self.subType == 3) {
+            convert.convertType = .html
+        } else if (self.subType == 4) {
+            convert.convertType = .text
+        }
     }
     
 }

+ 2 - 0
PDF Office/PDF Office/Class/PDFWindowController/Toolbar/KMToolbarController.swift

@@ -332,6 +332,8 @@ extension KMToolbarController: KMToolbarViewControllerDelegate {
             menu.popUp(positioning: nil, at: NSPoint(x: 0, y: -10), in: toolbarItem)
         } else if ((KMToolbarType.word.rawValue ... KMToolbarType.conversion_image.rawValue).contains(clickChaildToolType.rawValue)) { /// 转档
             self.delegate?.clickChildTool?(type: clickChaildToolType, index: 0)
+        } else if (clickChaildToolType == .merge) {
+            self.delegate?.clickChildTool?(type: clickChaildToolType, index: 0)
         }
     }
 }

+ 18 - 0
PDF Office/PDF Office/Class/PDFWindowController/Toolbar/KMToolbarViewController.swift

@@ -172,6 +172,10 @@ class KMToolbarViewController: NSViewController {
         }
         self.delegate?.toolbarViewController?(self, clickChaildToolType: type, toolbar: item)
     }
+    
+    @objc func mergeMenuItemAction(sender: KMToolbarClickButton) {
+        self.delegate?.toolbarViewController?(self, clickChaildToolType: .merge, toolbar: sender.clickObject as! KMToolBoxItem)
+    }
 }
 
 extension KMToolbarViewController : KMNewToolbarDelegate {
@@ -223,6 +227,7 @@ extension KMToolbarViewController : KMNewToolbarDelegate {
             return []
         case .Tool:
             return [KMToolbarToolCompressItemIdentifier,
+                    KMToolbarToolMergeItemIdentifier,
                     KMToolbarToolSecureItemIdentifier,
                     KMToolbarToolRedactItemIdentifier,
                     KMToolbarToolWatermarkItemIdentifier,
@@ -1022,6 +1027,19 @@ extension KMToolbarViewController : KMNewToolbarDelegate {
                 let menuItem = NSMenuItem.init(title: "PDF转图片", action: #selector(conversionMenuItemAction), target: self)
                 menuItem?.tag = item!.btnTag
                 item?.menuFormRepresentation = menuItem
+            } else if identifier == KMToolbarToolMergeItemIdentifier {
+                item?.image = NSImage(named: "KMImageNameMainToolbarrRight")
+                item?.alternateImage = NSImage(named: "KMImageNameMainToolbarrRight")
+                item?.target = self
+                item?.btnTag = KMToolbarType.merge.rawValue
+                item?.toolTip = NSLocalizedString("合并", comment: "")
+                item?.titleName = NSLocalizedString("合并", comment: "")
+                item?.boxImagePosition = KMToolBoxImagePosition.left
+                item?.btnAction = #selector(mergeMenuItemAction)
+                
+                let menuItem = NSMenuItem.init(title: "合并", action: #selector(mergeMenuItemAction), target: self)
+                menuItem?.tag = item!.btnTag
+                item?.menuFormRepresentation = menuItem
             }
         }
         return item

+ 1 - 0
PDF Office/PDF Office/Class/PDFWindowController/Toolbar/PublicKey.swift

@@ -80,6 +80,7 @@ let KMToolbarToolWatermarkItemIdentifier =  "KMToolbarToolWatermarkItemIdentifie
 let KMToolbarToolRedactItemIdentifier =  "KMToolbarToolRedactItemIdentifier"
 let KMToolbarToolCompressItemIdentifier =  "KMToolbarToolCompressItemIdentifier"
 let KMToolbarToolSecureItemIdentifier =  "KMToolbarToolSecureItemIdentifier"
+let KMToolbarToolMergeItemIdentifier =  "KMToolbarToolMergeItemIdentifier"
 
 /// Form
 let KMToolbarToolTextFieldItemIdentifier =  "KMToolbarToolTextFieldItemIdentifier"

+ 17 - 0
PDF Office/PDF Office/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift

@@ -1006,6 +1006,15 @@ extension KMMainViewController : KMMainToolbarControllerDelegate {
                 windowController = KMConvertExcelWindowController(windowNibName: "KMConvertBaseWindowController")
             } else if (type == .ppt || type == .rtf || type == .html || type == .conversion_text) {
                 windowController = KMConvertPPTsWindowController(windowNibName: "KMConvertBaseWindowController")
+                if (type == .ppt) {
+                    windowController.subType = 1
+                } else if (type == .rtf) {
+                    windowController.subType = 2
+                } else if (type == .html) {
+                    windowController.subType = 3
+                } else if (type == .conversion_text) {
+                    windowController.subType = 4
+                }
             } else if (type == .csv) {
                 windowController = KMConvertCSVWindowController(windowNibName: "KMConvertBaseWindowController")
             } else if (type == .conversion_image) {
@@ -1031,6 +1040,14 @@ extension KMMainViewController : KMMainToolbarControllerDelegate {
             return
         }
         
+        if (type == .merge) { /// 合并
+            let windowController = KMPDFEditAppendWindow(pdfDocument: self.listView.document)
+            windowController?.beginSheetModal(for: self.view.window, completionHandler: { [weak self] result, selectedIndexSet in
+                self!.listView.layoutDocumentView()
+            })
+            return
+        }
+        
         if (type == .crop) {
             if (index == 1) {
                 self.cropCurrentPage()

+ 1 - 0
PDF Office/PDF Office/PDF Office DMG-Bridging-Header.h

@@ -22,3 +22,4 @@
 #import "KMAnnotationPropertiesViewController.h"
 #import "TextFieldFormatter.h"
 #import "CustomAlertView.h"
+#import "KMPDFEditAppendWindow.h"

+ 1 - 0
PDF Office/PDF Office/PDF Office Pro-Bridging-Header.h

@@ -22,4 +22,5 @@
 #import "KMAnnotationPropertiesViewController.h"
 #import "TextFieldFormatter.h"
 #import "CustomAlertView.h"
+#import "KMPDFEditAppendWindow.h"
 

+ 1 - 0
PDF Office/PDF Office/PDF Office-Bridging-Header.h

@@ -33,4 +33,5 @@
 #import <Masonry/Masonry.h>
 #import "TextFieldFormatter.h"
 #import "CustomAlertView.h"
+#import "KMPDFEditAppendWindow.h"