Przeglądaj źródła

【PDF工具 - 批量】Convert PDF - PDF 转excel 接口调试

lizhe 2 lat temu
rodzic
commit
61747bfa01
19 zmienionych plików z 1387 dodań i 345 usunięć
  1. 144 0
      PDF Office/PDF Office.xcodeproj/project.pbxproj
  2. 29 92
      PDF Office/PDF Office.xcodeproj/xcuserdata/lizhe.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
  3. 2 2
      PDF Office/PDF Office/Class/Home/ViewController/KMHomeHistoryFileViewController.swift
  4. 12 7
      PDF Office/PDF Office/Class/PDFTools/Batch/Tool/KMImageTitleButton/KMImageTitleButton.xib
  5. 154 111
      PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/KMBatchConvertPDFView.swift
  6. 10 128
      PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/KMBatchConvertPDFView.xib
  7. 37 2
      PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Model/KMBatchConvertPDFViewModel.swift
  8. 94 3
      PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Presenter/KMBatchConvertPDFViewPresenter.swift
  9. 26 0
      PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Views/Base/KMBatchConvertPDFItemView.swift
  10. 130 0
      PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Views/Excel/KMBatchConverPDFExcelView.swift
  11. 154 0
      PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Views/Excel/KMBatchConverPDFExcelView.xib
  12. 93 0
      PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Views/Image/KMBatchConverPDFImageView.swift
  13. 18 0
      PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Views/Image/KMBatchConverPDFImageView.xib
  14. 93 0
      PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Views/PPT/KMBatchConverPDFPPTView.swift
  15. 18 0
      PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Views/PPT/KMBatchConverPDFPPTView.xib
  16. 87 0
      PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Views/TextRecognition/KMBatchTextRecognitionView.swift
  17. 113 0
      PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Views/TextRecognition/KMBatchTextRecognitionView.xib
  18. 92 0
      PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Views/Word/KMBatchConverPDFWordView.swift
  19. 81 0
      PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Views/Word/KMBatchConverPDFWordView.xib

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

@@ -1075,6 +1075,39 @@
 		ADBA0464292CB90B00BF9184 /* KMBatchProcessingTableRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADBA0463292CB90B00BF9184 /* KMBatchProcessingTableRowView.swift */; };
 		ADBA0465292CB90B00BF9184 /* KMBatchProcessingTableRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADBA0463292CB90B00BF9184 /* KMBatchProcessingTableRowView.swift */; };
 		ADBA0466292CB90B00BF9184 /* KMBatchProcessingTableRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADBA0463292CB90B00BF9184 /* KMBatchProcessingTableRowView.swift */; };
+		ADC075B629866962006C752F /* KMBatchConverPDFWordView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC075B529866962006C752F /* KMBatchConverPDFWordView.swift */; };
+		ADC075B729866962006C752F /* KMBatchConverPDFWordView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC075B529866962006C752F /* KMBatchConverPDFWordView.swift */; };
+		ADC075B829866962006C752F /* KMBatchConverPDFWordView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC075B529866962006C752F /* KMBatchConverPDFWordView.swift */; };
+		ADC075BA29866984006C752F /* KMBatchConverPDFWordView.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADC075B929866984006C752F /* KMBatchConverPDFWordView.xib */; };
+		ADC075BB29866984006C752F /* KMBatchConverPDFWordView.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADC075B929866984006C752F /* KMBatchConverPDFWordView.xib */; };
+		ADC075BC29866984006C752F /* KMBatchConverPDFWordView.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADC075B929866984006C752F /* KMBatchConverPDFWordView.xib */; };
+		ADC075C029866AE6006C752F /* KMBatchTextRecognitionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC075BF29866AE6006C752F /* KMBatchTextRecognitionView.swift */; };
+		ADC075C129866AE6006C752F /* KMBatchTextRecognitionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC075BF29866AE6006C752F /* KMBatchTextRecognitionView.swift */; };
+		ADC075C229866AE6006C752F /* KMBatchTextRecognitionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC075BF29866AE6006C752F /* KMBatchTextRecognitionView.swift */; };
+		ADC075C429866B05006C752F /* KMBatchTextRecognitionView.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADC075C329866B05006C752F /* KMBatchTextRecognitionView.xib */; };
+		ADC075C529866B05006C752F /* KMBatchTextRecognitionView.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADC075C329866B05006C752F /* KMBatchTextRecognitionView.xib */; };
+		ADC075C629866B05006C752F /* KMBatchTextRecognitionView.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADC075C329866B05006C752F /* KMBatchTextRecognitionView.xib */; };
+		ADC075CA29866DDC006C752F /* KMBatchConvertPDFItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC075C929866DDC006C752F /* KMBatchConvertPDFItemView.swift */; };
+		ADC075CB29866DDC006C752F /* KMBatchConvertPDFItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC075C929866DDC006C752F /* KMBatchConvertPDFItemView.swift */; };
+		ADC075CC29866DDC006C752F /* KMBatchConvertPDFItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC075C929866DDC006C752F /* KMBatchConvertPDFItemView.swift */; };
+		ADC075CF29875F49006C752F /* KMBatchConverPDFExcelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC075CE29875F49006C752F /* KMBatchConverPDFExcelView.swift */; };
+		ADC075D029875F49006C752F /* KMBatchConverPDFExcelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC075CE29875F49006C752F /* KMBatchConverPDFExcelView.swift */; };
+		ADC075D129875F49006C752F /* KMBatchConverPDFExcelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC075CE29875F49006C752F /* KMBatchConverPDFExcelView.swift */; };
+		ADC075D329875F6A006C752F /* KMBatchConverPDFExcelView.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADC075D229875F6A006C752F /* KMBatchConverPDFExcelView.xib */; };
+		ADC075D429875F6A006C752F /* KMBatchConverPDFExcelView.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADC075D229875F6A006C752F /* KMBatchConverPDFExcelView.xib */; };
+		ADC075D529875F6A006C752F /* KMBatchConverPDFExcelView.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADC075D229875F6A006C752F /* KMBatchConverPDFExcelView.xib */; };
+		ADC075D929876612006C752F /* KMBatchConverPDFPPTView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC075D829876612006C752F /* KMBatchConverPDFPPTView.swift */; };
+		ADC075DA29876612006C752F /* KMBatchConverPDFPPTView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC075D829876612006C752F /* KMBatchConverPDFPPTView.swift */; };
+		ADC075DB29876612006C752F /* KMBatchConverPDFPPTView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC075D829876612006C752F /* KMBatchConverPDFPPTView.swift */; };
+		ADC075DD29876622006C752F /* KMBatchConverPDFPPTView.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADC075DC29876622006C752F /* KMBatchConverPDFPPTView.xib */; };
+		ADC075DE29876622006C752F /* KMBatchConverPDFPPTView.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADC075DC29876622006C752F /* KMBatchConverPDFPPTView.xib */; };
+		ADC075DF29876622006C752F /* KMBatchConverPDFPPTView.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADC075DC29876622006C752F /* KMBatchConverPDFPPTView.xib */; };
+		ADC075E1298766D9006C752F /* KMBatchConverPDFImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC075E0298766D9006C752F /* KMBatchConverPDFImageView.swift */; };
+		ADC075E2298766D9006C752F /* KMBatchConverPDFImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC075E0298766D9006C752F /* KMBatchConverPDFImageView.swift */; };
+		ADC075E3298766D9006C752F /* KMBatchConverPDFImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC075E0298766D9006C752F /* KMBatchConverPDFImageView.swift */; };
+		ADC075E5298766E6006C752F /* KMBatchConverPDFImageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADC075E4298766E6006C752F /* KMBatchConverPDFImageView.xib */; };
+		ADC075E6298766E6006C752F /* KMBatchConverPDFImageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADC075E4298766E6006C752F /* KMBatchConverPDFImageView.xib */; };
+		ADC075E7298766E6006C752F /* KMBatchConverPDFImageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADC075E4298766E6006C752F /* KMBatchConverPDFImageView.xib */; };
 		ADC25DF92923BA710080A3F6 /* KMImageToPDFWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC25DF72923BA710080A3F6 /* KMImageToPDFWindowController.swift */; };
 		ADC25DFA2923BA710080A3F6 /* KMImageToPDFWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC25DF72923BA710080A3F6 /* KMImageToPDFWindowController.swift */; };
 		ADC25DFB2923BA710080A3F6 /* KMImageToPDFWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC25DF72923BA710080A3F6 /* KMImageToPDFWindowController.swift */; };
@@ -2648,6 +2681,17 @@
 		ADB2D6F8294882AE0029D2B3 /* KMTextFieldStepperView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMTextFieldStepperView.swift; sourceTree = "<group>"; };
 		ADB2D6FC294882B70029D2B3 /* KMTextFieldStepperView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMTextFieldStepperView.xib; sourceTree = "<group>"; };
 		ADBA0463292CB90B00BF9184 /* KMBatchProcessingTableRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBatchProcessingTableRowView.swift; sourceTree = "<group>"; };
+		ADC075B529866962006C752F /* KMBatchConverPDFWordView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBatchConverPDFWordView.swift; sourceTree = "<group>"; };
+		ADC075B929866984006C752F /* KMBatchConverPDFWordView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMBatchConverPDFWordView.xib; sourceTree = "<group>"; };
+		ADC075BF29866AE6006C752F /* KMBatchTextRecognitionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBatchTextRecognitionView.swift; sourceTree = "<group>"; };
+		ADC075C329866B05006C752F /* KMBatchTextRecognitionView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMBatchTextRecognitionView.xib; sourceTree = "<group>"; };
+		ADC075C929866DDC006C752F /* KMBatchConvertPDFItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBatchConvertPDFItemView.swift; sourceTree = "<group>"; };
+		ADC075CE29875F49006C752F /* KMBatchConverPDFExcelView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBatchConverPDFExcelView.swift; sourceTree = "<group>"; };
+		ADC075D229875F6A006C752F /* KMBatchConverPDFExcelView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMBatchConverPDFExcelView.xib; sourceTree = "<group>"; };
+		ADC075D829876612006C752F /* KMBatchConverPDFPPTView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBatchConverPDFPPTView.swift; sourceTree = "<group>"; };
+		ADC075DC29876622006C752F /* KMBatchConverPDFPPTView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMBatchConverPDFPPTView.xib; sourceTree = "<group>"; };
+		ADC075E0298766D9006C752F /* KMBatchConverPDFImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBatchConverPDFImageView.swift; sourceTree = "<group>"; };
+		ADC075E4298766E6006C752F /* KMBatchConverPDFImageView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMBatchConverPDFImageView.xib; sourceTree = "<group>"; };
 		ADC25DF72923BA710080A3F6 /* KMImageToPDFWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMImageToPDFWindowController.swift; sourceTree = "<group>"; };
 		ADC25DF82923BA710080A3F6 /* KMImageToPDFWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMImageToPDFWindowController.xib; sourceTree = "<group>"; };
 		ADC6FC18297630BA00D7C274 /* KMBatchProcessingColumnHeaderCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBatchProcessingColumnHeaderCell.swift; sourceTree = "<group>"; };
@@ -4177,6 +4221,7 @@
 		ADB1FE652975211700ED072D /* ConvertPDF */ = {
 			isa = PBXGroup;
 			children = (
+				ADC075B42986693E006C752F /* Views */,
 				ADE614A12977951000F62ED7 /* Model */,
 				ADE614A02977950A00F62ED7 /* Presenter */,
 				ADB1FE6D29752BB700ED072D /* KMBatchConvertPDFView.swift */,
@@ -4299,6 +4344,72 @@
 			path = KMTextFieldStepperView;
 			sourceTree = "<group>";
 		};
+		ADC075B42986693E006C752F /* Views */ = {
+			isa = PBXGroup;
+			children = (
+				ADC075D7298765ED006C752F /* Image */,
+				ADC075D6298765E3006C752F /* PPT */,
+				ADC075CD29875BCF006C752F /* Excel */,
+				ADC075C829866DCC006C752F /* Base */,
+				ADC075BE29866AA5006C752F /* TextRecognition */,
+				ADC075BD29866A9E006C752F /* Word */,
+			);
+			path = Views;
+			sourceTree = "<group>";
+		};
+		ADC075BD29866A9E006C752F /* Word */ = {
+			isa = PBXGroup;
+			children = (
+				ADC075B529866962006C752F /* KMBatchConverPDFWordView.swift */,
+				ADC075B929866984006C752F /* KMBatchConverPDFWordView.xib */,
+			);
+			path = Word;
+			sourceTree = "<group>";
+		};
+		ADC075BE29866AA5006C752F /* TextRecognition */ = {
+			isa = PBXGroup;
+			children = (
+				ADC075BF29866AE6006C752F /* KMBatchTextRecognitionView.swift */,
+				ADC075C329866B05006C752F /* KMBatchTextRecognitionView.xib */,
+			);
+			path = TextRecognition;
+			sourceTree = "<group>";
+		};
+		ADC075C829866DCC006C752F /* Base */ = {
+			isa = PBXGroup;
+			children = (
+				ADC075C929866DDC006C752F /* KMBatchConvertPDFItemView.swift */,
+			);
+			path = Base;
+			sourceTree = "<group>";
+		};
+		ADC075CD29875BCF006C752F /* Excel */ = {
+			isa = PBXGroup;
+			children = (
+				ADC075CE29875F49006C752F /* KMBatchConverPDFExcelView.swift */,
+				ADC075D229875F6A006C752F /* KMBatchConverPDFExcelView.xib */,
+			);
+			path = Excel;
+			sourceTree = "<group>";
+		};
+		ADC075D6298765E3006C752F /* PPT */ = {
+			isa = PBXGroup;
+			children = (
+				ADC075D829876612006C752F /* KMBatchConverPDFPPTView.swift */,
+				ADC075DC29876622006C752F /* KMBatchConverPDFPPTView.xib */,
+			);
+			path = PPT;
+			sourceTree = "<group>";
+		};
+		ADC075D7298765ED006C752F /* Image */ = {
+			isa = PBXGroup;
+			children = (
+				ADC075E0298766D9006C752F /* KMBatchConverPDFImageView.swift */,
+				ADC075E4298766E6006C752F /* KMBatchConverPDFImageView.xib */,
+			);
+			path = Image;
+			sourceTree = "<group>";
+		};
 		ADC25DF12923BA0D0080A3F6 /* ImageToPDF */ = {
 			isa = PBXGroup;
 			children = (
@@ -6011,6 +6122,7 @@
 				ADB1FE35297008F400ED072D /* KMBatchCollectionView.xib in Resources */,
 				9FBA0EF128FFC716001117AF /* KMHomeFastToolViewController.xib in Resources */,
 				899700F928F4051B009AF911 /* KMAnnotationViewController.xib in Resources */,
+				ADC075BA29866984006C752F /* KMBatchConverPDFWordView.xib in Resources */,
 				ADCB98ED2924779800B51A03 /* KMBatchProcessingStateTableCell.xib in Resources */,
 				BBC3481F295593F0008D2CD1 /* KMBackgroundListController.xib in Resources */,
 				9F1F82E62934D5240092C4B4 /* KMHomeExtractActionViewController.xib in Resources */,
@@ -6069,6 +6181,7 @@
 				BB89721B294AED6C0045787C /* KMWatermarkAdjectiveBaseController.xib in Resources */,
 				89E4E72F2963FBA2002DBA6F /* KMPropertiesViewPopController.xib in Resources */,
 				9F8539E32947126000DF644E /* KMChromiumToolbar.xib in Resources */,
+				ADC075D329875F6A006C752F /* KMBatchConverPDFExcelView.xib in Resources */,
 				9F8539F62947137500DF644E /* sadfavicon.png in Resources */,
 				BBEC00B2295C2AF300A26C98 /* KMBatesPreviewController.xib in Resources */,
 				BB4BD9CF2909026500A66A65 /* KMRightSideViewController.xib in Resources */,
@@ -6120,6 +6233,7 @@
 				BBEC00DC295C39FD00A26C98 /* KMBatesPropertyInfoController.xib in Resources */,
 				ADB1FE612975189600ED072D /* KMBatchProcessingDeleteTableCell.xib in Resources */,
 				9FAAA32D290BD01D0046FFCE /* KMHomeHistoryFileViewController.xib in Resources */,
+				ADC075C429866B05006C752F /* KMBatchTextRecognitionView.xib in Resources */,
 				BBC3480F29558DC1008D2CD1 /* KMBackgroundController.xib in Resources */,
 				ADD1B6F82946C0CA00C3FFF7 /* KMPrintChoosePageSizeMultipageView.xib in Resources */,
 				89E4E76429656A88002DBA6F /* KMAnnotationStampViewController.xib in Resources */,
@@ -6140,6 +6254,7 @@
 				9F8539DA294318D600DF644E /* TabsImage.xcassets in Resources */,
 				BBA8B7B3293635D80097D183 /* KMPasswordInputWindow.xib in Resources */,
 				8997010128F40710009AF911 /* KMBookMarkViewController.xib in Resources */,
+				ADC075DD29876622006C752F /* KMBatchConverPDFPPTView.xib in Resources */,
 				89E4E7382964148E002DBA6F /* KMAnnotationPropertiesViewController.xib in Resources */,
 				BB897231294B08DE0045787C /* KMWatermarkViewController.xib in Resources */,
 				9FDD0FA22952FF4D000C4DAD /* $themes.json in Resources */,
@@ -6167,6 +6282,7 @@
 				BB89723D294B3C840045787C /* KMWatermarkPropertyController.xib in Resources */,
 				9F0CB4822967F64D00007028 /* KMPropertiesPanelReadOnlySubVC.xib in Resources */,
 				BBA8B7A62935CD740097D183 /* KMRemovePasswordAlertWindowController.xib in Resources */,
+				ADC075E5298766E6006C752F /* KMBatchConverPDFImageView.xib in Resources */,
 				BB7507EC29861C37002DBDB1 /* PasswordWindowController.xib in Resources */,
 				9F0CB49A29683E1000007028 /* KMPropertiesPanelTextSubVC.xib in Resources */,
 				ADB1FEB2297543CF00ED072D /* KMBatchSettingView.xib in Resources */,
@@ -6218,6 +6334,7 @@
 				899700E328F3A9F2009AF911 /* KMHomeWindowController.xib in Resources */,
 				BB8F4543295A98960037EA22 /* KMHeaderFooterPropertyController.xib in Resources */,
 				BBEC00D5295C33D600A26C98 /* KMCreateBatesController.xib in Resources */,
+				ADC075E6298766E6006C752F /* KMBatchConverPDFImageView.xib in Resources */,
 				ADD1B6C02942DD3D00C3FFF7 /* KMPrintChooseView.xib in Resources */,
 				8997012328F41AB8009AF911 /* KMLeftSideViewController.xib in Resources */,
 				BB2F615C2966B69D001CB369 /* KMWatermarkPropertyHomeController.xib in Resources */,
@@ -6301,6 +6418,7 @@
 				9F8539FA2947137500DF644E /* newtab_p.pdf in Resources */,
 				9FBA0EF228FFC716001117AF /* KMHomeFastToolViewController.xib in Resources */,
 				ADB1FE2C297006DF00ED072D /* KMBatchWindowController.xib in Resources */,
+				ADC075D429875F6A006C752F /* KMBatchConverPDFExcelView.xib in Resources */,
 				AD4B4551294072B90076FA14 /* KMOCRWindowController.xib in Resources */,
 				F359917C292B7B8A000D25DE /* InitialUserDefaults.plist in Resources */,
 				BBFBE74A28DD7DDD008B2335 /* Main.storyboard in Resources */,
@@ -6322,6 +6440,7 @@
 				9F0CB4B92977BC1000007028 /* KMPropertiesPanelPreviewSubVC.xib in Resources */,
 				9F8539FD2947137500DF644E /* throbber_waiting.png in Resources */,
 				9F8539E42947126000DF644E /* KMChromiumToolbar.xib in Resources */,
+				ADC075C529866B05006C752F /* KMBatchTextRecognitionView.xib in Resources */,
 				9F1F82D6292F6D510092C4B4 /* KMPDFInsertPreviewViewController.xib in Resources */,
 				BB89721C294AED6C0045787C /* KMWatermarkAdjectiveBaseController.xib in Resources */,
 				9FDD0F9D2952FF4D000C4DAD /* comp-light.json in Resources */,
@@ -6341,9 +6460,11 @@
 				89E4E7392964148E002DBA6F /* KMAnnotationPropertiesViewController.xib in Resources */,
 				ADD1B6D029431D7100C3FFF7 /* KMPrintPreviewView.xib in Resources */,
 				9F853A062947137500DF644E /* newtab_h.pdf in Resources */,
+				ADC075DE29876622006C752F /* KMBatchConverPDFPPTView.xib in Resources */,
 				9F8DDF312924B855006CDC73 /* KMPDFToolsViewController.xib in Resources */,
 				9F853A002947137500DF644E /* throbber.png in Resources */,
 				BBC348372955A118008D2CD1 /* KMCreateBackgroundController.xib in Resources */,
+				ADC075BB29866984006C752F /* KMBatchConverPDFWordView.xib in Resources */,
 				9F0CB4832967F64D00007028 /* KMPropertiesPanelReadOnlySubVC.xib in Resources */,
 				899700FA28F4051B009AF911 /* KMAnnotationViewController.xib in Resources */,
 				9FDD0FBB295D5230000C4DAD /* KMToolbarController.xib in Resources */,
@@ -6449,10 +6570,13 @@
 				ADD1B6B02941E97F00C3FFF7 /* KMPrintWindowController.xib in Resources */,
 				ADE614C1298620C000F62ED7 /* ImageToPDF.xcassets in Resources */,
 				9F853A072947137500DF644E /* newtab_h.pdf in Resources */,
+				ADC075E7298766E6006C752F /* KMBatchConverPDFImageView.xib in Resources */,
 				9F0CB4842967F64D00007028 /* KMPropertiesPanelReadOnlySubVC.xib in Resources */,
 				9FDD0F9B2952FF4D000C4DAD /* alias-light.json in Resources */,
 				ADCB98FF292750A200B51A03 /* KMBatchProcessingTableView.xib in Resources */,
 				ADD1B6FE2946C0D400C3FFF7 /* KMPrintChoosePageSizePamphletView.xib in Resources */,
+				ADC075DF29876622006C752F /* KMBatchConverPDFPPTView.xib in Resources */,
+				ADC075C629866B05006C752F /* KMBatchTextRecognitionView.xib in Resources */,
 				BBC348192955920B008D2CD1 /* KMBackgroundPropertyController.xib in Resources */,
 				89E4E76629656A88002DBA6F /* KMAnnotationStampViewController.xib in Resources */,
 				899700E428F3A9F2009AF911 /* KMHomeWindowController.xib in Resources */,
@@ -6460,6 +6584,7 @@
 				BBC348402955A60B008D2CD1 /* KMBackgroundPropertyInfoController.xib in Resources */,
 				9FDD0F9E2952FF4D000C4DAD /* comp-light.json in Resources */,
 				ADB1FEA42975303F00ED072D /* KMBatchBatesNumberView.xib in Resources */,
+				ADC075D529875F6A006C752F /* KMBatchConverPDFExcelView.xib in Resources */,
 				9F8539E9294712D600DF644E /* KMChromiumTabContents.xib in Resources */,
 				9F8DDF322924B855006CDC73 /* KMPDFToolsViewController.xib in Resources */,
 				BBEC00BC295C2C1600A26C98 /* KMBatesPropertyHomeController.xib in Resources */,
@@ -6505,6 +6630,7 @@
 				9FA607E328FD4C9F00B46586 /* KMHomePopViewController.xib in Resources */,
 				AD44D658292C9E8C00A94554 /* KMImageToPDFChooseView.xib in Resources */,
 				BB4BD9D12909026500A66A65 /* KMRightSideViewController.xib in Resources */,
+				ADC075BC29866984006C752F /* KMBatchConverPDFWordView.xib in Resources */,
 				ADB1FE8C29752F5600ED072D /* KMBatchWatermarkView.xib in Resources */,
 				89D2D2BB2947316900BFF5FE /* Quick Start Guide_Widget.pdf in Resources */,
 				9F0CB49429683DEE00007028 /* KMPropertiesPanelLineSubVC.xib in Resources */,
@@ -6614,6 +6740,7 @@
 			buildActionMask = 2147483647;
 			files = (
 				BB8F453F295A98960037EA22 /* KMHeaderFooterPropertyController.swift in Sources */,
+				ADC075B629866962006C752F /* KMBatchConverPDFWordView.swift in Sources */,
 				89316840296E436B0073EA59 /* KMSignature.m in Sources */,
 				BB8F4565295AA3ED0037EA22 /* KMHeaderFooterManager.swift in Sources */,
 				ADB1FEB729754F9D00ED072D /* KMBatchSettingItemView.swift in Sources */,
@@ -6629,6 +6756,7 @@
 				BBFE6E7F2930EBD400142C01 /* KMCompressWindowController.swift in Sources */,
 				BBC3484A2958222C008D2CD1 /* KMBackgroundOutsideView.swift in Sources */,
 				9F1FE51129407B4000E952CA /* KMFileSearchView.swift in Sources */,
+				ADC075E1298766D9006C752F /* KMBatchConverPDFImageView.swift in Sources */,
 				BB897279294DFD1E0045787C /* KMWatermarkTextView.swift in Sources */,
 				F34BF93A29530951002C25A2 /* NSEvent+PDFListView.m in Sources */,
 				BBC3484E29582920008D2CD1 /* KMBackgroundColorView.swift in Sources */,
@@ -6648,6 +6776,7 @@
 				ADB1FE5D2975182100ED072D /* KMBatchProcessingDeleteTableCell.swift in Sources */,
 				BB162E9B295073B40088E9D1 /* KMWatermarkManager.swift in Sources */,
 				BB4BD9CC2909026500A66A65 /* KMRightSideViewController.swift in Sources */,
+				ADC075C029866AE6006C752F /* KMBatchTextRecognitionView.swift in Sources */,
 				9F1FE4B429406E4700E952CA /* CTBrowser.m in Sources */,
 				8942F7BB29222C7E00389627 /* KMBookCellView.swift in Sources */,
 				F373228C292CCA650013862C /* CPDFListViewAnimatedBorderlessWindow.m in Sources */,
@@ -6822,6 +6951,7 @@
 				BBD1F793296FE92500343885 /* KMPageEditSplitSettingView.swift in Sources */,
 				BB897241294C028A0045787C /* KMWatermarkAdjectiveSegementControl.swift in Sources */,
 				89E4E76129656A88002DBA6F /* KMAnnotationStampViewController.m in Sources */,
+				ADC075D929876612006C752F /* KMBatchConverPDFPPTView.swift in Sources */,
 				89E4E755296427E5002DBA6F /* NSImage_SKExtensions.m in Sources */,
 				BB6DD821293497B6001F0544 /* KMSecureEncryptModel.swift in Sources */,
 				89752DC22937033F003FF08E /* KMPopMenuButtonCell.m in Sources */,
@@ -6925,6 +7055,7 @@
 				ADD1B7022946C8AD00C3FFF7 /* KMBaseTextField.swift in Sources */,
 				F37322DE292DF9410013862C /* CPDFFreeTextAnnotation+PDFListView.m in Sources */,
 				BB89724D294C1DCE0045787C /* KMWatermarkAdjectiveListTableCellView.swift in Sources */,
+				ADC075CA29866DDC006C752F /* KMBatchConvertPDFItemView.swift in Sources */,
 				9F1FE4E129406E4700E952CA /* GTMNSAnimation+Duration.m in Sources */,
 				9F0CB51D2986569B00007028 /* KMDesignToken+BorderRadiusBottomRight.swift in Sources */,
 				F34BF9532953DA91002C25A2 /* NSGeometry+PDFListView.m in Sources */,
@@ -7056,6 +7187,7 @@
 				ADC25DF92923BA710080A3F6 /* KMImageToPDFWindowController.swift in Sources */,
 				9F1FE4F029406E4700E952CA /* BackgroundGradientView.m in Sources */,
 				BB2EDF70296ECE17003BCF58 /* KMPageEditThumbnailView.swift in Sources */,
+				ADC075CF29875F49006C752F /* KMBatchConverPDFExcelView.swift in Sources */,
 				89752DBD2936FAD0003FF08E /* NSWindow+PopOver.m in Sources */,
 				9F1FE4A229406E4700E952CA /* CTToolbarController.m in Sources */,
 				ADCB98C52924730000B51A03 /* KMBatchProcessingTableViewModel.swift in Sources */,
@@ -7145,6 +7277,7 @@
 			buildActionMask = 2147483647;
 			files = (
 				BB8F4540295A98960037EA22 /* KMHeaderFooterPropertyController.swift in Sources */,
+				ADC075B729866962006C752F /* KMBatchConverPDFWordView.swift in Sources */,
 				89316841296E436B0073EA59 /* KMSignature.m in Sources */,
 				BB8F4566295AA3ED0037EA22 /* KMHeaderFooterManager.swift in Sources */,
 				ADB1FEB829754F9D00ED072D /* KMBatchSettingItemView.swift in Sources */,
@@ -7160,6 +7293,7 @@
 				F37322EB292DF9410013862C /* CPDFStampAnnotation+PDFListView.m in Sources */,
 				BBC3484B2958222C008D2CD1 /* KMBackgroundOutsideView.swift in Sources */,
 				BB86C21F28F561F8005AD968 /* SKRuntime.m in Sources */,
+				ADC075E2298766D9006C752F /* KMBatchConverPDFImageView.swift in Sources */,
 				BB89723B294B3C840045787C /* KMWatermarkPropertyController.swift in Sources */,
 				9FA607DF28FD4C9F00B46586 /* KMHomePopViewController.swift in Sources */,
 				BBC3484F29582920008D2CD1 /* KMBackgroundColorView.swift in Sources */,
@@ -7179,6 +7313,7 @@
 				ADB1FE5E2975182100ED072D /* KMBatchProcessingDeleteTableCell.swift in Sources */,
 				9FDD0FAB29534FCC000C4DAD /* KMAliasLight.swift in Sources */,
 				BBF38A63294F53FD0086D025 /* KMWatermarkFileView.swift in Sources */,
+				ADC075C129866AE6006C752F /* KMBatchTextRecognitionView.swift in Sources */,
 				F37322F4292DF9410013862C /* CSelfSignAnnotationFreeText.m in Sources */,
 				ADCB98F729274B6B00B51A03 /* KMBatchProcessingTableView.swift in Sources */,
 				899700E028F3A9F2009AF911 /* KMHomeWindowController.swift in Sources */,
@@ -7353,6 +7488,7 @@
 				BBD1F794296FE92500343885 /* KMPageEditSplitSettingView.swift in Sources */,
 				899700FF28F40710009AF911 /* KMBookMarkViewController.swift in Sources */,
 				89E4E76229656A88002DBA6F /* KMAnnotationStampViewController.m in Sources */,
+				ADC075DA29876612006C752F /* KMBatchConverPDFPPTView.swift in Sources */,
 				89E4E756296427E5002DBA6F /* NSImage_SKExtensions.m in Sources */,
 				BB897276294DC04F0045787C /* KMWatermartAdjectivePageRangeView.swift in Sources */,
 				89752D9B2936E675003FF08E /* KMToolBarBox.swift in Sources */,
@@ -7456,6 +7592,7 @@
 				BBA8B7AB2935DC120097D183 /* KMRemovePasswordResultTipView.swift in Sources */,
 				ADCB9972292C65EE00B51A03 /* KMGOCROperation.m in Sources */,
 				9FDD0F78294FEF64000C4DAD /* KMConvertPDFManager.swift in Sources */,
+				ADC075CB29866DDC006C752F /* KMBatchConvertPDFItemView.swift in Sources */,
 				8942F80429262B2E00389627 /* KMSideViewController.swift in Sources */,
 				9F0CB51E2986569B00007028 /* KMDesignToken+BorderRadiusBottomRight.swift in Sources */,
 				9FDD0F7D2952F2D8000C4DAD /* KMBaseParser.swift in Sources */,
@@ -7587,6 +7724,7 @@
 				89752DBE2936FAD0003FF08E /* NSWindow+PopOver.m in Sources */,
 				9F1FE4A329406E4700E952CA /* CTToolbarController.m in Sources */,
 				BB2EDF71296ECE17003BCF58 /* KMPageEditThumbnailView.swift in Sources */,
+				ADC075D029875F49006C752F /* KMBatchConverPDFExcelView.swift in Sources */,
 				9F78EFC328F7E395001E66F4 /* KMHomeViewController+Action.swift in Sources */,
 				9F1FE50029406E4700E952CA /* CTTabStripModel.m in Sources */,
 				9F1FE4CA29406E4700E952CA /* CTTabContents.m in Sources */,
@@ -7809,6 +7947,7 @@
 				AD3A3589294C11ED00D72802 /* KMPrintPreviewPresenter.swift in Sources */,
 				BB49ED1B293F4D4E00C82CA2 /* KMConvertCSVSettingView.swift in Sources */,
 				89752E1B2941FD48003FF08E /* KMSearchCellView.swift in Sources */,
+				ADC075C229866AE6006C752F /* KMBatchTextRecognitionView.swift in Sources */,
 				BB6DD81E29348F31001F0544 /* KMSecureTextFiled.swift in Sources */,
 				89E4E752296427C8002DBA6F /* NSURL_SKExtensions.m in Sources */,
 				BB2EDF7B296ECE17003BCF58 /* KMPageEditThumbnailItem.swift in Sources */,
@@ -7848,6 +7987,7 @@
 				BBD1F795296FE92500343885 /* KMPageEditSplitSettingView.swift in Sources */,
 				BBEC00DB295C39FD00A26C98 /* KMBatesPropertyInfoController.swift in Sources */,
 				9F1FE4AA29406E4700E952CA /* CTBrowserWindowController.m in Sources */,
+				ADC075B829866962006C752F /* KMBatchConverPDFWordView.swift in Sources */,
 				BBC348042955403D008D2CD1 /* KMWatermarkFilePropertyInfoController.swift in Sources */,
 				ADB1FEA82975305500ED072D /* KMBatchBatchRemoveView.swift in Sources */,
 				AD9527DD2952EE700039D2BC /* KMPrintPage_C.swift in Sources */,
@@ -7915,6 +8055,7 @@
 				9F0CB4DB2986553600007028 /* KMDesignToken+VerticalPadding.swift in Sources */,
 				BB6DD816293486FA001F0544 /* KMSecureEncryptPasswordCellView.swift in Sources */,
 				9F1FE4C829406E4700E952CA /* CTUtil.m in Sources */,
+				ADC075CC29866DDC006C752F /* KMBatchConvertPDFItemView.swift in Sources */,
 				89E4E6E52963CD82002DBA6F /* KMGeneralAnnotationViewController.m in Sources */,
 				9FAAA327290A69920046FFCE /* KMToolSetScroller.swift in Sources */,
 				F373231B292DF97D0013862C /* CPDFSelection+PDFListView.m in Sources */,
@@ -8006,6 +8147,7 @@
 				9F1FE4CE29406E4700E952CA /* CTTabContentsController.m in Sources */,
 				9F0CB4EF298655A800007028 /* KMDesignToken+PaddingLeft.swift in Sources */,
 				F3732335292F7B8D0013862C /* CStampSignatureObject.m in Sources */,
+				ADC075E3298766D9006C752F /* KMBatchConverPDFImageView.swift in Sources */,
 				F3732304292DF9410013862C /* CPDFLinkAnnotation+PDFListView.m in Sources */,
 				BB897222294AF9080045787C /* KMWatermarkAdjectiveTopBarView.swift in Sources */,
 				8931683F296E436B0073EA59 /* KMPDFSignatureTextView.m in Sources */,
@@ -8125,6 +8267,7 @@
 				89E4E748296418ED002DBA6F /* TextFieldFormatter.m in Sources */,
 				9F1FE50129406E4700E952CA /* CTTabStripModel.m in Sources */,
 				BB35C4A12975362900D46EE2 /* KMRedactTopToolBar.swift in Sources */,
+				ADC075D129875F49006C752F /* KMBatchConverPDFExcelView.swift in Sources */,
 				F34BF93C29530951002C25A2 /* NSEvent+PDFListView.m in Sources */,
 				9F1FE4CB29406E4700E952CA /* CTTabContents.m in Sources */,
 				9F78EFC428F7E395001E66F4 /* KMHomeViewController+Action.swift in Sources */,
@@ -8179,6 +8322,7 @@
 				BB6DD8272934D056001F0544 /* KMSecureEncryptSuccessTipView.swift in Sources */,
 				BBEC00C1295C306400A26C98 /* KMBatesPropertyController.swift in Sources */,
 				89E4E7242963FB23002DBA6F /* KMGeneralButton.m in Sources */,
+				ADC075DB29876612006C752F /* KMBatchConverPDFPPTView.swift in Sources */,
 				BB2EDF72296ECE17003BCF58 /* KMPageEditThumbnailView.swift in Sources */,
 				9F1FE3E0293EE51F00E952CA /* KMMainDocument.swift in Sources */,
 			);

+ 29 - 92
PDF Office/PDF Office.xcodeproj/xcuserdata/lizhe.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -752,47 +752,31 @@
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "3283ABA0-1A0F-4485-A9E1-A6A44EF3F4AE"
+            uuid = "09825991-2F39-41AD-A1FA-BC5D3A21F588"
             shouldBeEnabled = "Yes"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
-            filePath = "PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/KMBatchConvertPDFView.swift"
+            filePath = "PDF Office/Class/PDFTools/Batch/View/Choose/KMBatchSettingView.swift"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "123"
-            endingLineNumber = "123"
-            landmarkName = "languageAction(_:)"
-            landmarkType = "7">
+            startingLineNumber = "19"
+            endingLineNumber = "19"
+            landmarkName = "filesData"
+            landmarkType = "24">
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "B98F2351-BC13-4E4C-AB5C-3ECCBEAECEDD"
+            uuid = "B7296374-8477-4C4A-96B0-8AAAB77F45A4"
             shouldBeEnabled = "Yes"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/KMBatchConvertPDFView.swift"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "113"
-            endingLineNumber = "113"
-            landmarkName = "convertPDFTypeAction(_:)"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "0E04C536-9E7D-4D94-8887-7E938CBF46C6"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "PDF Office/Class/PDFTools/ImageToPDF/View/KMBatchProcessingView/SelectedFiles/KMBatchSelectedFilesView.swift"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "57"
-            endingLineNumber = "57"
+            startingLineNumber = "60"
+            endingLineNumber = "60"
             landmarkName = "setup()"
             landmarkType = "7">
          </BreakpointContent>
@@ -800,112 +784,65 @@
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "9E08A492-4C3C-451B-8A5A-8925774709E6"
+            uuid = "03E77B8C-8246-46A1-AEC5-FBF94CD273C7"
             shouldBeEnabled = "Yes"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
-            filePath = "PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/KMBatchConvertPDFView.swift"
+            filePath = "PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Views/Word/KMBatchConverPDFWordView.swift"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "149"
-            endingLineNumber = "149"
-            landmarkName = "convertAction(_:)"
+            startingLineNumber = "75"
+            endingLineNumber = "75"
+            landmarkName = "reloadData()"
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "09825991-2F39-41AD-A1FA-BC5D3A21F588"
+            uuid = "011A5491-AE29-4E6F-9A53-1B0F14846EC7"
             shouldBeEnabled = "Yes"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
-            filePath = "PDF Office/Class/PDFTools/Batch/View/Choose/KMBatchSettingView.swift"
+            filePath = "PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Views/Word/KMBatchConverPDFWordView.swift"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "19"
-            endingLineNumber = "19"
-            landmarkName = "filesData"
-            landmarkType = "24">
+            startingLineNumber = "57"
+            endingLineNumber = "57"
+            landmarkName = "setup()"
+            landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "A44E715C-4633-4BB4-8029-C3E03A483CE0"
+            uuid = "E7EC2278-660C-4FA4-883E-AEF64E3BC08C"
             shouldBeEnabled = "Yes"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
-            filePath = "PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/KMBatchConvertPDFView.swift"
+            filePath = "PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Views/Word/KMBatchConverPDFWordView.swift"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "165"
-            endingLineNumber = "165"
-            landmarkName = "convertAction(_:)"
+            startingLineNumber = "63"
+            endingLineNumber = "63"
+            landmarkName = "setup()"
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "AADA3269-8570-4E9A-9A5C-FEACAFD4E1B2"
+            uuid = "D3414360-72B4-4ED4-BE9A-45EEBDF5859A"
             shouldBeEnabled = "Yes"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/KMBatchConvertPDFView.swift"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "177"
-            endingLineNumber = "177"
-            landmarkName = "convertAction(_:)"
+            startingLineNumber = "173"
+            endingLineNumber = "173"
+            landmarkName = "convertFile(outputFolderPath:)"
             landmarkType = "7">
-            <Locations>
-               <Location
-                  uuid = "AADA3269-8570-4E9A-9A5C-FEACAFD4E1B2 - fb253004a00b352"
-                  shouldBeEnabled = "Yes"
-                  ignoreCount = "0"
-                  continueAfterRunningActions = "No"
-                  symbolName = "closure #1 () -&gt; () in closure #1 (__C.NSModalResponse) -&gt; () in PDF_Office.KMBatchConvertPDFView.convertAction(Any) -&gt; ()"
-                  moduleName = "PDF Office"
-                  usesParentBreakpointCondition = "Yes"
-                  urlString = "file:///Volumes/Data/Company/kdan/Projects/PDF%20Office/PDF%20Office/PDF%20Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/KMBatchConvertPDFView.swift"
-                  startingColumnNumber = "9223372036854775807"
-                  endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "172"
-                  endingLineNumber = "172"
-                  offsetFromSymbolStart = "2681">
-               </Location>
-               <Location
-                  uuid = "AADA3269-8570-4E9A-9A5C-FEACAFD4E1B2 - fb253004a00b352"
-                  shouldBeEnabled = "Yes"
-                  ignoreCount = "0"
-                  continueAfterRunningActions = "No"
-                  symbolName = "closure #1 () -&gt; () in closure #1 (__C.NSModalResponse) -&gt; () in PDF_Office.KMBatchConvertPDFView.convertAction(Any) -&gt; ()"
-                  moduleName = "PDF Office"
-                  usesParentBreakpointCondition = "Yes"
-                  urlString = "file:///Volumes/Data/Company/kdan/Projects/PDF%20Office/PDF%20Office/PDF%20Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/KMBatchConvertPDFView.swift"
-                  startingColumnNumber = "9223372036854775807"
-                  endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "172"
-                  endingLineNumber = "172"
-                  offsetFromSymbolStart = "2712">
-               </Location>
-               <Location
-                  uuid = "AADA3269-8570-4E9A-9A5C-FEACAFD4E1B2 - 7dc766dab19ea234"
-                  shouldBeEnabled = "Yes"
-                  ignoreCount = "0"
-                  continueAfterRunningActions = "No"
-                  symbolName = "closure #1 (Swift.Bool, Swift.Optional&lt;Swift.Error&gt;) -&gt; () in closure #1 () -&gt; () in closure #1 (__C.NSModalResponse) -&gt; () in PDF_Office.KMBatchConvertPDFView.convertAction(Any) -&gt; ()"
-                  moduleName = "PDF Office"
-                  usesParentBreakpointCondition = "Yes"
-                  urlString = "file:///Volumes/Data/Company/kdan/Projects/PDF%20Office/PDF%20Office/PDF%20Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/KMBatchConvertPDFView.swift"
-                  startingColumnNumber = "9223372036854775807"
-                  endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "173"
-                  endingLineNumber = "173"
-                  offsetFromSymbolStart = "150">
-               </Location>
-            </Locations>
          </BreakpointContent>
       </BreakpointProxy>
    </Breakpoints>

+ 2 - 2
PDF Office/PDF Office/Class/Home/ViewController/KMHomeHistoryFileViewController.swift

@@ -61,8 +61,8 @@ class KMHomeHistoryFileTableviewCell: NSTableCellView {
         
         documentName.stringValue = url.lastPathComponent
         lastModificationTime.stringValue = dateFormatter.string(from: attrib![FileAttributeKey(rawValue: "NSFileModificationDate")] as! Date)
-        let fileSize = attrib![FileAttributeKey(rawValue: "NSFileSize")] as? Float ?? 0
-        documentSize.stringValue = fileSizeString(fileSize)
+//        let fileSize: Float = attrib![FileAttributeKey(rawValue: "NSFileSize")] as! Float
+//        documentSize.stringValue = fileSizeString(fileSize)
         
         documentName.backgroundColor = .clear
         documentName.textColor = .black

+ 12 - 7
PDF Office/PDF Office/Class/PDFTools/Batch/Tool/KMImageTitleButton/KMImageTitleButton.xib

@@ -17,11 +17,11 @@
         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
         <customObject id="-3" userLabel="Application" customClass="NSObject"/>
         <customView id="c22-O7-iKe">
-            <rect key="frame" x="0.0" y="0.0" width="263" height="32"/>
+            <rect key="frame" x="0.0" y="0.0" width="240" height="36"/>
             <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
             <subviews>
                 <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="4a3-xu-VfF">
-                    <rect key="frame" x="0.0" y="8" width="16" height="16"/>
+                    <rect key="frame" x="0.0" y="17" width="16" height="16"/>
                     <constraints>
                         <constraint firstAttribute="width" constant="16" id="Wd1-DY-QSw"/>
                         <constraint firstAttribute="height" constant="16" id="XSH-nn-vvX"/>
@@ -29,15 +29,18 @@
                     <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" id="7zw-oZ-vdx"/>
                 </imageView>
                 <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="w4c-S9-rac">
-                    <rect key="frame" x="22" y="8" width="4" height="16"/>
-                    <textFieldCell key="cell" lineBreakMode="clipping" id="hxC-IV-2Nn">
+                    <rect key="frame" x="22" y="2" width="204" height="32"/>
+                    <constraints>
+                        <constraint firstAttribute="width" constant="200" id="kfy-fq-DGx"/>
+                    </constraints>
+                    <textFieldCell key="cell" selectable="YES" title="Convert each page to a separate worksheet" id="hxC-IV-2Nn">
                         <font key="font" metaFont="system"/>
                         <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
                         <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                     </textFieldCell>
                 </textField>
                 <button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="QWT-7S-lKb">
-                    <rect key="frame" x="0.0" y="0.0" width="263" height="32"/>
+                    <rect key="frame" x="0.0" y="0.0" width="240" height="36"/>
                     <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                     <buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" alignment="center" imageScaling="proportionallyDown" inset="2" id="HgM-gk-Pkd">
                         <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
@@ -49,12 +52,14 @@
                 </button>
             </subviews>
             <constraints>
+                <constraint firstItem="4a3-xu-VfF" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" constant="3" id="39J-jh-d2Z"/>
+                <constraint firstAttribute="trailing" secondItem="w4c-S9-rac" secondAttribute="trailing" constant="16" id="CoU-De-xNh"/>
                 <constraint firstItem="w4c-S9-rac" firstAttribute="centerY" secondItem="c22-O7-iKe" secondAttribute="centerY" id="MHc-tJ-Jhh"/>
                 <constraint firstItem="4a3-xu-VfF" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" id="h5D-Tl-Nxk"/>
-                <constraint firstItem="4a3-xu-VfF" firstAttribute="centerY" secondItem="c22-O7-iKe" secondAttribute="centerY" id="ise-V7-VdY"/>
                 <constraint firstItem="w4c-S9-rac" firstAttribute="leading" secondItem="4a3-xu-VfF" secondAttribute="trailing" constant="8" id="qUb-V9-EdI"/>
+                <constraint firstItem="w4c-S9-rac" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" constant="2" id="wYF-Qc-uyg"/>
             </constraints>
-            <point key="canvasLocation" x="-74.5" y="-72"/>
+            <point key="canvasLocation" x="-242" y="-39"/>
         </customView>
     </objects>
 </document>

+ 154 - 111
PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/KMBatchConvertPDFView.swift

@@ -10,19 +10,15 @@ import Cocoa
 class KMBatchConvertPDFView: KMBatchSettingItemView {
     @IBOutlet var contentView: NSView!
 
+    @IBOutlet weak var itemContentView: NSView!
     @IBOutlet weak var formatLabel: NSTextField!
     
     @IBOutlet weak var convertButton: NSButton!
     @IBOutlet weak var convertTitleLabel: NSTextField!
     @IBOutlet weak var convertIconImage: NSImageView!
     
-    @IBOutlet weak var settingLabel: NSTextField!
-    @IBOutlet weak var retainFlowingTextButton: KMImageTitleButton!
-    @IBOutlet weak var retainPageLayoutButton: KMImageTitleButton!
-    
-    @IBOutlet weak var textRecognitionSettingLabel: NSTextField!
-    @IBOutlet weak var recognizeTextButton: KMImageTitleButton!
-    @IBOutlet weak var languageLabel: NSTextField!
+    var itemViewArray: [KMBatchConvertPDFItemView] = []
+    var currentView: KMBatchConvertPDFItemView = KMBatchConvertPDFItemView()
     
     var data: KMBatchConvertPDFViewModel = KMBatchConvertPDFViewModel()
     var presenter: KMBatchConvertPDFViewPresenter = KMBatchConvertPDFViewPresenter()
@@ -63,45 +59,64 @@ class KMBatchConvertPDFView: KMBatchSettingItemView {
     func setup() {
         self.presenter.initPresenter(view: self)
         
-        self.retainFlowingTextButton.title = NSLocalizedString("Retain Flowing Text", comment: "")
-        self.retainFlowingTextButton.imageName = "btn_radio_unsel_on"
-        self.retainFlowingTextButton.action = { [unowned self] (view, button) in
-            self.presenter.retainFlowingTextAction(button: button)
-        }
-        
-        self.retainPageLayoutButton.title = NSLocalizedString("Retain Page Layout", comment: "")
-        self.retainPageLayoutButton.imageName = "btn_radio_unsel_on"
-        self.retainPageLayoutButton.action = { view, button in
-            self.presenter.retainPageLayoutAction(button: button)
-        }
-        
-        self.recognizeTextButton.title = NSLocalizedString("Recognize text if needed", comment: "")
-        self.recognizeTextButton.imageName = "btn_checkbox_unsel_on"
-        self.recognizeTextButton.action = { view, button in
-            self.presenter.needRecognizeTextAction(button: button)
-        }
         //刷新数据
         self.reloadData()
     }
     
     func reloadData() {
+        if self.data.convertPDFType != self.currentView.type ||
+            self.itemViewArray.count == 0 {
+            let view = self.fetchCurrentView(type: self.data.convertPDFType)
+            self.currentView.removeFromSuperview()
+            self.itemContentView.addSubview(view)
+            self.currentView = view
+        }
+        
+        self.currentView.data = self.data
+        self.currentView.reloadData()
         
-        self.retainFlowingTextButton.imageName = "btn_radio_unsel_on"
-        self.retainPageLayoutButton.imageName = "btn_radio_unsel_on"
+        self.convertTitleLabel.stringValue = self.data.convertPDFType.rawValue
+    }
+    
+    func fetchCurrentView(type: KMBatchConvertPDFType) -> KMBatchConvertPDFItemView {
+        var view: KMBatchConvertPDFItemView = KMBatchConvertPDFItemView.init()
         
-        switch data.layoutSettingType {
-        case .flowingText:
-            self.retainFlowingTextButton.imageName = "btn_radio_sel_on"
-        case .pageLayout:
-            self.retainPageLayoutButton.imageName = "btn_radio_sel_on"
+        var isExist = false
+        for item in self.itemViewArray {
+            if item.type == type {
+                isExist = true
+                view = item
+            }
         }
-
         
-        if data.needRecognizeText {
-            self.recognizeTextButton.imageName = "btn_checkbox_sel_on"
-        } else {
-            self.recognizeTextButton.imageName = "btn_checkbox_unsel_on"
+        if !isExist {
+            switch type {
+            case .word:
+                view = KMBatchConverPDFWordView.init(frame: self.itemContentView.bounds)
+                break
+            case .excel:
+                view = KMBatchConverPDFExcelView.init(frame: self.itemContentView.bounds)
+                break
+            case .ppt:
+                
+                break
+            case .image:
+                
+                break
+            case .csv:
+                
+                break
+            default:
+                print("找不到")
+                break
+            }
+            view.type = type
+            view.presenter = self.presenter
+            view.data = self.data
+            self.itemViewArray.append(view)
         }
+        
+        return view
     }
 }
 
@@ -116,22 +131,8 @@ extension KMBatchConvertPDFView: KMBatchConvertPDFViewAction {
         menu.popUp(positioning: menu.item(at: 0), at: CGPoint(x: 0, y: (sender ).fittingSize.height), in: sender )
     }
     
-    
-    @IBAction func languageAction(_ sender: NSButton) {
-        let menu = NSMenu()
-        menu.minimumWidth = sender.frame.size.width
-        for string in KMOCRLanguageType.allValues() {
-            menu.addItem(withTitle: NSLocalizedString(string, comment: ""), action: #selector(self.languageClick), target: self)
-        }
-        menu.popUp(positioning: menu.item(at: 0), at: CGPoint(x: 0, y: (sender ).fittingSize.height), in: sender)
-    }
-    
     @objc func convertPDFTypeClick(item: NSMenuItem) {
-        self.convertTitleLabel.stringValue = item.title
-    }
-    
-    @objc func languageClick(item: NSMenuItem) {
-        self.languageLabel.stringValue = item.title
+        self.presenter.convertPDFTypeAction(string: item.title)
     }
     
     @IBAction func convertAction(_ sender: Any) {
@@ -145,73 +146,114 @@ extension KMBatchConvertPDFView: KMBatchConvertPDFViewAction {
             }
             let outputFolderPath = panel.url?.path
             
-            DispatchQueue.global().async {
-                for item in self.filesData {
-                    //创建Document
-                    let filePath = item.filePath
-                    let document = PDFDocument(url: URL(fileURLWithPath: filePath!))
-                    let convert = KMPDFConvert()
-                    let settingData = self.data
-                    
-                    //获取page
-                    var pages:[Int] = []
-                    for i in 0 ... document!.pageCount - 1 {
-                        pages.append(i+1)
-                    }
-                    
-                    convert.outputFolderPath = outputFolderPath!
-                    convert.filePath = filePath!
-                    convert.pages = pages
-                    var fileName = filePath!.deletingPathExtension.lastPathComponent
-                    if ((fileName.isEmpty)) {
-                        fileName = NSLocalizedString("Untitled", comment: "")
-                    }
-                    convert.outputFileName = fileName
+            self.convertFile(outputFolderPath: outputFolderPath!)
+        }
+    }
+    
+    func convertFile(outputFolderPath: String) {
+        DispatchQueue.global().async {
+            for item in self.filesData {
+                //创建Document
+                let filePath = item.filePath
+                let document = PDFDocument(url: URL(fileURLWithPath: filePath!))
+                let convert = KMPDFConvert()
+                let settingData = self.data
+                var convertType: KMPDFConvertType = .word
+                var fileName = filePath!.deletingPathExtension.lastPathComponent
+                if ((fileName.isEmpty)) {
+                    fileName = NSLocalizedString("Untitled", comment: "")
+                }
+                
+                //获取page
+                var pages:[Int] = []
+                for i in 0 ... document!.pageCount - 1 {
+                    pages.append(i+1)
+                }
+                
+                convert.outputFolderPath = outputFolderPath
+                convert.filePath = filePath!
+                convert.outputFileName = fileName
+                convert.pages = pages
+                
+                switch settingData.convertPDFType {
+                case .word:
+                    convertType = .word
                     if settingData.layoutSettingType == .flowingText {
                         convert.isAllInOneSheet = false
                     } else {
                         convert.isAllInOneSheet = true
                     }
-                    convert.convertType = .word
-                    
-                    KMPDFConvertManager.defaultManager.convert(convert: convert) { [unowned self] finished, error in
-                        if finished {
-    //                        cancelButtonAction()
-                            if FileManager.default.fileExists(atPath: convert.outputFilePath) {
-                                NSWorkspace.shared.activateFileViewerSelecting([URL(fileURLWithPath: convert.outputFilePath)])
-                            }
+                case .excel:
+                    convertType = .excel
+                    if settingData.excelSetting == .separate {
+                        convert.isAllInOneSheet = false
+                        convert.isExtractTable = false
+                    } else if settingData.excelSetting == .format {
+                        convert.isAllInOneSheet = true
+                        convert.isExtractTable = false
+                    } else if settingData.excelSetting == .tables {
+                        convert.isAllInOneSheet = false
+                        convert.isExtractTable = true
+                        
+                        switch settingData.excelTablesType {
+                        case .oneTable:
+                            convert.extractTableIndex = 0
+                        case .pageTable:
+                            convert.extractTableIndex = 1
+                        case .allTable:
+                            convert.extractTableIndex = 2
+                        default:
+                            print("未找到")
+                        }
+                    }
+                case .ppt:
+                    convertType = .ppt
+                case .csv:
+                    convertType = .csv
+                case .image:
+                    convertType = .png
+                default:
+                    print("不清楚")
+                }
+                convert.convertType = convertType
+                
+                KMPDFConvertManager.defaultManager.convert(convert: convert) { [unowned self] finished, error in
+                    if finished {
+//                        cancelButtonAction()
+                        if FileManager.default.fileExists(atPath: convert.outputFilePath) {
+                            NSWorkspace.shared.activateFileViewerSelecting([URL(fileURLWithPath: convert.outputFilePath)])
+                        }
+                    } else {
+                        var errorString = ""
+                        let myError: NSError = error! as NSError
+                        if myError.code == 1 {
+                            errorString = NSLocalizedString("Password required or incorrect password. Please re-enter your password and try again", comment: "")
+                        } else if myError.code == 2 {
+                            errorString = NSLocalizedString("The license doesn't allow the permission", comment: "")
+                        } else if myError.code == 3 {
+                            errorString = NSLocalizedString("Malloc failure", comment: "")
+                        } else if myError.code == 4 {
+                            errorString = NSLocalizedString("Unknown error in processing conversion. Please try again later", comment: "")
+                        } else if myError.code == 5 {
+                            errorString = NSLocalizedString("Unknown error in processing PDF. Please try again later", comment: "")
+                        } else if myError.code == 6 {
+                            errorString = NSLocalizedString("File not found or could not be opened. Check if your file exists or choose another file to convert", comment: "")
+                        } else if myError.code == 7 {
+                            errorString = NSLocalizedString("File not in PDF format or corruptead. Change a PDF file and try again", comment: "")
+                        } else if myError.code == 8 {
+                            errorString = NSLocalizedString("Unsupported security scheme", comment: "")
+                        } else if myError.code == 9 {
+                            errorString = NSLocalizedString("Page not found or content error", comment: "")
                         } else {
-                            var errorString = ""
-                            let myError: NSError = error! as NSError
-                            if myError.code == 1 {
-                                errorString = NSLocalizedString("Password required or incorrect password. Please re-enter your password and try again", comment: "")
-                            } else if myError.code == 2 {
-                                errorString = NSLocalizedString("The license doesn't allow the permission", comment: "")
-                            } else if myError.code == 3 {
-                                errorString = NSLocalizedString("Malloc failure", comment: "")
-                            } else if myError.code == 4 {
-                                errorString = NSLocalizedString("Unknown error in processing conversion. Please try again later", comment: "")
-                            } else if myError.code == 5 {
-                                errorString = NSLocalizedString("Unknown error in processing PDF. Please try again later", comment: "")
-                            } else if myError.code == 6 {
-                                errorString = NSLocalizedString("File not found or could not be opened. Check if your file exists or choose another file to convert", comment: "")
-                            } else if myError.code == 7 {
-                                errorString = NSLocalizedString("File not in PDF format or corruptead. Change a PDF file and try again", comment: "")
-                            } else if myError.code == 8 {
-                                errorString = NSLocalizedString("Unsupported security scheme", comment: "")
-                            } else if myError.code == 9 {
-                                errorString = NSLocalizedString("Page not found or content error", comment: "")
-                            } else {
-                                errorString = NSLocalizedString("Table not found", comment: "")
-                            }
-                            
-                            let alert = NSAlert()
-                            alert.alertStyle = .critical
-                            alert.messageText = NSLocalizedString("Conversion Failed", comment: "")
-                            alert.informativeText = errorString
-                            alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
-                            alert.runModal()
+                            errorString = NSLocalizedString("Table not found", comment: "")
                         }
+                        
+                        let alert = NSAlert()
+                        alert.alertStyle = .critical
+                        alert.messageText = NSLocalizedString("Conversion Failed", comment: "")
+                        alert.informativeText = errorString
+                        alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
+                        alert.runModal()
                     }
                 }
             }
@@ -223,5 +265,6 @@ extension KMBatchConvertPDFView: KMBatchConvertPDFViewPresenterDelegate {
     func showData(presenter: KMBatchConvertPDFViewPresenter, data: KMBatchConvertPDFViewModel) {
         self.data = data
         self.reloadData()
+        self.currentView.reloadData()
     }
 }

+ 10 - 128
PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/KMBatchConvertPDFView.xib

@@ -13,12 +13,7 @@
                 <outlet property="convertIconImage" destination="gqy-Wp-U61" id="lWX-BD-6KH"/>
                 <outlet property="convertTitleLabel" destination="I6b-oY-jAA" id="FuT-fA-xhu"/>
                 <outlet property="formatLabel" destination="Q8R-va-r5O" id="NKv-9j-hwk"/>
-                <outlet property="languageLabel" destination="1sJ-ss-p0d" id="Yvk-w6-2AY"/>
-                <outlet property="recognizeTextButton" destination="SEF-G4-Qmt" id="tWu-2S-TMh"/>
-                <outlet property="retainFlowingTextButton" destination="U8C-sm-GuB" id="Izf-8U-io7"/>
-                <outlet property="retainPageLayoutButton" destination="vv9-bg-fGf" id="jEi-6Y-Yvy"/>
-                <outlet property="settingLabel" destination="4XK-dg-5Wg" id="0ia-cH-E2K"/>
-                <outlet property="textRecognitionSettingLabel" destination="5ZX-wS-HCP" id="r4Y-sp-Thi"/>
+                <outlet property="itemContentView" destination="gRF-Pc-kIx" id="Ree-Je-KVM"/>
             </connections>
         </customObject>
         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
@@ -98,122 +93,6 @@
                                 <constraint firstItem="9eH-fh-he9" firstAttribute="top" secondItem="Q8R-va-r5O" secondAttribute="bottom" constant="8" id="tFk-9J-7Ij"/>
                             </constraints>
                         </customView>
-                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="aSl-HE-P9j">
-                            <rect key="frame" x="0.0" y="538" width="250" height="80"/>
-                            <subviews>
-                                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="4XK-dg-5Wg">
-                                    <rect key="frame" x="14" y="60" width="99" height="20"/>
-                                    <constraints>
-                                        <constraint firstAttribute="height" constant="20" id="lLh-uv-Yw7"/>
-                                    </constraints>
-                                    <textFieldCell key="cell" lineBreakMode="clipping" title="Layout Settings" id="7cx-P9-T74">
-                                        <font key="font" usesAppearanceFont="YES"/>
-                                        <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
-                                        <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
-                                    </textFieldCell>
-                                </textField>
-                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="U8C-sm-GuB" customClass="KMImageTitleButton" customModule="PDF_Office" customModuleProvider="target">
-                                    <rect key="frame" x="16" y="30" width="218" height="22"/>
-                                    <constraints>
-                                        <constraint firstAttribute="height" constant="22" id="GgY-3f-eEM"/>
-                                    </constraints>
-                                </customView>
-                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="vv9-bg-fGf" customClass="KMImageTitleButton" customModule="PDF_Office" customModuleProvider="target">
-                                    <rect key="frame" x="16" y="0.0" width="218" height="22"/>
-                                    <constraints>
-                                        <constraint firstAttribute="height" constant="22" id="FXE-za-FZI"/>
-                                    </constraints>
-                                </customView>
-                            </subviews>
-                            <constraints>
-                                <constraint firstItem="vv9-bg-fGf" firstAttribute="top" secondItem="U8C-sm-GuB" secondAttribute="bottom" constant="8" id="9gV-uv-3NA"/>
-                                <constraint firstAttribute="trailing" secondItem="vv9-bg-fGf" secondAttribute="trailing" constant="16" id="LeC-b0-1zN"/>
-                                <constraint firstItem="U8C-sm-GuB" firstAttribute="top" secondItem="4XK-dg-5Wg" secondAttribute="bottom" constant="8" id="X3i-ls-sSq"/>
-                                <constraint firstAttribute="trailing" secondItem="U8C-sm-GuB" secondAttribute="trailing" constant="16" id="XcP-Gh-SmV"/>
-                                <constraint firstItem="4XK-dg-5Wg" firstAttribute="top" secondItem="aSl-HE-P9j" secondAttribute="top" id="fdX-rm-i48"/>
-                                <constraint firstItem="U8C-sm-GuB" firstAttribute="leading" secondItem="aSl-HE-P9j" secondAttribute="leading" constant="16" id="pmH-rt-M4j"/>
-                                <constraint firstItem="vv9-bg-fGf" firstAttribute="leading" secondItem="aSl-HE-P9j" secondAttribute="leading" constant="16" id="q22-t0-lkd"/>
-                                <constraint firstItem="4XK-dg-5Wg" firstAttribute="leading" secondItem="aSl-HE-P9j" secondAttribute="leading" constant="16" id="w0J-t9-eSf"/>
-                                <constraint firstAttribute="height" constant="80" id="wen-L8-3R7"/>
-                            </constraints>
-                        </customView>
-                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="Gwh-xV-eaX">
-                            <rect key="frame" x="0.0" y="432" width="250" height="90"/>
-                            <subviews>
-                                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="5ZX-wS-HCP">
-                                    <rect key="frame" x="14" y="70" width="159" height="20"/>
-                                    <constraints>
-                                        <constraint firstAttribute="height" constant="20" id="fNP-Vu-SOK"/>
-                                    </constraints>
-                                    <textFieldCell key="cell" lineBreakMode="clipping" title="Text Recognition Settings" id="MEO-dY-sXU">
-                                        <font key="font" usesAppearanceFont="YES"/>
-                                        <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
-                                        <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
-                                    </textFieldCell>
-                                </textField>
-                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="I5f-ZY-bd3">
-                                    <rect key="frame" x="16" y="0.0" width="218" height="32"/>
-                                    <subviews>
-                                        <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1sJ-ss-p0d">
-                                            <rect key="frame" x="6" y="8" width="48" height="16"/>
-                                            <textFieldCell key="cell" lineBreakMode="clipping" title="English" id="HmK-16-UIZ">
-                                                <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>
-                                        <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="cBO-Ub-0Zg">
-                                            <rect key="frame" x="198" y="10" width="12" height="12"/>
-                                            <constraints>
-                                                <constraint firstAttribute="width" constant="12" id="6hW-fd-5Vq"/>
-                                                <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="12" id="IPW-Us-8Va"/>
-                                                <constraint firstAttribute="height" constant="12" id="UX8-55-fuI"/>
-                                                <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="12" id="axW-oM-L1L"/>
-                                            </constraints>
-                                            <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="btn_arrow_gray_down_s_norm_on" id="8wE-vH-hWg"/>
-                                        </imageView>
-                                        <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1yE-a0-dHH">
-                                            <rect key="frame" x="0.0" y="0.0" width="218" height="32"/>
-                                            <buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" alignment="center" imageScaling="proportionallyDown" inset="2" id="y2L-qx-kti">
-                                                <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
-                                                <font key="font" metaFont="system"/>
-                                            </buttonCell>
-                                            <connections>
-                                                <action selector="languageAction:" target="-2" id="wih-RQ-BQI"/>
-                                            </connections>
-                                        </button>
-                                    </subviews>
-                                    <constraints>
-                                        <constraint firstAttribute="bottom" secondItem="1yE-a0-dHH" secondAttribute="bottom" id="3Ra-eT-6M1"/>
-                                        <constraint firstItem="1yE-a0-dHH" firstAttribute="top" secondItem="I5f-ZY-bd3" secondAttribute="top" id="7ZS-Nc-J3B"/>
-                                        <constraint firstAttribute="trailing" secondItem="1yE-a0-dHH" secondAttribute="trailing" id="BZM-hN-OGv"/>
-                                        <constraint firstItem="1yE-a0-dHH" firstAttribute="leading" secondItem="I5f-ZY-bd3" secondAttribute="leading" id="Bo5-Dc-dUz"/>
-                                        <constraint firstItem="cBO-Ub-0Zg" firstAttribute="centerY" secondItem="I5f-ZY-bd3" secondAttribute="centerY" id="DeV-kT-heT"/>
-                                        <constraint firstAttribute="trailing" secondItem="cBO-Ub-0Zg" secondAttribute="trailing" constant="8" id="Fm7-QC-scu"/>
-                                        <constraint firstItem="1sJ-ss-p0d" firstAttribute="centerY" secondItem="I5f-ZY-bd3" secondAttribute="centerY" id="pYm-dm-Lsy"/>
-                                        <constraint firstAttribute="height" constant="32" id="vyu-WT-7Tp"/>
-                                        <constraint firstItem="1sJ-ss-p0d" firstAttribute="leading" secondItem="I5f-ZY-bd3" secondAttribute="leading" constant="8" id="xXP-n9-Zht"/>
-                                    </constraints>
-                                </customView>
-                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="SEF-G4-Qmt" customClass="KMImageTitleButton" customModule="PDF_Office" customModuleProvider="target">
-                                    <rect key="frame" x="16" y="40" width="218" height="22"/>
-                                    <constraints>
-                                        <constraint firstAttribute="height" constant="22" id="0PO-pk-Fks"/>
-                                    </constraints>
-                                </customView>
-                            </subviews>
-                            <constraints>
-                                <constraint firstItem="5ZX-wS-HCP" firstAttribute="leading" secondItem="Gwh-xV-eaX" secondAttribute="leading" constant="16" id="0Iy-1E-N1p"/>
-                                <constraint firstItem="SEF-G4-Qmt" firstAttribute="leading" secondItem="Gwh-xV-eaX" secondAttribute="leading" constant="16" id="0WO-ui-c1o"/>
-                                <constraint firstItem="SEF-G4-Qmt" firstAttribute="top" secondItem="5ZX-wS-HCP" secondAttribute="bottom" constant="8" id="14w-ap-V3p"/>
-                                <constraint firstAttribute="trailing" secondItem="SEF-G4-Qmt" secondAttribute="trailing" constant="16" id="7NM-oD-P9J"/>
-                                <constraint firstItem="I5f-ZY-bd3" firstAttribute="leading" secondItem="Gwh-xV-eaX" secondAttribute="leading" constant="16" id="I2U-Pp-OzY"/>
-                                <constraint firstAttribute="height" constant="90" id="Lf0-nL-MR0"/>
-                                <constraint firstItem="5ZX-wS-HCP" firstAttribute="top" secondItem="Gwh-xV-eaX" secondAttribute="top" id="QuK-ms-VMA"/>
-                                <constraint firstItem="I5f-ZY-bd3" firstAttribute="top" secondItem="SEF-G4-Qmt" secondAttribute="bottom" constant="8" id="c6U-E8-H1Z"/>
-                                <constraint firstAttribute="trailing" secondItem="I5f-ZY-bd3" secondAttribute="trailing" constant="16" id="mu1-uU-p5J"/>
-                            </constraints>
-                        </customView>
                         <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="t8i-o1-Alp">
                             <rect key="frame" x="16" y="16" width="218" height="32"/>
                             <constraints>
@@ -227,20 +106,23 @@
                                 <action selector="convertAction:" target="-2" id="N5z-e7-7eC"/>
                             </connections>
                         </button>
+                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="gRF-Pc-kIx">
+                            <rect key="frame" x="0.0" y="126" width="250" height="500"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="500" id="fCT-Hw-rqf"/>
+                            </constraints>
+                        </customView>
                     </subviews>
                     <constraints>
-                        <constraint firstItem="aSl-HE-P9j" firstAttribute="top" secondItem="cil-Yp-W4m" secondAttribute="bottom" constant="16" id="I63-qR-rh0"/>
+                        <constraint firstItem="gRF-Pc-kIx" firstAttribute="leading" secondItem="cxi-no-clx" secondAttribute="leading" id="JSh-nv-K7B"/>
                         <constraint firstItem="cil-Yp-W4m" firstAttribute="top" secondItem="cxi-no-clx" secondAttribute="top" id="N48-3a-dMk"/>
-                        <constraint firstItem="Gwh-xV-eaX" firstAttribute="top" secondItem="aSl-HE-P9j" secondAttribute="bottom" constant="16" id="W3z-5O-OlJ"/>
-                        <constraint firstAttribute="trailing" secondItem="Gwh-xV-eaX" secondAttribute="trailing" id="WBH-go-rnn"/>
                         <constraint firstAttribute="trailing" secondItem="t8i-o1-Alp" secondAttribute="trailing" constant="16" id="XKt-LD-gma"/>
-                        <constraint firstItem="aSl-HE-P9j" firstAttribute="leading" secondItem="cxi-no-clx" secondAttribute="leading" id="jR7-xu-e4y"/>
+                        <constraint firstItem="gRF-Pc-kIx" firstAttribute="top" secondItem="cil-Yp-W4m" secondAttribute="bottom" constant="8" id="ca2-hc-4uo"/>
                         <constraint firstItem="t8i-o1-Alp" firstAttribute="leading" secondItem="cxi-no-clx" secondAttribute="leading" constant="16" id="ji3-TU-J35"/>
                         <constraint firstAttribute="trailing" secondItem="cil-Yp-W4m" secondAttribute="trailing" id="k3c-b6-9M0"/>
-                        <constraint firstAttribute="trailing" secondItem="aSl-HE-P9j" secondAttribute="trailing" id="nX9-gQ-qxg"/>
+                        <constraint firstAttribute="trailing" secondItem="gRF-Pc-kIx" secondAttribute="trailing" id="lfl-I0-MmQ"/>
                         <constraint firstItem="cil-Yp-W4m" firstAttribute="leading" secondItem="cxi-no-clx" secondAttribute="leading" id="oVx-Sd-UWs"/>
                         <constraint firstAttribute="bottom" secondItem="t8i-o1-Alp" secondAttribute="bottom" constant="16" id="pH3-GL-nOb"/>
-                        <constraint firstItem="Gwh-xV-eaX" firstAttribute="leading" secondItem="cxi-no-clx" secondAttribute="leading" id="u1y-jT-uOy"/>
                     </constraints>
                 </customView>
             </subviews>

+ 37 - 2
PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Model/KMBatchConvertPDFViewModel.swift

@@ -25,13 +25,48 @@ enum KMBatchConvertPDFType: String, CaseIterable {
 }
 
 enum KMBatchLayoutSettingType: String, CaseIterable {
-    case flowingText = "Word"
-    case pageLayout = "Excel"
+    case flowingText = "flowingText"
+    case pageLayout = "pageLayout"
+}
+
+//转换类型
+enum KMBatchConvertPDFExcelTablesType: String, CaseIterable {
+    case oneTable = "支持一个表格提取到单独的工作表"
+    case pageTable = "支持按页面提取表格到单独的工作表"
+    case allTable = "支持将所有表格提取到一个工作表"
+    
+    static func allValues() -> [String] {
+        var array: [String] = []
+        for key in KMBatchConvertPDFExcelTablesType.allCases {
+            array.append(key.rawValue)
+        }
+        return array
+    }
+}
+
+//转换类型
+enum KMBatchConvertPDFExcelSettingType: String, CaseIterable {
+    case separate = "Convert each page to a separate worksheet"
+    case format = "Convert all pages to one worksheet format"
+    case tables = "Only Tables"
+    case text = "Only Text"
+    
+    static func allValues() -> [String] {
+        var array: [String] = []
+        for key in KMBatchConvertPDFExcelSettingType.allCases {
+            array.append(key.rawValue)
+        }
+        return array
+    }
 }
 
 class KMBatchConvertPDFViewModel: NSObject {
     var languageType: KMOCRLanguageType = .english
     var convertPDFType: KMBatchConvertPDFType = .word
     var needRecognizeText: Bool = false
+    //word
     var layoutSettingType: KMBatchLayoutSettingType = .flowingText
+    //excel
+    var excelSetting: KMBatchConvertPDFExcelSettingType = .separate
+    var excelTablesType: KMBatchConvertPDFExcelTablesType = .oneTable
 }

+ 94 - 3
PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Presenter/KMBatchConvertPDFViewPresenter.swift

@@ -20,10 +20,30 @@ extension KMBatchConvertPDFViewPresenter: KMBatchConvertPDFViewPresenterProtocol
      */
     func initPresenter(view: NSView) {
         self.delegate = (view as! any KMBatchConvertPDFViewPresenterDelegate)
-       
             
     }
     
+    func convertPDFTypeAction(string: String) {
+        var type: KMBatchConvertPDFType = .word
+        switch string {
+        case KMBatchConvertPDFType.word.rawValue:
+            type = .word
+        case KMBatchConvertPDFType.excel.rawValue:
+            type = .excel
+        case KMBatchConvertPDFType.ppt.rawValue:
+            type = .ppt
+        case KMBatchConvertPDFType.csv.rawValue:
+            type = .csv
+        case KMBatchConvertPDFType.image.rawValue:
+            type = .image
+        default:
+            print("未找到")
+        }
+        
+        self.modelData.convertPDFType = type
+        self.delegate?.showData(presenter: self, data: self.modelData)
+    }
+    
     func retainFlowingTextAction(button: NSButton) {
         self.modelData.layoutSettingType = .flowingText
         
@@ -36,6 +56,48 @@ extension KMBatchConvertPDFViewPresenter: KMBatchConvertPDFViewPresenterProtocol
         self.delegate?.showData(presenter: self, data: self.modelData)
     }
     
+    func worksheetButtonAction(button: NSButton) {
+        self.modelData.excelSetting = .separate
+        
+        self.delegate?.showData(presenter: self, data: self.modelData)
+    }
+    
+    func formatButtonAction(button: NSButton) {
+        self.modelData.excelSetting = .format
+        
+        self.delegate?.showData(presenter: self, data: self.modelData)
+    }
+    
+    func onlyTablesButtonAction(button: NSButton) {
+        self.modelData.excelSetting = .tables
+        
+        self.delegate?.showData(presenter: self, data: self.modelData)
+    }
+    
+    func onlyTextButtonAction(button: NSButton) {
+        self.modelData.excelSetting = .text
+        
+        self.delegate?.showData(presenter: self, data: self.modelData)
+    }
+    
+    func tablesTypeAction(string: String) {
+        var type: KMBatchConvertPDFExcelTablesType = .oneTable
+        switch string {
+        case KMBatchConvertPDFExcelTablesType.oneTable.rawValue:
+            type = .oneTable
+        case KMBatchConvertPDFExcelTablesType.pageTable.rawValue:
+            type = .pageTable
+        case KMBatchConvertPDFExcelTablesType.allTable.rawValue:
+            type = .allTable
+        default:
+            print("未找到")
+        }
+        
+        self.modelData.excelTablesType = type
+        
+        self.delegate?.showData(presenter: self, data: self.modelData)
+    }
+    
     func needRecognizeTextAction(button: NSButton) {
         self.modelData.needRecognizeText = (button.state == .on) ? true : false
         
@@ -70,13 +132,42 @@ protocol KMBatchConvertPDFViewPresenterProtocol {
      */
     func initPresenter(view: NSView)
     /**
-     @abstract 布局设置
+     @abstract 转换类型
+     */
+    func convertPDFTypeAction(string: String)
+    
+    //MARK: word
+    /**
+     @abstract  word布局设置
      */
     func retainFlowingTextAction(button: NSButton)
     /**
-     @abstract 布局设置
+     @abstract  word布局设置
      */
     func retainPageLayoutAction(button: NSButton)
+    
+    //MARK: excel
+    /**
+     @abstract  excel设置
+     */
+    func worksheetButtonAction(button: NSButton)
+    /**
+     @abstract  excel设置
+     */
+    func formatButtonAction(button: NSButton)
+    /**
+     @abstract  excel设置
+     */
+    func onlyTablesButtonAction(button: NSButton)
+    /**
+     @abstract  excel设置
+     */
+    func onlyTextButtonAction(button: NSButton)
+    /**
+     @abstract  excel设置
+     */
+    func tablesTypeAction(string: String)
+    
     /**
      @abstract 文字识别
      */

+ 26 - 0
PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Views/Base/KMBatchConvertPDFItemView.swift

@@ -0,0 +1,26 @@
+//
+//  KMBatchConvertPDFItemView.swift
+//  PDF Office
+//
+//  Created by lizhe on 2023/1/29.
+//
+
+import Cocoa
+
+class KMBatchConvertPDFItemView: NSView {
+
+    var type: KMBatchConvertPDFType = .word
+    var presenter: KMBatchConvertPDFViewPresenter = KMBatchConvertPDFViewPresenter()
+    var data: KMBatchConvertPDFViewModel = KMBatchConvertPDFViewModel()
+    
+    override func draw(_ dirtyRect: NSRect) {
+        super.draw(dirtyRect)
+
+        // Drawing code here.
+    }
+    
+    func reloadData() {
+        
+    }
+    
+}

+ 130 - 0
PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Views/Excel/KMBatchConverPDFExcelView.swift

@@ -0,0 +1,130 @@
+//
+//  KMBatchConverPDFExcelView.swift
+//  PDF Office
+//
+//  Created by lizhe on 2023/1/30.
+//
+
+import Cocoa
+
+class KMBatchConverPDFExcelView: KMBatchConvertPDFItemView {
+
+    @IBOutlet var contentView: NSView!
+    
+    @IBOutlet weak var settingLabel: NSTextField!
+
+    @IBOutlet weak var worksheetButton: KMImageTitleButton!
+    @IBOutlet weak var formatButton: KMImageTitleButton!
+    @IBOutlet weak var onlyTablesButton: KMImageTitleButton!
+    @IBOutlet weak var tablesTypeButton: NSButton!
+    @IBOutlet weak var tablesTypeLabel: NSTextField!
+    @IBOutlet weak var onlyTextButton: KMImageTitleButton!
+    
+    @IBOutlet weak var textRecognitionView: KMBatchTextRecognitionView!
+    override func draw(_ dirtyRect: NSRect) {
+        super.draw(dirtyRect)
+
+        // Drawing code here.
+    }
+    
+    // MARK: 初始化
+    public required init?(coder decoder: NSCoder) {
+        super.init(coder: decoder)
+        initContentView()
+        setup()
+    }
+    
+    override init(frame frameRect: NSRect) {
+        super.init(frame: frameRect)
+        initContentView()
+        setup()
+    }
+    
+    private func initContentView() {
+        //绑定xib
+        let resource = NSNib(nibNamed: String(describing: KMBatchConverPDFExcelView.self),
+                             bundle: Bundle(for: KMBatchConverPDFExcelView.self))!
+        resource.instantiate(withOwner: self, topLevelObjects: nil)
+        addSubview(contentView)
+        contentView.translatesAutoresizingMaskIntoConstraints = false
+        NSLayoutConstraint.activate([
+            contentView.topAnchor.constraint(equalTo: topAnchor),
+            contentView.leftAnchor.constraint(equalTo: leftAnchor),
+            contentView.rightAnchor.constraint(equalTo: rightAnchor),
+            contentView.bottomAnchor.constraint(equalTo: bottomAnchor)])
+        contentView.updateConstraintsForSubtreeIfNeeded()
+    }
+    
+    func setup() {
+        self.worksheetButton.title = NSLocalizedString("Convert each page to a separate worksheet", comment: "")
+        self.worksheetButton.imageName = "btn_radio_unsel_on"
+        self.worksheetButton.action = { [unowned self] (view, button) in
+            self.presenter.worksheetButtonAction(button: button)
+        }
+
+        self.formatButton.title = NSLocalizedString("Convert all pages to one worksheet format", comment: "")
+        self.formatButton.imageName = "btn_radio_unsel_on"
+        self.formatButton.action = { view, button in
+            self.presenter.formatButtonAction(button: button)
+        }
+        
+        self.onlyTablesButton.title = NSLocalizedString("Only Tables", comment: "")
+        self.onlyTablesButton.imageName = "btn_radio_unsel_on"
+        self.onlyTablesButton.action = { view, button in
+            self.presenter.onlyTablesButtonAction(button: button)
+        }
+        
+        self.onlyTextButton.title = NSLocalizedString("Only Text", comment: "")
+        self.onlyTextButton.imageName = "btn_radio_unsel_on"
+        self.onlyTextButton.action = { view, button in
+            self.presenter.onlyTextButtonAction(button: button)
+        }
+        
+        self.reloadData()
+    }
+    
+    override func reloadData() {
+        self.textRecognitionView.data = self.data
+        self.textRecognitionView.presenter = self.presenter
+        self.textRecognitionView.type = self.type
+        self.textRecognitionView.reloadData()
+
+        self.worksheetButton.imageName = "btn_radio_unsel_on"
+        self.formatButton.imageName = "btn_radio_unsel_on"
+        self.onlyTablesButton.imageName = "btn_radio_unsel_on"
+        self.onlyTextButton.imageName = "btn_radio_unsel_on"
+        self.tablesTypeButton.isEnabled = false
+        self.tablesTypeLabel.isEnabled = false
+        
+        switch data.excelSetting {
+        case .separate:
+            self.worksheetButton.imageName = "btn_radio_sel_on"
+        case .tables:
+            self.onlyTablesButton.imageName = "btn_radio_sel_on"
+            self.tablesTypeButton.isEnabled = true
+            self.tablesTypeLabel.isEnabled = true
+        case .format:
+            self.formatButton.imageName = "btn_radio_sel_on"
+        case .text:
+            self.onlyTextButton.imageName = "btn_radio_sel_on"
+        }
+    }
+}
+
+
+protocol KMBatchConverPDFExcelViewAction {}
+extension KMBatchConverPDFExcelView: KMBatchConverPDFExcelViewAction {
+    @IBAction func tablesTypeButtonAction(_ sender: NSButton) {
+        let menu = NSMenu()
+        menu.minimumWidth = sender.frame.size.width
+        for string in KMBatchConvertPDFExcelTablesType.allValues() {
+            menu.addItem(withTitle: NSLocalizedString(string, comment: ""), action: #selector(self.tablesTypeButtonClick), target: self)
+        }
+        menu.popUp(positioning: menu.item(at: 0), at: CGPoint(x: 0, y: (sender ).fittingSize.height), in: sender)
+    }
+
+    @objc func tablesTypeButtonClick(item: NSMenuItem) {
+        self.tablesTypeLabel.stringValue = item.title
+        self.presenter.tablesTypeAction(string: item.title)
+    }
+}

+ 154 - 0
PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Views/Excel/KMBatchConverPDFExcelView.xib

@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21507" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21507"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMBatchConverPDFExcelView" customModule="PDF_Office" customModuleProvider="target">
+            <connections>
+                <outlet property="contentView" destination="c22-O7-iKe" id="R04-On-5zz"/>
+                <outlet property="formatButton" destination="amw-qD-Bei" id="RAV-Z9-6Mt"/>
+                <outlet property="onlyTablesButton" destination="mH7-tW-KNc" id="4oU-6j-WIR"/>
+                <outlet property="onlyTextButton" destination="UQx-5V-Fdc" id="utm-pq-tdY"/>
+                <outlet property="settingLabel" destination="Iwz-rs-g8Z" id="pSv-V9-xE8"/>
+                <outlet property="tablesTypeButton" destination="ZnQ-TM-Fwz" id="quz-Oz-ycA"/>
+                <outlet property="tablesTypeLabel" destination="vb4-xX-AVH" id="PQ3-WJ-qS7"/>
+                <outlet property="textRecognitionView" destination="sYQ-Tb-lbQ" id="fcD-yd-cih"/>
+                <outlet property="worksheetButton" destination="sWP-m1-CvH" id="Xfb-3Z-pyA"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customView id="c22-O7-iKe">
+            <rect key="frame" x="0.0" y="0.0" width="244" height="353"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <customView translatesAutoresizingMaskIntoConstraints="NO" id="LbV-4M-wTH">
+                    <rect key="frame" x="0.0" y="129" width="244" height="224"/>
+                    <subviews>
+                        <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Iwz-rs-g8Z">
+                            <rect key="frame" x="14" y="204" width="155" height="20"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="20" id="OBM-1R-dRB"/>
+                            </constraints>
+                            <textFieldCell key="cell" lineBreakMode="clipping" title="Excel Workbook Settings" id="iIT-pV-Tr4">
+                                <font key="font" usesAppearanceFont="YES"/>
+                                <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                            </textFieldCell>
+                        </textField>
+                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="sWP-m1-CvH" customClass="KMImageTitleButton" customModule="PDF_Office" customModuleProvider="target">
+                            <rect key="frame" x="16" y="152" width="212" height="44"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="44" id="kAl-wh-79z"/>
+                            </constraints>
+                        </customView>
+                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="amw-qD-Bei" customClass="KMImageTitleButton" customModule="PDF_Office" customModuleProvider="target">
+                            <rect key="frame" x="16" y="100" width="212" height="44"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="44" id="fRX-Ad-ZxU"/>
+                            </constraints>
+                        </customView>
+                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="mH7-tW-KNc" customClass="KMImageTitleButton" customModule="PDF_Office" customModuleProvider="target">
+                            <rect key="frame" x="16" y="70" width="212" height="22"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="22" id="jE4-vY-LC6"/>
+                            </constraints>
+                        </customView>
+                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="UQx-5V-Fdc" customClass="KMImageTitleButton" customModule="PDF_Office" customModuleProvider="target">
+                            <rect key="frame" x="16" y="0.0" width="212" height="22"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="22" id="BLq-SW-oti"/>
+                            </constraints>
+                        </customView>
+                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="rPN-Fl-aJM">
+                            <rect key="frame" x="16" y="30" width="212" height="32"/>
+                            <subviews>
+                                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="vb4-xX-AVH">
+                                    <rect key="frame" x="6" y="8" width="176" height="16"/>
+                                    <textFieldCell key="cell" lineBreakMode="clipping" title="Creat single Worksheet for..." id="f8p-kU-hGt">
+                                        <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>
+                                <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="ujy-dq-yjg">
+                                    <rect key="frame" x="192" y="10" width="12" height="12"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="12" id="7BD-17-cFM"/>
+                                        <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="12" id="7a8-rt-d53"/>
+                                        <constraint firstAttribute="height" constant="12" id="bL1-AK-vQZ"/>
+                                        <constraint firstAttribute="width" constant="12" id="f9d-zr-y3s"/>
+                                    </constraints>
+                                    <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="btn_arrow_gray_down_s_norm_on" id="BsR-kZ-bx0"/>
+                                </imageView>
+                                <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ZnQ-TM-Fwz">
+                                    <rect key="frame" x="0.0" y="0.0" width="212" height="32"/>
+                                    <buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" alignment="center" imageScaling="proportionallyDown" inset="2" id="mKN-6s-lDk">
+                                        <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                        <font key="font" metaFont="system"/>
+                                    </buttonCell>
+                                    <connections>
+                                        <action selector="tablesTypeButtonAction:" target="-2" id="YNH-f4-mzl"/>
+                                    </connections>
+                                </button>
+                            </subviews>
+                            <constraints>
+                                <constraint firstItem="vb4-xX-AVH" firstAttribute="leading" secondItem="rPN-Fl-aJM" secondAttribute="leading" constant="8" id="0B7-ei-74y"/>
+                                <constraint firstAttribute="trailing" secondItem="ZnQ-TM-Fwz" secondAttribute="trailing" id="5P7-uh-EzI"/>
+                                <constraint firstAttribute="bottom" secondItem="ZnQ-TM-Fwz" secondAttribute="bottom" id="LPu-oT-lyw"/>
+                                <constraint firstItem="ujy-dq-yjg" firstAttribute="centerY" secondItem="rPN-Fl-aJM" secondAttribute="centerY" id="UTY-Bh-1kl"/>
+                                <constraint firstItem="ZnQ-TM-Fwz" firstAttribute="leading" secondItem="rPN-Fl-aJM" secondAttribute="leading" id="XPb-dP-GtQ"/>
+                                <constraint firstAttribute="trailing" secondItem="ujy-dq-yjg" secondAttribute="trailing" constant="8" id="dte-Qh-BoO"/>
+                                <constraint firstAttribute="trailing" secondItem="vb4-xX-AVH" secondAttribute="trailing" constant="32" id="jhT-Na-DiP"/>
+                                <constraint firstItem="vb4-xX-AVH" firstAttribute="centerY" secondItem="rPN-Fl-aJM" secondAttribute="centerY" id="meb-ej-UB6"/>
+                                <constraint firstItem="ZnQ-TM-Fwz" firstAttribute="top" secondItem="rPN-Fl-aJM" secondAttribute="top" id="nZw-4Q-Gf5"/>
+                                <constraint firstAttribute="height" constant="32" id="rgc-Q7-p2W"/>
+                            </constraints>
+                        </customView>
+                    </subviews>
+                    <constraints>
+                        <constraint firstAttribute="trailing" secondItem="amw-qD-Bei" secondAttribute="trailing" constant="16" id="0JF-kS-D9J"/>
+                        <constraint firstItem="rPN-Fl-aJM" firstAttribute="leading" secondItem="LbV-4M-wTH" secondAttribute="leading" constant="16" id="8CB-GC-6VH"/>
+                        <constraint firstItem="mH7-tW-KNc" firstAttribute="leading" secondItem="LbV-4M-wTH" secondAttribute="leading" constant="16" id="EzD-bm-t4n"/>
+                        <constraint firstItem="amw-qD-Bei" firstAttribute="leading" secondItem="LbV-4M-wTH" secondAttribute="leading" constant="16" id="IV3-7p-OiB"/>
+                        <constraint firstItem="Iwz-rs-g8Z" firstAttribute="top" secondItem="LbV-4M-wTH" secondAttribute="top" id="LBx-E1-iRe"/>
+                        <constraint firstAttribute="trailing" secondItem="rPN-Fl-aJM" secondAttribute="trailing" constant="16" id="NJC-cK-jif"/>
+                        <constraint firstAttribute="height" constant="224" id="Oqk-Yp-Hqu"/>
+                        <constraint firstAttribute="trailing" secondItem="mH7-tW-KNc" secondAttribute="trailing" constant="16" id="VzD-9b-jVo"/>
+                        <constraint firstItem="sWP-m1-CvH" firstAttribute="top" secondItem="Iwz-rs-g8Z" secondAttribute="bottom" constant="8" id="Xwe-7p-dRP"/>
+                        <constraint firstAttribute="trailing" secondItem="sWP-m1-CvH" secondAttribute="trailing" constant="16" id="bYB-kp-Njo"/>
+                        <constraint firstAttribute="trailing" secondItem="UQx-5V-Fdc" secondAttribute="trailing" constant="16" id="dre-v1-4z4"/>
+                        <constraint firstItem="sWP-m1-CvH" firstAttribute="leading" secondItem="LbV-4M-wTH" secondAttribute="leading" constant="16" id="dxS-E9-WIh"/>
+                        <constraint firstItem="UQx-5V-Fdc" firstAttribute="top" secondItem="rPN-Fl-aJM" secondAttribute="bottom" constant="8" id="fJN-FZ-L6w"/>
+                        <constraint firstItem="amw-qD-Bei" firstAttribute="top" secondItem="sWP-m1-CvH" secondAttribute="bottom" constant="8" id="gQW-cg-Pd4"/>
+                        <constraint firstItem="Iwz-rs-g8Z" firstAttribute="leading" secondItem="LbV-4M-wTH" secondAttribute="leading" constant="16" id="kM7-gr-3do"/>
+                        <constraint firstItem="mH7-tW-KNc" firstAttribute="top" secondItem="amw-qD-Bei" secondAttribute="bottom" constant="8" id="lqb-dD-2jV"/>
+                        <constraint firstItem="UQx-5V-Fdc" firstAttribute="leading" secondItem="LbV-4M-wTH" secondAttribute="leading" constant="16" id="pnj-cN-tHx"/>
+                        <constraint firstItem="rPN-Fl-aJM" firstAttribute="top" secondItem="mH7-tW-KNc" secondAttribute="bottom" constant="8" id="w5s-sq-5gs"/>
+                    </constraints>
+                </customView>
+                <customView translatesAutoresizingMaskIntoConstraints="NO" id="sYQ-Tb-lbQ" customClass="KMBatchTextRecognitionView" customModule="PDF_Office" customModuleProvider="target">
+                    <rect key="frame" x="0.0" y="23" width="244" height="90"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="90" id="pEU-cV-tD7"/>
+                    </constraints>
+                </customView>
+            </subviews>
+            <constraints>
+                <constraint firstItem="sYQ-Tb-lbQ" firstAttribute="top" secondItem="LbV-4M-wTH" secondAttribute="bottom" constant="16" id="Kfo-Qc-I94"/>
+                <constraint firstAttribute="trailing" secondItem="sYQ-Tb-lbQ" secondAttribute="trailing" id="QuV-3Z-UHN"/>
+                <constraint firstAttribute="trailing" secondItem="LbV-4M-wTH" secondAttribute="trailing" id="n9M-5h-pWQ"/>
+                <constraint firstItem="LbV-4M-wTH" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" id="o1t-hl-CkX"/>
+                <constraint firstItem="sYQ-Tb-lbQ" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" id="s52-nl-QGC"/>
+                <constraint firstItem="LbV-4M-wTH" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" id="wns-Ch-1WA"/>
+            </constraints>
+            <point key="canvasLocation" x="54" y="189.5"/>
+        </customView>
+    </objects>
+    <resources>
+        <image name="btn_arrow_gray_down_s_norm_on" width="12" height="12"/>
+    </resources>
+</document>

+ 93 - 0
PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Views/Image/KMBatchConverPDFImageView.swift

@@ -0,0 +1,93 @@
+//
+//  KMBatchConverPDFImageView.swift
+//  PDF Office
+//
+//  Created by lizhe on 2023/1/30.
+//
+
+import Cocoa
+
+class KMBatchConverPDFImageView: KMBatchConvertPDFItemView {
+    
+    @IBOutlet var contentView: NSView!
+    
+    @IBOutlet weak var settingLabel: NSTextField!
+    @IBOutlet weak var retainFlowingTextButton: KMImageTitleButton!
+    @IBOutlet weak var retainPageLayoutButton: KMImageTitleButton!
+    
+    @IBOutlet weak var textRecognitionView: KMBatchTextRecognitionView!
+    override func draw(_ dirtyRect: NSRect) {
+        super.draw(dirtyRect)
+
+        // Drawing code here.
+    }
+    
+    // MARK: 初始化
+    public required init?(coder decoder: NSCoder) {
+        super.init(coder: decoder)
+        initContentView()
+        setup()
+    }
+    
+    override init(frame frameRect: NSRect) {
+        super.init(frame: frameRect)
+        initContentView()
+        setup()
+    }
+    
+    private func initContentView() {
+        //绑定xib
+        let resource = NSNib(nibNamed: String(describing: KMBatchConverPDFImageView.self),
+                             bundle: Bundle(for: KMBatchConverPDFImageView.self))!
+        resource.instantiate(withOwner: self, topLevelObjects: nil)
+        addSubview(contentView)
+        contentView.translatesAutoresizingMaskIntoConstraints = false
+        NSLayoutConstraint.activate([
+            contentView.topAnchor.constraint(equalTo: topAnchor),
+            contentView.leftAnchor.constraint(equalTo: leftAnchor),
+            contentView.rightAnchor.constraint(equalTo: rightAnchor),
+            contentView.bottomAnchor.constraint(equalTo: bottomAnchor)])
+        contentView.updateConstraintsForSubtreeIfNeeded()
+    }
+    
+    func setup() {
+        self.retainFlowingTextButton.title = NSLocalizedString("Retain Flowing Text", comment: "")
+        self.retainFlowingTextButton.imageName = "btn_radio_unsel_on"
+        self.retainFlowingTextButton.action = { [unowned self] (view, button) in
+            self.presenter.retainFlowingTextAction(button: button)
+        }
+        
+        self.retainPageLayoutButton.title = NSLocalizedString("Retain Page Layout", comment: "")
+        self.retainPageLayoutButton.imageName = "btn_radio_unsel_on"
+        self.retainPageLayoutButton.action = { view, button in
+            self.presenter.retainPageLayoutAction(button: button)
+        }
+        
+        self.reloadData()
+    }
+    
+    override func reloadData() {
+        self.textRecognitionView.data = self.data
+        self.textRecognitionView.presenter = self.presenter
+        self.textRecognitionView.type = self.type
+        self.textRecognitionView.reloadData()
+        
+        self.retainFlowingTextButton.imageName = "btn_radio_unsel_on"
+        self.retainPageLayoutButton.imageName = "btn_radio_unsel_on"
+        
+        switch data.layoutSettingType {
+        case .flowingText:
+            self.retainFlowingTextButton.imageName = "btn_radio_sel_on"
+        case .pageLayout:
+            self.retainPageLayoutButton.imageName = "btn_radio_sel_on"
+        }
+    }
+    
+}
+
+
+protocol KMBatchConverPDFImageViewAction {}
+extension KMBatchConverPDFImageView: KMBatchConverPDFImageViewAction {
+
+}
+

+ 18 - 0
PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Views/Image/KMBatchConverPDFImageView.xib

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21507" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21507"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMBatchConverPDFImageView" customModule="PDF_Office" customModuleProvider="target"/>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customView id="c22-O7-iKe">
+            <rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <point key="canvasLocation" x="-34" y="154"/>
+        </customView>
+    </objects>
+</document>

+ 93 - 0
PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Views/PPT/KMBatchConverPDFPPTView.swift

@@ -0,0 +1,93 @@
+//
+//  KMBatchConverPDFPPTView.swift
+//  PDF Office
+//
+//  Created by lizhe on 2023/1/30.
+//
+
+import Cocoa
+
+class KMBatchConverPDFPPTView: KMBatchConvertPDFItemView {
+    
+    @IBOutlet var contentView: NSView!
+    
+    @IBOutlet weak var settingLabel: NSTextField!
+    @IBOutlet weak var retainFlowingTextButton: KMImageTitleButton!
+    @IBOutlet weak var retainPageLayoutButton: KMImageTitleButton!
+    
+    @IBOutlet weak var textRecognitionView: KMBatchTextRecognitionView!
+    override func draw(_ dirtyRect: NSRect) {
+        super.draw(dirtyRect)
+
+        // Drawing code here.
+    }
+    
+    // MARK: 初始化
+    public required init?(coder decoder: NSCoder) {
+        super.init(coder: decoder)
+        initContentView()
+        setup()
+    }
+    
+    override init(frame frameRect: NSRect) {
+        super.init(frame: frameRect)
+        initContentView()
+        setup()
+    }
+    
+    private func initContentView() {
+        //绑定xib
+        let resource = NSNib(nibNamed: String(describing: KMBatchConverPDFPPTView.self),
+                             bundle: Bundle(for: KMBatchConverPDFPPTView.self))!
+        resource.instantiate(withOwner: self, topLevelObjects: nil)
+        addSubview(contentView)
+        contentView.translatesAutoresizingMaskIntoConstraints = false
+        NSLayoutConstraint.activate([
+            contentView.topAnchor.constraint(equalTo: topAnchor),
+            contentView.leftAnchor.constraint(equalTo: leftAnchor),
+            contentView.rightAnchor.constraint(equalTo: rightAnchor),
+            contentView.bottomAnchor.constraint(equalTo: bottomAnchor)])
+        contentView.updateConstraintsForSubtreeIfNeeded()
+    }
+    
+    func setup() {
+        self.retainFlowingTextButton.title = NSLocalizedString("Retain Flowing Text", comment: "")
+        self.retainFlowingTextButton.imageName = "btn_radio_unsel_on"
+        self.retainFlowingTextButton.action = { [unowned self] (view, button) in
+            self.presenter.retainFlowingTextAction(button: button)
+        }
+        
+        self.retainPageLayoutButton.title = NSLocalizedString("Retain Page Layout", comment: "")
+        self.retainPageLayoutButton.imageName = "btn_radio_unsel_on"
+        self.retainPageLayoutButton.action = { view, button in
+            self.presenter.retainPageLayoutAction(button: button)
+        }
+        
+        self.reloadData()
+    }
+    
+    override func reloadData() {
+        self.textRecognitionView.data = self.data
+        self.textRecognitionView.presenter = self.presenter
+        self.textRecognitionView.type = self.type
+        self.textRecognitionView.reloadData()
+        
+        self.retainFlowingTextButton.imageName = "btn_radio_unsel_on"
+        self.retainPageLayoutButton.imageName = "btn_radio_unsel_on"
+        
+        switch data.layoutSettingType {
+        case .flowingText:
+            self.retainFlowingTextButton.imageName = "btn_radio_sel_on"
+        case .pageLayout:
+            self.retainPageLayoutButton.imageName = "btn_radio_sel_on"
+        }
+    }
+    
+}
+
+
+protocol KMBatchConverPDFPPTViewAction {}
+extension KMBatchConverPDFPPTView: KMBatchConverPDFPPTViewAction {
+
+}
+

+ 18 - 0
PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Views/PPT/KMBatchConverPDFPPTView.xib

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21507" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21507"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMBatchConverPDFPPTView" customModule="PDF_Office" customModuleProvider="target"/>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customView id="c22-O7-iKe">
+            <rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <point key="canvasLocation" x="39" y="-72"/>
+        </customView>
+    </objects>
+</document>

+ 87 - 0
PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Views/TextRecognition/KMBatchTextRecognitionView.swift

@@ -0,0 +1,87 @@
+//
+//  KMBatchTextRecognitionView.swift
+//  PDF Office
+//
+//  Created by lizhe on 2023/1/29.
+//
+
+import Cocoa
+
+class KMBatchTextRecognitionView: KMBatchConvertPDFItemView {
+    
+    
+    @IBOutlet var contentView: NSView!
+    @IBOutlet weak var textRecognitionSettingLabel: NSTextField!
+    @IBOutlet weak var recognizeTextButton: KMImageTitleButton!
+    @IBOutlet weak var languageLabel: NSTextField!
+    
+    override func draw(_ dirtyRect: NSRect) {
+        super.draw(dirtyRect)
+
+        // Drawing code here.
+    }
+    
+    // MARK: 初始化
+    public required init?(coder decoder: NSCoder) {
+        super.init(coder: decoder)
+        initContentView()
+        setup()
+    }
+    
+    override init(frame frameRect: NSRect) {
+        super.init(frame: frameRect)
+        initContentView()
+        setup()
+    }
+    
+    private func initContentView() {
+        //绑定xib
+        let resource = NSNib(nibNamed: String(describing: KMBatchTextRecognitionView.self),
+                             bundle: Bundle(for: KMBatchTextRecognitionView.self))!
+        resource.instantiate(withOwner: self, topLevelObjects: nil)
+        addSubview(contentView)
+        contentView.translatesAutoresizingMaskIntoConstraints = false
+        NSLayoutConstraint.activate([
+            contentView.topAnchor.constraint(equalTo: topAnchor),
+            contentView.leftAnchor.constraint(equalTo: leftAnchor),
+            contentView.rightAnchor.constraint(equalTo: rightAnchor),
+            contentView.bottomAnchor.constraint(equalTo: bottomAnchor)])
+        contentView.updateConstraintsForSubtreeIfNeeded()
+    }
+    
+    func setup() {
+        self.recognizeTextButton.title = NSLocalizedString("Recognize text if needed", comment: "")
+        self.recognizeTextButton.imageName = "btn_checkbox_unsel_on"
+        self.recognizeTextButton.action = { [unowned self] (view, button) in
+            self.presenter.needRecognizeTextAction(button: button)
+        }
+        
+        self.reloadData()
+    }
+    
+    override func reloadData() {
+        if data.needRecognizeText {
+            self.recognizeTextButton.imageName = "btn_checkbox_sel_on"
+        } else {
+            self.recognizeTextButton.imageName = "btn_checkbox_unsel_on"
+        }
+    }
+    
+}
+
+protocol KMBatchTextRecognitionViewAction {}
+extension KMBatchTextRecognitionView: KMBatchTextRecognitionViewAction {
+    @IBAction func languageAction(_ sender: NSButton) {
+        let menu = NSMenu()
+        menu.minimumWidth = sender.frame.size.width
+        for string in KMOCRLanguageType.allValues() {
+            menu.addItem(withTitle: NSLocalizedString(string, comment: ""), action: #selector(self.languageClick), target: self)
+        }
+        menu.popUp(positioning: menu.item(at: 0), at: CGPoint(x: 0, y: (sender ).fittingSize.height), in: sender)
+    }
+
+    @objc func languageClick(item: NSMenuItem) {
+        self.languageLabel.stringValue = item.title
+    }
+}
+

+ 113 - 0
PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Views/TextRecognition/KMBatchTextRecognitionView.xib

@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21507" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21507"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMBatchTextRecognitionView" customModule="PDF_Office" customModuleProvider="target">
+            <connections>
+                <outlet property="contentView" destination="c22-O7-iKe" id="p0m-iV-FYR"/>
+                <outlet property="languageLabel" destination="BRR-SX-d21" id="tyH-C5-s6A"/>
+                <outlet property="recognizeTextButton" destination="EJe-6n-OJK" id="sWt-H4-wZf"/>
+                <outlet property="textRecognitionSettingLabel" destination="A9w-b9-Y78" id="wrk-ZE-vbz"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customView id="c22-O7-iKe">
+            <rect key="frame" x="0.0" y="0.0" width="271" height="90"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <customView translatesAutoresizingMaskIntoConstraints="NO" id="8EO-k6-nvn">
+                    <rect key="frame" x="0.0" y="0.0" width="271" height="90"/>
+                    <subviews>
+                        <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="A9w-b9-Y78">
+                            <rect key="frame" x="14" y="70" width="159" height="20"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="20" id="1FO-r7-WDh"/>
+                            </constraints>
+                            <textFieldCell key="cell" lineBreakMode="clipping" title="Text Recognition Settings" id="ykN-KN-abT">
+                                <font key="font" usesAppearanceFont="YES"/>
+                                <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                            </textFieldCell>
+                        </textField>
+                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="3M9-V9-HPM">
+                            <rect key="frame" x="16" y="0.0" width="239" height="32"/>
+                            <subviews>
+                                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="BRR-SX-d21">
+                                    <rect key="frame" x="6" y="8" width="48" height="16"/>
+                                    <textFieldCell key="cell" lineBreakMode="clipping" title="English" id="Rk7-jG-Rlr">
+                                        <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>
+                                <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="lI9-Q1-0yN">
+                                    <rect key="frame" x="219" y="10" width="12" height="12"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="12" id="9lr-lo-Htt"/>
+                                        <constraint firstAttribute="height" constant="12" id="byE-b1-3w8"/>
+                                        <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="12" id="fGv-JA-FeZ"/>
+                                        <constraint firstAttribute="width" constant="12" id="vHz-iv-nNG"/>
+                                    </constraints>
+                                    <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="btn_arrow_gray_down_s_norm_on" id="PBc-2w-dNL"/>
+                                </imageView>
+                                <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1gg-tk-Tnt">
+                                    <rect key="frame" x="0.0" y="0.0" width="239" height="32"/>
+                                    <buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" alignment="center" imageScaling="proportionallyDown" inset="2" id="ZWF-Wv-Gcl">
+                                        <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                        <font key="font" metaFont="system"/>
+                                    </buttonCell>
+                                    <connections>
+                                        <action selector="languageAction:" target="-2" id="vBU-TZ-w4X"/>
+                                    </connections>
+                                </button>
+                            </subviews>
+                            <constraints>
+                                <constraint firstItem="1gg-tk-Tnt" firstAttribute="top" secondItem="3M9-V9-HPM" secondAttribute="top" id="6tI-Q2-MTt"/>
+                                <constraint firstAttribute="height" constant="32" id="77o-ms-mu5"/>
+                                <constraint firstItem="BRR-SX-d21" firstAttribute="centerY" secondItem="3M9-V9-HPM" secondAttribute="centerY" id="7hf-d8-ll6"/>
+                                <constraint firstAttribute="trailing" secondItem="lI9-Q1-0yN" secondAttribute="trailing" constant="8" id="Ain-s7-DIL"/>
+                                <constraint firstAttribute="trailing" secondItem="1gg-tk-Tnt" secondAttribute="trailing" id="SDz-NJ-aBU"/>
+                                <constraint firstItem="BRR-SX-d21" firstAttribute="leading" secondItem="3M9-V9-HPM" secondAttribute="leading" constant="8" id="hGi-Fb-de4"/>
+                                <constraint firstItem="lI9-Q1-0yN" firstAttribute="centerY" secondItem="3M9-V9-HPM" secondAttribute="centerY" id="n02-4h-V4r"/>
+                                <constraint firstItem="1gg-tk-Tnt" firstAttribute="leading" secondItem="3M9-V9-HPM" secondAttribute="leading" id="xmb-8G-VtL"/>
+                                <constraint firstAttribute="bottom" secondItem="1gg-tk-Tnt" secondAttribute="bottom" id="ygI-Bl-f4W"/>
+                            </constraints>
+                        </customView>
+                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="EJe-6n-OJK" customClass="KMImageTitleButton" customModule="PDF_Office" customModuleProvider="target">
+                            <rect key="frame" x="16" y="40" width="239" height="22"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="22" id="rd8-FA-G5G"/>
+                            </constraints>
+                        </customView>
+                    </subviews>
+                    <constraints>
+                        <constraint firstItem="3M9-V9-HPM" firstAttribute="leading" secondItem="8EO-k6-nvn" secondAttribute="leading" constant="16" id="2K9-pe-ER6"/>
+                        <constraint firstItem="EJe-6n-OJK" firstAttribute="top" secondItem="A9w-b9-Y78" secondAttribute="bottom" constant="8" id="Ae5-br-M4G"/>
+                        <constraint firstItem="EJe-6n-OJK" firstAttribute="leading" secondItem="8EO-k6-nvn" secondAttribute="leading" constant="16" id="D5U-Eu-0zc"/>
+                        <constraint firstItem="A9w-b9-Y78" firstAttribute="leading" secondItem="8EO-k6-nvn" secondAttribute="leading" constant="16" id="Ive-Vj-HsB"/>
+                        <constraint firstAttribute="trailing" secondItem="EJe-6n-OJK" secondAttribute="trailing" constant="16" id="XWx-hY-UV8"/>
+                        <constraint firstItem="3M9-V9-HPM" firstAttribute="top" secondItem="EJe-6n-OJK" secondAttribute="bottom" constant="8" id="iAA-lp-IF9"/>
+                        <constraint firstItem="A9w-b9-Y78" firstAttribute="top" secondItem="8EO-k6-nvn" secondAttribute="top" id="lY0-y8-Gx7"/>
+                        <constraint firstAttribute="trailing" secondItem="3M9-V9-HPM" secondAttribute="trailing" constant="16" id="sD0-aY-EWo"/>
+                        <constraint firstAttribute="height" constant="90" id="wZL-1Z-gNO"/>
+                    </constraints>
+                </customView>
+            </subviews>
+            <constraints>
+                <constraint firstAttribute="bottom" secondItem="8EO-k6-nvn" secondAttribute="bottom" id="Qq2-Wp-Ngi"/>
+                <constraint firstAttribute="trailing" secondItem="8EO-k6-nvn" secondAttribute="trailing" id="c1F-Ev-Fjf"/>
+                <constraint firstItem="8EO-k6-nvn" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" id="cas-3O-LSM"/>
+                <constraint firstItem="8EO-k6-nvn" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" id="jAA-0p-NpJ"/>
+            </constraints>
+            <point key="canvasLocation" x="-53.5" y="234"/>
+        </customView>
+    </objects>
+    <resources>
+        <image name="btn_arrow_gray_down_s_norm_on" width="12" height="12"/>
+    </resources>
+</document>

+ 92 - 0
PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Views/Word/KMBatchConverPDFWordView.swift

@@ -0,0 +1,92 @@
+//
+//  KMBatchConverPDFWordView.swift
+//  PDF Office
+//
+//  Created by lizhe on 2023/1/29.
+//
+
+import Cocoa
+
+class KMBatchConverPDFWordView: KMBatchConvertPDFItemView {
+
+    @IBOutlet var contentView: NSView!
+    
+    @IBOutlet weak var settingLabel: NSTextField!
+    @IBOutlet weak var retainFlowingTextButton: KMImageTitleButton!
+    @IBOutlet weak var retainPageLayoutButton: KMImageTitleButton!
+    
+    @IBOutlet weak var textRecognitionView: KMBatchTextRecognitionView!
+    override func draw(_ dirtyRect: NSRect) {
+        super.draw(dirtyRect)
+
+        // Drawing code here.
+    }
+    
+    // MARK: 初始化
+    public required init?(coder decoder: NSCoder) {
+        super.init(coder: decoder)
+        initContentView()
+        setup()
+    }
+    
+    override init(frame frameRect: NSRect) {
+        super.init(frame: frameRect)
+        initContentView()
+        setup()
+    }
+    
+    private func initContentView() {
+        //绑定xib
+        let resource = NSNib(nibNamed: String(describing: KMBatchConverPDFWordView.self),
+                             bundle: Bundle(for: KMBatchConverPDFWordView.self))!
+        resource.instantiate(withOwner: self, topLevelObjects: nil)
+        addSubview(contentView)
+        contentView.translatesAutoresizingMaskIntoConstraints = false
+        NSLayoutConstraint.activate([
+            contentView.topAnchor.constraint(equalTo: topAnchor),
+            contentView.leftAnchor.constraint(equalTo: leftAnchor),
+            contentView.rightAnchor.constraint(equalTo: rightAnchor),
+            contentView.bottomAnchor.constraint(equalTo: bottomAnchor)])
+        contentView.updateConstraintsForSubtreeIfNeeded()
+    }
+    
+    func setup() {
+        self.retainFlowingTextButton.title = NSLocalizedString("Retain Flowing Text", comment: "")
+        self.retainFlowingTextButton.imageName = "btn_radio_unsel_on"
+        self.retainFlowingTextButton.action = { [unowned self] (view, button) in
+            self.presenter.retainFlowingTextAction(button: button)
+        }
+        
+        self.retainPageLayoutButton.title = NSLocalizedString("Retain Page Layout", comment: "")
+        self.retainPageLayoutButton.imageName = "btn_radio_unsel_on"
+        self.retainPageLayoutButton.action = { view, button in
+            self.presenter.retainPageLayoutAction(button: button)
+        }
+        
+        self.reloadData()
+    }
+    
+    override func reloadData() {
+        self.textRecognitionView.data = self.data
+        self.textRecognitionView.presenter = self.presenter
+        self.textRecognitionView.type = self.type
+        self.textRecognitionView.reloadData()
+        
+        self.retainFlowingTextButton.imageName = "btn_radio_unsel_on"
+        self.retainPageLayoutButton.imageName = "btn_radio_unsel_on"
+        
+        switch data.layoutSettingType {
+        case .flowingText:
+            self.retainFlowingTextButton.imageName = "btn_radio_sel_on"
+        case .pageLayout:
+            self.retainPageLayoutButton.imageName = "btn_radio_sel_on"
+        }
+    }
+    
+}
+
+
+protocol KMBatchConverPDFWordViewAction {}
+extension KMBatchConverPDFWordView: KMBatchConverPDFWordViewAction {
+
+}

+ 81 - 0
PDF Office/PDF Office/Class/PDFTools/Batch/View/Choose/ConvertPDF/Views/Word/KMBatchConverPDFWordView.xib

@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21507" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21507"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMBatchConverPDFWordView" customModule="PDF_Office" customModuleProvider="target">
+            <connections>
+                <outlet property="contentView" destination="c22-O7-iKe" id="qcG-Jb-ZRY"/>
+                <outlet property="retainFlowingTextButton" destination="8wi-vp-arW" id="cyA-aK-UsI"/>
+                <outlet property="retainPageLayoutButton" destination="wLJ-LL-Okl" id="R00-Wd-YBx"/>
+                <outlet property="settingLabel" destination="7Q1-ZH-mSi" id="BYj-gq-fjD"/>
+                <outlet property="textRecognitionView" destination="XeF-HB-jky" id="oFi-ai-pth"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customView id="c22-O7-iKe">
+            <rect key="frame" x="0.0" y="0.0" width="218" height="305"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <customView translatesAutoresizingMaskIntoConstraints="NO" id="hIU-Qp-2Fm">
+                    <rect key="frame" x="0.0" y="225" width="218" height="80"/>
+                    <subviews>
+                        <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="7Q1-ZH-mSi">
+                            <rect key="frame" x="14" y="60" width="99" height="20"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="20" id="HOw-sJ-17X"/>
+                            </constraints>
+                            <textFieldCell key="cell" lineBreakMode="clipping" title="Layout Settings" id="2wz-C2-YRo">
+                                <font key="font" usesAppearanceFont="YES"/>
+                                <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                            </textFieldCell>
+                        </textField>
+                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="8wi-vp-arW" customClass="KMImageTitleButton" customModule="PDF_Office" customModuleProvider="target">
+                            <rect key="frame" x="16" y="30" width="186" height="22"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="22" id="gYm-Mu-ywc"/>
+                            </constraints>
+                        </customView>
+                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="wLJ-LL-Okl" customClass="KMImageTitleButton" customModule="PDF_Office" customModuleProvider="target">
+                            <rect key="frame" x="16" y="0.0" width="186" height="22"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="22" id="nzd-Uh-GxW"/>
+                            </constraints>
+                        </customView>
+                    </subviews>
+                    <constraints>
+                        <constraint firstItem="wLJ-LL-Okl" firstAttribute="leading" secondItem="hIU-Qp-2Fm" secondAttribute="leading" constant="16" id="0cA-8l-ahF"/>
+                        <constraint firstItem="8wi-vp-arW" firstAttribute="leading" secondItem="hIU-Qp-2Fm" secondAttribute="leading" constant="16" id="7zs-6g-qUa"/>
+                        <constraint firstItem="7Q1-ZH-mSi" firstAttribute="leading" secondItem="hIU-Qp-2Fm" secondAttribute="leading" constant="16" id="9I1-oP-cvR"/>
+                        <constraint firstItem="wLJ-LL-Okl" firstAttribute="top" secondItem="8wi-vp-arW" secondAttribute="bottom" constant="8" id="G35-AD-jWy"/>
+                        <constraint firstAttribute="trailing" secondItem="8wi-vp-arW" secondAttribute="trailing" constant="16" id="NDV-JL-13h"/>
+                        <constraint firstAttribute="height" constant="80" id="QpS-2j-kDo"/>
+                        <constraint firstItem="8wi-vp-arW" firstAttribute="top" secondItem="7Q1-ZH-mSi" secondAttribute="bottom" constant="8" id="vAC-ET-4mY"/>
+                        <constraint firstItem="7Q1-ZH-mSi" firstAttribute="top" secondItem="hIU-Qp-2Fm" secondAttribute="top" id="wI4-qF-409"/>
+                        <constraint firstAttribute="trailing" secondItem="wLJ-LL-Okl" secondAttribute="trailing" constant="16" id="z3O-sh-Gxa"/>
+                    </constraints>
+                </customView>
+                <customView translatesAutoresizingMaskIntoConstraints="NO" id="XeF-HB-jky" customClass="KMBatchTextRecognitionView" customModule="PDF_Office" customModuleProvider="target">
+                    <rect key="frame" x="0.0" y="119" width="218" height="90"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="90" id="S9x-qc-Gfd"/>
+                    </constraints>
+                </customView>
+            </subviews>
+            <constraints>
+                <constraint firstItem="hIU-Qp-2Fm" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" id="2oR-8k-sey"/>
+                <constraint firstItem="XeF-HB-jky" firstAttribute="top" secondItem="hIU-Qp-2Fm" secondAttribute="bottom" constant="16" id="6qA-cf-e4q"/>
+                <constraint firstItem="hIU-Qp-2Fm" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" id="AAo-oe-atP"/>
+                <constraint firstAttribute="trailing" secondItem="hIU-Qp-2Fm" secondAttribute="trailing" id="cfw-oO-fBx"/>
+                <constraint firstItem="XeF-HB-jky" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" id="iEf-1S-wT3"/>
+                <constraint firstAttribute="trailing" secondItem="XeF-HB-jky" secondAttribute="trailing" id="z2Y-V2-cVx"/>
+            </constraints>
+            <point key="canvasLocation" x="-91" y="283.5"/>
+        </customView>
+    </objects>
+</document>