فهرست منبع

页面编辑-新增提取设置窗口和提取功能以及菜单提前功能

tangchao 2 سال پیش
والد
کامیت
fe783ff747

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

@@ -1459,6 +1459,21 @@
 		BBC745F7296178BD0072C2ED /* KMCropTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBC745F6296178BD0072C2ED /* KMCropTools.swift */; };
 		BBC745F8296178BD0072C2ED /* KMCropTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBC745F6296178BD0072C2ED /* KMCropTools.swift */; };
 		BBC745F9296178BD0072C2ED /* KMCropTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBC745F6296178BD0072C2ED /* KMCropTools.swift */; };
+		BBD1F77C296F9BE000343885 /* KMPageEditSettingBaseWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD1F77A296F9BE000343885 /* KMPageEditSettingBaseWindowController.swift */; };
+		BBD1F77D296F9BE000343885 /* KMPageEditSettingBaseWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD1F77A296F9BE000343885 /* KMPageEditSettingBaseWindowController.swift */; };
+		BBD1F77E296F9BE000343885 /* KMPageEditSettingBaseWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD1F77A296F9BE000343885 /* KMPageEditSettingBaseWindowController.swift */; };
+		BBD1F77F296F9BE000343885 /* KMPageEditSettingBaseWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBD1F77B296F9BE000343885 /* KMPageEditSettingBaseWindowController.xib */; };
+		BBD1F780296F9BE000343885 /* KMPageEditSettingBaseWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBD1F77B296F9BE000343885 /* KMPageEditSettingBaseWindowController.xib */; };
+		BBD1F781296F9BE000343885 /* KMPageEditSettingBaseWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBD1F77B296F9BE000343885 /* KMPageEditSettingBaseWindowController.xib */; };
+		BBD1F783296F9DB500343885 /* KMPageEditExtractWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD1F782296F9DB500343885 /* KMPageEditExtractWindowController.swift */; };
+		BBD1F784296F9DB500343885 /* KMPageEditExtractWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD1F782296F9DB500343885 /* KMPageEditExtractWindowController.swift */; };
+		BBD1F785296F9DB500343885 /* KMPageEditExtractWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD1F782296F9DB500343885 /* KMPageEditExtractWindowController.swift */; };
+		BBD1F787296FAC7C00343885 /* KMPageEditSettingBaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD1F786296FAC7C00343885 /* KMPageEditSettingBaseView.swift */; };
+		BBD1F788296FAC7C00343885 /* KMPageEditSettingBaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD1F786296FAC7C00343885 /* KMPageEditSettingBaseView.swift */; };
+		BBD1F789296FAC7C00343885 /* KMPageEditSettingBaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD1F786296FAC7C00343885 /* KMPageEditSettingBaseView.swift */; };
+		BBD1F78B296FACA300343885 /* KMPageEditExtractSettingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD1F78A296FACA300343885 /* KMPageEditExtractSettingView.swift */; };
+		BBD1F78C296FACA300343885 /* KMPageEditExtractSettingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD1F78A296FACA300343885 /* KMPageEditExtractSettingView.swift */; };
+		BBD1F78D296FACA300343885 /* KMPageEditExtractSettingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD1F78A296FACA300343885 /* KMPageEditExtractSettingView.swift */; };
 		BBEC00A4295BD42D00A26C98 /* KMHeaderFooterPageInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBEC00A3295BD42D00A26C98 /* KMHeaderFooterPageInfoView.swift */; };
 		BBEC00A5295BD42D00A26C98 /* KMHeaderFooterPageInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBEC00A3295BD42D00A26C98 /* KMHeaderFooterPageInfoView.swift */; };
 		BBEC00A6295BD42D00A26C98 /* KMHeaderFooterPageInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBEC00A3295BD42D00A26C98 /* KMHeaderFooterPageInfoView.swift */; };
@@ -2394,6 +2409,11 @@
 		BBC745E9295F067B0072C2ED /* KMCropSettingWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMCropSettingWindowController.xib; sourceTree = "<group>"; };
 		BBC745F1295F0DD00072C2ED /* KMCropSettingPageSizeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMCropSettingPageSizeView.swift; sourceTree = "<group>"; };
 		BBC745F6296178BD0072C2ED /* KMCropTools.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMCropTools.swift; sourceTree = "<group>"; };
+		BBD1F77A296F9BE000343885 /* KMPageEditSettingBaseWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPageEditSettingBaseWindowController.swift; sourceTree = "<group>"; };
+		BBD1F77B296F9BE000343885 /* KMPageEditSettingBaseWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMPageEditSettingBaseWindowController.xib; sourceTree = "<group>"; };
+		BBD1F782296F9DB500343885 /* KMPageEditExtractWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPageEditExtractWindowController.swift; sourceTree = "<group>"; };
+		BBD1F786296FAC7C00343885 /* KMPageEditSettingBaseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPageEditSettingBaseView.swift; sourceTree = "<group>"; };
+		BBD1F78A296FACA300343885 /* KMPageEditExtractSettingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPageEditExtractSettingView.swift; sourceTree = "<group>"; };
 		BBEC00A3295BD42D00A26C98 /* KMHeaderFooterPageInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMHeaderFooterPageInfoView.swift; sourceTree = "<group>"; };
 		BBEC00A7295BDECF00A26C98 /* KMHeaderFooterContentInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMHeaderFooterContentInfoView.swift; sourceTree = "<group>"; };
 		BBEC00AD295C2AF300A26C98 /* KMBatesPreviewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBatesPreviewController.swift; sourceTree = "<group>"; };
@@ -3869,6 +3889,7 @@
 			children = (
 				BB2EDF4A296E63E5003BCF58 /* KMPageEditInsertCustomPageWindowController.swift */,
 				BB2EDF4B296E63E5003BCF58 /* KMPageEditInsertCustomPageWindowController.xib */,
+				BBD1F782296F9DB500343885 /* KMPageEditExtractWindowController.swift */,
 			);
 			path = Window;
 			sourceTree = "<group>";
@@ -3877,6 +3898,9 @@
 			isa = PBXGroup;
 			children = (
 				BB2EDF53296E815E003BCF58 /* KMPageEditBaseItemView.swift */,
+				BBD1F77A296F9BE000343885 /* KMPageEditSettingBaseWindowController.swift */,
+				BBD1F77B296F9BE000343885 /* KMPageEditSettingBaseWindowController.xib */,
+				BBD1F786296FAC7C00343885 /* KMPageEditSettingBaseView.swift */,
 			);
 			path = Base;
 			sourceTree = "<group>";
@@ -3890,6 +3914,7 @@
 				BB2EDF67296ECE17003BCF58 /* KMPageEditThumbnailItem.xib */,
 				BB2EDF68296ECE17003BCF58 /* KMPageEditInsertPageSizeItemView.swift */,
 				BB2EDF69296ECE17003BCF58 /* KMPageEditThumbnailItem.swift */,
+				BBD1F78A296FACA300343885 /* KMPageEditExtractSettingView.swift */,
 			);
 			path = View;
 			sourceTree = "<group>";
@@ -5059,6 +5084,7 @@
 				BBFE6E68293097A600142C01 /* KMPageRangePickerWindowController.xib in Resources */,
 				9FBA0EE428FEC253001117AF /* KMProductPromotionViewController.xib in Resources */,
 				BBEC00C2295C306400A26C98 /* KMBatesPropertyController.xib in Resources */,
+				BBD1F77F296F9BE000343885 /* KMPageEditSettingBaseWindowController.xib in Resources */,
 				F3A9DC81294309D80074E5D2 /* CPDFListEditAnnotationViewController.xib in Resources */,
 				89E4E7852967BF5A002DBA6F /* KMCustomizeStampViewController.xib in Resources */,
 				F359917B292B7B8A000D25DE /* InitialUserDefaults.plist in Resources */,
@@ -5303,6 +5329,7 @@
 				899700EC28F3E4D3009AF911 /* MainWindowController.xib in Resources */,
 				BB8F4553295A9FA50037EA22 /* KMCreateHeaderFooterController.xib in Resources */,
 				9F8539EC2947131F00DF644E /* KMChromiumTabView.xib in Resources */,
+				BBD1F780296F9BE000343885 /* KMPageEditSettingBaseWindowController.xib in Resources */,
 				ADCB98D62924772200B51A03 /* KMBatchProcessingNameTableCell.xib in Resources */,
 				BBEC00BB295C2C1600A26C98 /* KMBatesPropertyHomeController.xib in Resources */,
 				ADCB98E62924777A00B51A03 /* KMBatchProcessingSizeTableCell.xib in Resources */,
@@ -5447,6 +5474,7 @@
 				9FBA0EE628FEC253001117AF /* KMProductPromotionViewController.xib in Resources */,
 				89E9B3FB295BE2EC00AEFA61 /* KMEditPDFTextPropertyViewController.xib in Resources */,
 				BB1EC8032967B26700EC0BC3 /* KMPDFEditViewController.xib in Resources */,
+				BBD1F781296F9BE000343885 /* KMPageEditSettingBaseWindowController.xib in Resources */,
 				BB5DF1EE2959C5CB0025CDA1 /* KMHeaderFooterPreviewController.xib in Resources */,
 				ADCB98CF2924743300B51A03 /* KMBatchProcessingView.xib in Resources */,
 				BBC348382955A118008D2CD1 /* KMCreateBackgroundController.xib in Resources */,
@@ -5616,6 +5644,7 @@
 				BBA8B7AA2935DC120097D183 /* KMRemovePasswordResultTipView.swift in Sources */,
 				AD9527CA295297B70039D2BC /* KMPrintModel.swift in Sources */,
 				ADCB9971292C65EE00B51A03 /* KMGOCROperation.m in Sources */,
+				BBD1F77C296F9BE000343885 /* KMPageEditSettingBaseWindowController.swift in Sources */,
 				BBF38A5A294F2B760086D025 /* KMWatermarkPositionView.swift in Sources */,
 				BB8F4586295B19AC0037EA22 /* KMHeaderFooterDateInfoView.swift in Sources */,
 				BB1EC8112967EB5A00EC0BC3 /* KMPageEditThumbnailViewKMPageEditThumbnailView_OC.m in Sources */,
@@ -5662,6 +5691,7 @@
 				ADCB98E12924776F00B51A03 /* KMBatchProcessingSizeTableCell.swift in Sources */,
 				BB8F457A295AFB330037EA22 /* KMHeaderFooterFontInfoView.swift in Sources */,
 				8997010628F4082C009AF911 /* KMFromViewController.swift in Sources */,
+				BBD1F78B296FACA300343885 /* KMPageEditExtractSettingView.swift in Sources */,
 				9FDD0F77294FEF64000C4DAD /* KMConvertPDFManager.swift in Sources */,
 				9F8539D62943180000DF644E /* KMTabAppearance.swift in Sources */,
 				BB5DF1E92959C5CB0025CDA1 /* KMHeaderFooterPreviewController.swift in Sources */,
@@ -5697,6 +5727,7 @@
 				8942F80329262B2E00389627 /* KMSideViewController.swift in Sources */,
 				899700FE28F40710009AF911 /* KMBookMarkViewController.swift in Sources */,
 				BB2EDF6D296ECE17003BCF58 /* KMPageEditInsertDirectionItemView.swift in Sources */,
+				BBD1F783296F9DB500343885 /* KMPageEditExtractWindowController.swift in Sources */,
 				F34BF94E29531213002C25A2 /* NSGraphics+PDFListView.m in Sources */,
 				9F1FE4A829406E4700E952CA /* CTBrowserWindowController.m in Sources */,
 				89D9897828FE895A003A3E87 /* KMOutlineCellView.swift in Sources */,
@@ -5799,6 +5830,7 @@
 				BBC2BCC6295DA8F30036B983 /* KMCropPreviewController.swift in Sources */,
 				BBA8B7AF293600D70097D183 /* KMPasswordInputWindow.swift in Sources */,
 				BBEC00A4295BD42D00A26C98 /* KMHeaderFooterPageInfoView.swift in Sources */,
+				BBD1F787296FAC7C00343885 /* KMPageEditSettingBaseView.swift in Sources */,
 				ADD1B6DF2946BFD500C3FFF7 /* KMPrintChoosePageSizeSizeView.swift in Sources */,
 				9F78EFBB28F7C1CC001E66F4 /* KMHomeViewController.swift in Sources */,
 				8942F7E92925E1C400389627 /* KMLiftSideCellView.swift in Sources */,
@@ -6051,6 +6083,7 @@
 				F373230F292DF9410013862C /* CPDFInkAnnotation+PDFListView.m in Sources */,
 				9F1F82F329373D6E0092C4B4 /* String+KMExtensions.swift in Sources */,
 				F3B7DF9B2948565000333201 /* CPDFListHoverAnnotationViewController.m in Sources */,
+				BBD1F77D296F9BE000343885 /* KMPageEditSettingBaseWindowController.swift in Sources */,
 				9FDD0FB329534FEA000C4DAD /* KMGlobal.swift in Sources */,
 				BB8F4587295B19AC0037EA22 /* KMHeaderFooterDateInfoView.swift in Sources */,
 				BB1EC8122967EB5A00EC0BC3 /* KMPageEditThumbnailViewKMPageEditThumbnailView_OC.m in Sources */,
@@ -6097,6 +6130,7 @@
 				AD9527BF295294E20039D2BC /* KMPrintPageModel.swift in Sources */,
 				BB8F457B295AFB330037EA22 /* KMHeaderFooterFontInfoView.swift in Sources */,
 				9FDD0F892952FCC6000C4DAD /* KMCompLightParser.swift in Sources */,
+				BBD1F78C296FACA300343885 /* KMPageEditExtractSettingView.swift in Sources */,
 				AD44D653292C9E7900A94554 /* KMImageToPDFChooseView.swift in Sources */,
 				89D2D2E3294C452B00BFF5FE /* KMPDFThumbnailView.swift in Sources */,
 				BB5DF1EA2959C5CB0025CDA1 /* KMHeaderFooterPreviewController.swift in Sources */,
@@ -6132,6 +6166,7 @@
 				9F1FE4D629406E4700E952CA /* NSPasteboard+Utils.m in Sources */,
 				9F1FE4B229406E4700E952CA /* CTTabWindowController.m in Sources */,
 				BB2EDF6E296ECE17003BCF58 /* KMPageEditInsertDirectionItemView.swift in Sources */,
+				BBD1F784296F9DB500343885 /* KMPageEditExtractWindowController.swift in Sources */,
 				F3732334292F7B8D0013862C /* CStampSignatureObject.m in Sources */,
 				9F1FE4BE29406E4700E952CA /* URLDropTarget.m in Sources */,
 				9F705F8A291E576D005199AD /* KMTableView.swift in Sources */,
@@ -6234,6 +6269,7 @@
 				BBC2BCC7295DA8F30036B983 /* KMCropPreviewController.swift in Sources */,
 				9F8DDF352924DA6B006CDC73 /* KMPDFToolsCollectionView.swift in Sources */,
 				BBEC00A5295BD42D00A26C98 /* KMHeaderFooterPageInfoView.swift in Sources */,
+				BBD1F788296FAC7C00343885 /* KMPageEditSettingBaseView.swift in Sources */,
 				89D2D2BE29486D2400BFF5FE /* KMSignatureCellView.swift in Sources */,
 				9F1FE49729406E4700E952CA /* common.c in Sources */,
 				899700E928F3E4D3009AF911 /* MainWindowController.swift in Sources */,
@@ -6503,6 +6539,7 @@
 				ADCB98DB2924774F00B51A03 /* KMBatchProcessingOrderTableCell.swift in Sources */,
 				89D9897628FE743E003A3E87 /* KMOutlineView.swift in Sources */,
 				F34BF94129530D02002C25A2 /* NSBezierPath+PDFListView.m in Sources */,
+				BBD1F78D296FACA300343885 /* KMPageEditExtractSettingView.swift in Sources */,
 				BB88E456294045B4002B3655 /* KMPDFConvertManager.swift in Sources */,
 				9F8DDF2F2924B855006CDC73 /* KMPDFToolsViewController.swift in Sources */,
 				ADD1B6AD2941E97F00C3FFF7 /* KMPrintWindowController.swift in Sources */,
@@ -6532,6 +6569,7 @@
 				F34BF95029531213002C25A2 /* NSGraphics+PDFListView.m in Sources */,
 				BB2F615A2966B69D001CB369 /* KMWatermarkPropertyHomeController.swift in Sources */,
 				89752E1F2942CB04003FF08E /* KMSearchMode.swift in Sources */,
+				BBD1F785296F9DB500343885 /* KMPageEditExtractWindowController.swift in Sources */,
 				BB5DF1EB2959C5CB0025CDA1 /* KMHeaderFooterPreviewController.swift in Sources */,
 				AD3A3589294C11ED00D72802 /* KMPrintPreviewPresenter.swift in Sources */,
 				BB49ED1B293F4D4E00C82CA2 /* KMConvertCSVSettingView.swift in Sources */,
@@ -6553,6 +6591,7 @@
 				ADCB98EB2924778C00B51A03 /* KMBatchProcessingStateTableCell.swift in Sources */,
 				AD9527CC295297B70039D2BC /* KMPrintModel.swift in Sources */,
 				9F1FE4B929406E4700E952CA /* CTBrowserFrameView.m in Sources */,
+				BBD1F789296FAC7C00343885 /* KMPageEditSettingBaseView.swift in Sources */,
 				BB2C6ACF28F41BA000478A33 /* CPDFListView.m in Sources */,
 				BB2EDF6C296ECE17003BCF58 /* KMPageEditInsertTypeItemView.swift in Sources */,
 				9F1FE4D729406E4700E952CA /* NSPasteboard+Utils.m in Sources */,
@@ -6647,6 +6686,7 @@
 				BB49ECF8293F44DC00C82CA2 /* KMConvertExcelWindowController.swift in Sources */,
 				9F1FE4EC29406E4700E952CA /* NSBezierPath+MCAdditions.m in Sources */,
 				8942F80B29275CBC00389627 /* KMOCToolClass.m in Sources */,
+				BBD1F77E296F9BE000343885 /* KMPageEditSettingBaseWindowController.swift in Sources */,
 				ADD1B6BD29420B4A00C3FFF7 /* KMPrintPreviewView.swift in Sources */,
 				9F1F82F9293D8F9D0092C4B4 /* KMDocumentController.swift in Sources */,
 				BB86C21628F560D1005AD968 /* NSGraphics_SKExtensions.m in Sources */,

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


+ 28 - 0
PDF Office/PDF Office/Class/PDFTools/PageEdit/Base/KMPageEditSettingBaseView.swift

@@ -0,0 +1,28 @@
+//
+//  KMPageEditSettingBaseView.swift
+//  PDF Office
+//
+//  Created by tangchao on 2023/1/12.
+//
+
+import Cocoa
+
+typealias KMPageEditSettingViewItemClick = (_ index: Int, _ value: Any) -> ()
+class KMPageEditSettingBaseView: NSView, NibLoadable {
+
+    var itemClick: KMPageEditSettingViewItemClick?
+
+    static var nibName: String? {
+        return "KMPageEditSettingBaseWindowController"
+    }
+    
+    static func createFromNib(in bundle: Bundle = Bundle.main) -> Self? {
+        guard let nibName = nibName else { return nil }
+        var topLevelArray: NSArray? = nil
+        bundle.loadNibNamed(NSNib.Name(nibName), owner: nil, topLevelObjects: &topLevelArray)
+        guard let results = topLevelArray else { return nil }
+        let views = Array<Any>(results).filter { $0 is Self }
+        return views.last as? Self
+    }
+    
+}

+ 63 - 0
PDF Office/PDF Office/Class/PDFTools/PageEdit/Base/KMPageEditSettingBaseWindowController.swift

@@ -0,0 +1,63 @@
+//
+//  KMPageEditSettingBaseWindowController.swift
+//  PDF Office
+//
+//  Created by tangchao on 2023/1/12.
+//
+
+import Cocoa
+
+typealias KMPageEditSettingItemClick = (_ index: Int, _ value: Any) -> ()
+class KMPageEditSettingBaseWindowController: NSWindowController {
+
+    @IBOutlet weak var contentWidthConst: NSLayoutConstraint!
+    @IBOutlet weak var contentHeightConst: NSLayoutConstraint!
+    
+    @IBOutlet weak var titleLabel: NSTextField!
+    @IBOutlet weak var contentBox: NSBox!
+    @IBOutlet weak var funcButton: NSButton!
+    @IBOutlet weak var cancelButton: NSButton!
+    
+    var itemClick: KMPageEditSettingItemClick!
+    
+    override func windowDidLoad() {
+        super.windowDidLoad()
+
+        cancelButton.title = NSLocalizedString("取消", comment: "")
+        cancelButton.isBordered = false
+        cancelButton.wantsLayer = true
+        cancelButton.layer?.borderWidth = 1
+        cancelButton.layer?.borderColor = NSColor.black.cgColor
+        cancelButton.layer?.cornerRadius = 4
+        cancelButton.target = self
+        cancelButton.action = #selector(cancelButtonAction)
+        
+        funcButton.isBordered = false
+        funcButton.wantsLayer = true
+        funcButton.layer?.cornerRadius = 4
+        funcButton.target = self
+        funcButton.action = #selector(funcButtonAction)
+    }
+    
+    public func setWindowSize(_ size: NSSize) {
+        self.contentWidthConst.constant = size.width
+        self.contentHeightConst.constant = size.height-44-60
+    }
+    
+    @objc func cancelButtonAction() {
+        guard let callback = self.itemClick else {
+            return
+        }
+        
+        callback(1, "")
+    }
+    
+    @objc func funcButtonAction() {
+        guard let callback = self.itemClick else {
+            return
+        }
+        
+        callback(2, "")
+    }
+    
+}

+ 175 - 0
PDF Office/PDF Office/Class/PDFTools/PageEdit/Base/KMPageEditSettingBaseWindowController.xib

@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21225" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21225"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMPageEditSettingBaseWindowController" customModule="PDF_Office" customModuleProvider="target">
+            <connections>
+                <outlet property="cancelButton" destination="aGH-iF-dyv" id="GkV-FC-Pc2"/>
+                <outlet property="contentBox" destination="iAV-mV-fXp" id="8Xv-WA-JVI"/>
+                <outlet property="contentHeightConst" destination="lLs-Q4-ChB" id="DdC-mJ-g1m"/>
+                <outlet property="contentWidthConst" destination="GRH-Pj-aIE" id="PNL-5P-9Jd"/>
+                <outlet property="funcButton" destination="hWv-ct-X84" id="ZLz-Wu-K3O"/>
+                <outlet property="titleLabel" destination="Ghc-ac-Ody" id="1vG-N0-5dz"/>
+                <outlet property="window" destination="F0z-JX-Cv5" id="gIp-Ho-8D9"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="F0z-JX-Cv5">
+            <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
+            <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
+            <rect key="contentRect" x="196" y="240" width="480" height="270"/>
+            <rect key="screenRect" x="0.0" y="0.0" width="1440" height="875"/>
+            <view key="contentView" id="se5-gp-TjO">
+                <rect key="frame" x="0.0" y="0.0" width="480" height="270"/>
+                <autoresizingMask key="autoresizingMask"/>
+                <subviews>
+                    <box boxType="custom" borderWidth="0.0" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="Yzy-uA-hNl">
+                        <rect key="frame" x="0.0" y="226" width="480" height="44"/>
+                        <view key="contentView" id="3Rq-FU-edv">
+                            <rect key="frame" x="0.0" y="0.0" width="480" height="44"/>
+                            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                            <subviews>
+                                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Ghc-ac-Ody">
+                                    <rect key="frame" x="14" y="13" width="44" height="19"/>
+                                    <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="no6-Hi-4JB">
+                                        <font key="font" metaFont="system" size="16"/>
+                                        <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                        <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                    </textFieldCell>
+                                </textField>
+                                <box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="pn1-L5-iFd">
+                                    <rect key="frame" x="0.0" y="-2" width="480" height="5"/>
+                                </box>
+                            </subviews>
+                            <constraints>
+                                <constraint firstAttribute="trailing" secondItem="pn1-L5-iFd" secondAttribute="trailing" id="CCD-r4-WrD"/>
+                                <constraint firstItem="Ghc-ac-Ody" firstAttribute="top" secondItem="3Rq-FU-edv" secondAttribute="top" constant="12" id="LCB-z2-r9L"/>
+                                <constraint firstAttribute="bottom" secondItem="pn1-L5-iFd" secondAttribute="bottom" id="j2l-nP-LWP"/>
+                                <constraint firstItem="pn1-L5-iFd" firstAttribute="leading" secondItem="3Rq-FU-edv" secondAttribute="leading" id="mTc-G0-sXW"/>
+                                <constraint firstItem="Ghc-ac-Ody" firstAttribute="leading" secondItem="3Rq-FU-edv" secondAttribute="leading" constant="16" id="meW-rz-cKH"/>
+                            </constraints>
+                        </view>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="44" id="dml-ys-lS9"/>
+                        </constraints>
+                    </box>
+                    <box boxType="custom" borderWidth="0.0" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="iAV-mV-fXp">
+                        <rect key="frame" x="0.0" y="60" width="480" height="166"/>
+                        <view key="contentView" id="eTu-qy-GPV">
+                            <rect key="frame" x="0.0" y="0.0" width="480" height="166"/>
+                            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        </view>
+                        <constraints>
+                            <constraint firstAttribute="width" constant="480" id="GRH-Pj-aIE"/>
+                            <constraint firstAttribute="height" constant="166" id="lLs-Q4-ChB"/>
+                        </constraints>
+                    </box>
+                    <box boxType="custom" borderWidth="0.0" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="CQn-6s-Bwt">
+                        <rect key="frame" x="0.0" y="0.0" width="480" height="60"/>
+                        <view key="contentView" id="ocP-n1-0FT">
+                            <rect key="frame" x="0.0" y="0.0" width="480" height="60"/>
+                            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                            <subviews>
+                                <box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="82l-cr-Ltb">
+                                    <rect key="frame" x="0.0" y="57" width="480" height="5"/>
+                                </box>
+                                <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="hWv-ct-X84">
+                                    <rect key="frame" x="366" y="14" width="98" height="32"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="98" id="XvX-Gm-FfV"/>
+                                        <constraint firstAttribute="height" constant="32" id="zqd-qy-cqQ"/>
+                                    </constraints>
+                                    <buttonCell key="cell" type="bevel" title="Button" bezelStyle="rounded" alignment="center" imageScaling="proportionallyDown" inset="2" id="xve-Pi-8fZ">
+                                        <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                        <font key="font" metaFont="system"/>
+                                    </buttonCell>
+                                </button>
+                                <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="aGH-iF-dyv">
+                                    <rect key="frame" x="256" y="14" width="98" height="32"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="98" id="YMp-xm-JXV"/>
+                                        <constraint firstAttribute="height" constant="32" id="y2o-XD-wEs"/>
+                                    </constraints>
+                                    <buttonCell key="cell" type="bevel" title="Button" bezelStyle="rounded" alignment="center" imageScaling="proportionallyDown" inset="2" id="WaC-ig-Y9B">
+                                        <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                        <font key="font" metaFont="system"/>
+                                    </buttonCell>
+                                </button>
+                            </subviews>
+                            <constraints>
+                                <constraint firstItem="82l-cr-Ltb" firstAttribute="leading" secondItem="ocP-n1-0FT" secondAttribute="leading" id="DeJ-lc-mQT"/>
+                                <constraint firstItem="82l-cr-Ltb" firstAttribute="top" secondItem="ocP-n1-0FT" secondAttribute="top" id="FwO-sy-6yk"/>
+                                <constraint firstAttribute="trailing" secondItem="hWv-ct-X84" secondAttribute="trailing" constant="16" id="XB2-ee-MES"/>
+                                <constraint firstAttribute="trailing" secondItem="82l-cr-Ltb" secondAttribute="trailing" id="bfF-Kd-yb3"/>
+                                <constraint firstItem="hWv-ct-X84" firstAttribute="leading" secondItem="aGH-iF-dyv" secondAttribute="trailing" constant="12" id="hQQ-Mu-u0r"/>
+                                <constraint firstItem="hWv-ct-X84" firstAttribute="centerY" secondItem="ocP-n1-0FT" secondAttribute="centerY" id="pFp-ce-qH6"/>
+                                <constraint firstItem="aGH-iF-dyv" firstAttribute="centerY" secondItem="ocP-n1-0FT" secondAttribute="centerY" id="th7-gX-Far"/>
+                            </constraints>
+                        </view>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="60" id="1sC-v3-3Cf"/>
+                        </constraints>
+                    </box>
+                </subviews>
+                <constraints>
+                    <constraint firstAttribute="trailing" secondItem="iAV-mV-fXp" secondAttribute="trailing" id="1I4-XY-nu3"/>
+                    <constraint firstItem="Yzy-uA-hNl" firstAttribute="top" secondItem="se5-gp-TjO" secondAttribute="top" id="3G8-tq-LQO"/>
+                    <constraint firstItem="CQn-6s-Bwt" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" id="Hor-6Y-Hqu"/>
+                    <constraint firstAttribute="trailing" secondItem="CQn-6s-Bwt" secondAttribute="trailing" id="ONg-fx-N7E"/>
+                    <constraint firstItem="CQn-6s-Bwt" firstAttribute="top" secondItem="iAV-mV-fXp" secondAttribute="bottom" id="R8k-r4-m1l"/>
+                    <constraint firstAttribute="trailing" secondItem="Yzy-uA-hNl" secondAttribute="trailing" id="SdP-di-hY3"/>
+                    <constraint firstItem="Yzy-uA-hNl" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" id="i1w-pO-6Cs"/>
+                    <constraint firstAttribute="bottom" secondItem="CQn-6s-Bwt" secondAttribute="bottom" id="o6s-5O-ku9"/>
+                    <constraint firstItem="iAV-mV-fXp" firstAttribute="top" secondItem="Yzy-uA-hNl" secondAttribute="bottom" id="q5R-Dg-Ybx"/>
+                    <constraint firstItem="iAV-mV-fXp" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" id="wCI-oc-C2A"/>
+                </constraints>
+            </view>
+            <connections>
+                <outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
+            </connections>
+            <point key="canvasLocation" x="-10" y="144"/>
+        </window>
+        <customView id="zj4-rU-o3s" customClass="KMPageEditExtractSettingView" customModule="PDF_Office" customModuleProvider="target">
+            <rect key="frame" x="0.0" y="0.0" width="446" height="104"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="W3n-Ay-Svt">
+                    <rect key="frame" x="190" y="67" width="65" height="22"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="20" id="gm2-yc-Edc"/>
+                    </constraints>
+                    <buttonCell key="cell" type="check" title="Check" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="O5v-R3-pn9">
+                        <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+                        <font key="font" metaFont="system"/>
+                    </buttonCell>
+                </button>
+                <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="XYW-lg-dA9">
+                    <rect key="frame" x="190" y="25" width="65" height="22"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="20" id="Opk-Pm-pDy"/>
+                    </constraints>
+                    <buttonCell key="cell" type="check" title="Check" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="9ms-Vw-0wt">
+                        <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+                        <font key="font" metaFont="system"/>
+                    </buttonCell>
+                </button>
+            </subviews>
+            <constraints>
+                <constraint firstItem="XYW-lg-dA9" firstAttribute="leading" secondItem="W3n-Ay-Svt" secondAttribute="leading" id="Aos-Aa-g7R"/>
+                <constraint firstItem="W3n-Ay-Svt" firstAttribute="centerX" secondItem="zj4-rU-o3s" secondAttribute="centerX" id="iZz-La-EeL"/>
+                <constraint firstItem="W3n-Ay-Svt" firstAttribute="top" secondItem="zj4-rU-o3s" secondAttribute="top" constant="16" id="les-9E-1kP"/>
+                <constraint firstItem="XYW-lg-dA9" firstAttribute="top" secondItem="W3n-Ay-Svt" secondAttribute="bottom" constant="22" id="zBi-bv-VJD"/>
+            </constraints>
+            <connections>
+                <outlet property="extractAfterDeletePageCheck" destination="XYW-lg-dA9" id="Oe7-ug-XAk"/>
+                <outlet property="independentPerPageCheck" destination="W3n-Ay-Svt" id="QFb-k2-LHg"/>
+            </connections>
+            <point key="canvasLocation" x="-37" y="394"/>
+        </customView>
+    </objects>
+</document>

+ 77 - 29
PDF Office/PDF Office/Class/PDFTools/PageEdit/Controller/KMPDFEditViewController.swift

@@ -356,8 +356,55 @@ class KMPDFEditViewController: NSViewController, KMPDFThumbnailViewDelegate {
         menu.popUp(positioning: nil, at: NSPoint(x: 0, y: 40), in: sender)
     }
     
-    @objc func extractMenuAction(sender: KMToolbarClickButton) {
+    @objc func extractMenuAction(sender: KMToolbarClickButton?) {
+        if (self.thumbnailView.getSelectedPages().count == 0) {
+            let alert = NSAlert()
+            alert.messageText = "请选择需要提取的页面"
+            alert.runModal()
+            return
+        }
+        
+        let windowController = KMPageEditExtractWindowController(windowNibName: "KMPageEditSettingBaseWindowController")
+        self.view.window?.beginSheet(windowController.window!)
+        self.windowController = windowController
         
+        windowController.itemClick = { [weak self] index, value in
+            if (index == 1) { /// 取消
+                self?.view.window?.endSheet((self?.windowController.window)!)
+                self?.windowController = nil
+                return
+            }
+            
+            let windowController_extract: KMPageEditExtractWindowController = self?.windowController as! KMPageEditExtractWindowController
+            /// 提取设置项
+            let oneDocumentPerPage: Bool = windowController_extract.settingView?.independentPerPageCheck.state != .on
+            let extractAfterDelete: Bool = windowController_extract.settingView?.extractAfterDeletePageCheck.state == .on
+            
+            self?.view.window?.endSheet((self?.windowController.window)!)
+            self?.windowController = nil
+            
+//            /// 提取的页面
+            let indexs: IndexSet = (self?.thumbnailView.getSelectedPages())!
+            var extractPages: Array<CPDFPage> = []
+            for i in indexs {
+                extractPages.append((self?.listView?.document.page(at: UInt(i)))!)
+            }
+
+            KMPageEditTools.extract((self?.listView?.document)!, indexs, oneDocumentPerPage, (self?.view.window)!) { result, urls, error in
+                if (result == false) {
+                    return
+                }
+                
+                if (extractAfterDelete) {
+                    for page in extractPages {
+                        let indexPage = self?.listView?.document.index(for: page)
+                        self?.listView?.document.removePage(at: indexPage!)
+                        self?.listView?.layoutDocumentView()
+                        self?.thumbnailView.refreshUI()
+                    }
+                }
+            }
+        }
     }
     
     @objc func replaceMenuAction(sender: KMToolbarClickButton) {
@@ -574,34 +621,35 @@ extension KMPDFEditViewController: KMNewToolbarDelegate {
     }
     
     @objc func extractPageItemAction(menu:NSMenuItem) {
-        let index = (menu.representedObject as! IndexSet).first ?? -1
-        if Int(index) >= 0 {
-            let newDocument = self.thumbnailView.document
-            var page : CPDFPage = newDocument.page(at: UInt(index))
-            let filename : String = newDocument.documentURL.lastPathComponent
-            let pageIndex = newDocument.index(for: page) + 1
-            var newfileName : String = "\(NSString(string: filename).deletingPathExtension)  page  \(pageIndex)"
-            newfileName = "\(newfileName)\(filename.extension)"
-            let panel = NSSavePanel()
-            panel.nameFieldStringValue = newfileName
-            panel.canCreateDirectories = true
-            panel.allowedFileTypes = ["pdf"]
-            panel.isExtensionHidden = true
-            panel.beginSheetModal(for: self.view.window!) { result in
-                if result == .OK {
-                    let pdfdocument = CPDFDocument()
-                    let ret = pdfdocument!.importPages((menu.representedObject as! IndexSet), from: self.thumbnailView.document, at: 0)
-                    if ret {
-                        let success = pdfdocument!.write(to:panel.url)
-                        if success {
-                            let workspace = NSWorkspace.shared
-                            workspace.activateFileViewerSelecting([panel.url!])
-                        }
-                    }
-                }
-            }
-                           
-        }
+//        let index = (menu.representedObject as! IndexSet).first ?? -1
+//        if Int(index) >= 0 {
+//            let newDocument = self.thumbnailView.document
+//            var page : CPDFPage = newDocument.page(at: UInt(index))
+//            let filename : String = newDocument.documentURL.lastPathComponent
+//            let pageIndex = newDocument.index(for: page) + 1
+//            var newfileName : String = "\(NSString(string: filename).deletingPathExtension)  page  \(pageIndex)"
+//            newfileName = "\(newfileName)\(filename.extension)"
+//            let panel = NSSavePanel()
+//            panel.nameFieldStringValue = newfileName
+//            panel.canCreateDirectories = true
+//            panel.allowedFileTypes = ["pdf"]
+//            panel.isExtensionHidden = true
+//            panel.beginSheetModal(for: self.view.window!) { result in
+//                if result == .OK {
+//                    let pdfdocument = CPDFDocument()
+//                    let ret = pdfdocument!.importPages((menu.representedObject as! IndexSet), from: self.thumbnailView.document, at: 0)
+//                    if ret {
+//                        let success = pdfdocument!.write(to:panel.url)
+//                        if success {
+//                            let workspace = NSWorkspace.shared
+//                            workspace.activateFileViewerSelecting([panel.url!])
+//                        }
+//                    }
+//                }
+//            }
+//
+//        }
+        extractMenuAction(sender: nil)
     }
     
     @objc func replacePageItemAction(menu:NSMenuItem) {

+ 108 - 0
PDF Office/PDF Office/Class/PDFTools/PageEdit/Tools/KMPageEditTools.swift

@@ -26,6 +26,114 @@ class KMPageEditTools: NSObject {
         
     }
     
+    class func extract(_ document: CPDFDocument, _ pageIndexs: IndexSet,_ oneDocument: Bool,_ window: NSWindow, callback: @escaping (_ result: Bool, _ urls: Array<URL>?, _ error: String) -> ()) {
+        /// 提取的页面
+        var extractPages: Array<CPDFPage> = []
+        for i in pageIndexs {
+            extractPages.append(document.page(at: UInt(i)))
+        }
+        
+        if (oneDocument) { /// 提取为一个文档
+            let fileName = document.getFileNameAccordingSelctPages(extractPages)
+            let panel = NSSavePanel()
+            panel.nameFieldStringValue = fileName
+            let button = NSButton.init(checkboxWithTitle: "保存后打开文档", target: nil, action: nil)
+            button.state = .off
+            panel.accessoryView = button
+            panel.isExtensionHidden = true
+            panel.beginSheetModal(for: window) { response in
+                if (response != .OK) {
+                    callback(false, nil, "cancel")
+                    return
+                }
+                
+                DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
+                    let saveFilePath = panel.url?.path
+                    DispatchQueue.global().async {
+                        var pdf = CPDFDocument.init()
+                        let success = (pdf!.extractAsOneDocument(withPages: extractPages, savePath: saveFilePath)) as Bool
+                        DispatchQueue.main.async {
+                            if (success == false) {
+                                callback(false, nil, "failure")
+                                return
+                            }
+                                
+                            if (button.state == .off) {
+                                let url = URL(fileURLWithPath: saveFilePath!)
+                                NSWorkspace.shared.activateFileViewerSelecting([url])
+                            }
+                            callback(true, [URL(fileURLWithPath: saveFilePath!)], "")
+//
+//                                if (extractAfterDelete) {
+//                                    for page in extractPages {
+//                                        let indexPage = self?.listView?.document.index(for: page)
+//                                        self?.listView?.document.removePage(at: indexPage!)
+//
+//                                        self?.listView?.layoutDocumentView()
+//                                        self?.thumbnailView.refreshUI()
+//                                    }
+//                                }
+                        }
+                    }
+                }
+            }
+            return
+        }
+        
+        let panel = NSOpenPanel()
+        panel.canChooseFiles = false
+        panel.canChooseDirectories = true
+        panel.canCreateDirectories = true
+        panel.allowsMultipleSelection = false
+        let button = NSButton.init(checkboxWithTitle: "保存后打开文档", target: nil, action: nil)
+        button.state = .off
+        panel.accessoryView = button
+        panel.beginSheetModal(for: window) {  response in
+            if response != .OK {
+                callback(false, nil, "cancel")
+                return
+            }
+            DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
+                let outputURL = panel.url
+                DispatchQueue.global().async {
+                    let folderName = String((document.documentURL!.lastPathComponent.split(separator: ".")[0])) + "_extract"
+                    
+                    var filePath = URL(fileURLWithPath: outputURL!.path).appendingPathComponent(folderName).path
+                    var i = 1
+                    let testFilePath = filePath
+                    while FileManager.default.fileExists(atPath: filePath) {
+                        filePath = testFilePath + "\(i)"
+                        i += 1
+                    }
+                    
+                    try? FileManager.default.createDirectory(atPath: filePath, withIntermediateDirectories: false, attributes: nil)
+                    
+                    let successArray = document.extractPerPageDocument(withPages: extractPages, folerPath: filePath)
+                    DispatchQueue.main.async {
+                        if successArray!.count == 0 {
+                            callback(false, nil, "failure")
+                            return
+                        }
+                        if (button.state == .off) {
+                            NSWorkspace.shared.activateFileViewerSelecting(successArray!)
+                        }
+                            
+                        callback(true, successArray, "")
+//                            if (extractAfterDelete) {
+//                                for page in extractPages {
+//                                    let indexPage = self?.listView?.document.index(for: page)
+//                                    self?.listView?.document.removePage(at: indexPage!)
+//
+//                                    self?.listView?.layoutDocumentView()
+//                                    self?.thumbnailView.refreshUI()
+//                                }
+//                            }
+                    }
+                }
+            }
+        }
+    }
+    
     class func getPageSize() -> Array<String> {
         return KMCropTools.getPageSize()
     }

+ 42 - 0
PDF Office/PDF Office/Class/PDFTools/PageEdit/View/KMPageEditExtractSettingView.swift

@@ -0,0 +1,42 @@
+//
+//  KMPageEditExtractSettingView.swift
+//  PDF Office
+//
+//  Created by tangchao on 2023/1/12.
+//
+
+import Cocoa
+
+class KMPageEditExtractSettingView: KMPageEditSettingBaseView {
+
+    @IBOutlet weak var independentPerPageCheck: NSButton!
+    @IBOutlet weak var extractAfterDeletePageCheck: NSButton!
+    
+    override func awakeFromNib() {
+        super.awakeFromNib()
+        
+        self.independentPerPageCheck.title = "每个页面作为单独页面"
+        self.extractAfterDeletePageCheck.title = "提取后删除页面"
+        
+        self.independentPerPageCheck.target = self
+        self.independentPerPageCheck.action = #selector(checkAction)
+        self.independentPerPageCheck.state = .off
+        
+        self.extractAfterDeletePageCheck.target = self
+        self.extractAfterDeletePageCheck.action = #selector(checkAction)
+        self.extractAfterDeletePageCheck.state = .off
+    }
+    
+    @objc func checkAction(sender: NSButton) {
+        guard let callback = self.itemClick else {
+            return
+        }
+        
+        var index: Int = 1
+        if (sender.isEqual(to: self.extractAfterDeletePageCheck)) {
+            index = 2
+        }
+        callback(index, sender.state == .on)
+    }
+    
+}

+ 31 - 0
PDF Office/PDF Office/Class/PDFTools/PageEdit/Window/KMPageEditExtractWindowController.swift

@@ -0,0 +1,31 @@
+//
+//  KMPageEditExtractWindowController.swift
+//  PDF Office
+//
+//  Created by tangchao on 2023/1/12.
+//
+
+import Cocoa
+
+class KMPageEditExtractWindowController: KMPageEditSettingBaseWindowController {
+    
+    var settingView: KMPageEditExtractSettingView?
+    
+    override func windowDidLoad() {
+        super.windowDidLoad()
+        setWindowSize(NSSize(width: 320, height: 208))
+        
+        self.titleLabel.stringValue = "提取文件"
+        
+        funcButton.title = NSLocalizedString("转换", comment: "")
+        funcButton.layer?.backgroundColor = NSColor.black.cgColor
+        funcButton.attributedTitle = NSMutableAttributedString(string: funcButton.title, attributes: [NSAttributedString.Key.foregroundColor : NSColor.white])
+        
+        let settingView: KMPageEditExtractSettingView = KMPageEditExtractSettingView.createFromNib()!
+        self.contentBox.contentView?.addSubview(settingView)
+        settingView.frame = self.contentBox.contentView!.bounds
+        settingView.autoresizingMask = [.width, .height]
+        self.settingView = settingView
+    }
+
+}