Browse Source

【2025】【Edit-Link】Link模块完善

niehaoyu 4 months ago
parent
commit
5d6fe604de
31 changed files with 1203 additions and 80 deletions
  1. 2 2
      PDF Office/KMComponentLibrary/KMComponentLibrary.xcodeproj/project.pbxproj
  2. 3 2
      PDF Office/KMComponentLibrary/KMComponentLibrary/View/Divider/ComponentDivider.swift
  3. 1 0
      PDF Office/KMComponentLibrary/KMComponentLibrary/View/Input/ComponentTextarea/ComponentTextarea.xib
  4. 0 1
      PDF Office/PDF Master/Class/PDFWindowController/Side/RightSide/AnnotationProperty/KMAnnotationPropertiesViewController.m
  5. 0 3
      PDF Office/PDF Master/KMClass/KMHomeViewController/Views/KMHomeRightView/HeaderFooterView/KMHomeFilesHeaderView.swift
  6. 51 20
      PDF Office/PDF Master/KMClass/KMPDFViewController/KMLinkViewController/KMLinkViewController.swift
  7. 56 38
      PDF Office/PDF Master/KMClass/KMPDFViewController/KMLinkViewController/KMLinkViewController.xib
  8. 1 1
      PDF Office/PDF Master/KMClass/KMPDFViewController/KMLinkViewController/Views/KMLinkEmailView/KMLinkEmailView.swift
  9. 1 1
      PDF Office/PDF Master/KMClass/KMPDFViewController/KMLinkViewController/Views/KMLinkWebView/KMLinkWebView.swift
  10. 93 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/KMLinkViewController/Views/KMNLinkMultiController/KMNLinkMultiController.swift
  11. 155 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/KMLinkViewController/Views/KMNLinkMultiController/KMNLinkMultiController.xib
  12. 20 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/KMPDFConfig.swift
  13. 6 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/Contents.json
  14. 12 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignAverageVertical_dis.imageset/Contents.json
  15. 83 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignAverageVertical_dis.imageset/alignAverageVertical_dis.pdf
  16. 12 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignBottom.imageset/Contents.json
  17. 83 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignBottom.imageset/alignBottom.pdf
  18. 12 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignHorizonal_dis.imageset/Contents.json
  19. 83 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignHorizonal_dis.imageset/alignHorizonal_dis.pdf
  20. 12 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignLeft.imageset/Contents.json
  21. 83 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignLeft.imageset/alignLeft.pdf
  22. 12 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignRight.imageset/Contents.json
  23. 83 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignRight.imageset/alignRight.pdf
  24. 12 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignTop.imageset/Contents.json
  25. 83 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignTop.imageset/alignTop.pdf
  26. 12 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignXCenter.imageset/Contents.json
  27. 87 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignXCenter.imageset/alignXCenter.pdf
  28. 12 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignYCenter.imageset/Contents.json
  29. 87 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignYCenter.imageset/alignYCenter.pdf
  30. 6 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Contents.json
  31. 40 12
      PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

+ 2 - 2
PDF Office/KMComponentLibrary/KMComponentLibrary.xcodeproj/project.pbxproj

@@ -887,9 +887,9 @@
 		BB5A9C492CB64D4700F64C1F /* Divider */ = {
 			isa = PBXGroup;
 			children = (
-				BB5A9C4A2CB64D4800F64C1F /* ComponentDivider.xib */,
-				BB5A9C4B2CB64D4800F64C1F /* ComponentDivider.swift */,
 				BB5A9C4C2CB64D4800F64C1F /* ComponentDividerProperty.swift */,
+				BB5A9C4B2CB64D4800F64C1F /* ComponentDivider.swift */,
+				BB5A9C4A2CB64D4800F64C1F /* ComponentDivider.xib */,
 			);
 			path = Divider;
 			sourceTree = "<group>";

+ 3 - 2
PDF Office/KMComponentLibrary/KMComponentLibrary/View/Divider/ComponentDivider.swift

@@ -10,7 +10,7 @@ import Cocoa
 public class ComponentDivider: ComponentBaseXibView {
 
     // MARK: Private Property
-    private var _properties : ComponentDividerProperty = ComponentDividerProperty(type: .vertical, dash: false)
+    private var _properties : ComponentDividerProperty = ComponentDividerProperty(type: .horizontal, dash: false)
     
     // MARK: 初始化
     public override func draw(_ dirtyRect: NSRect) {
@@ -57,7 +57,8 @@ public class ComponentDivider: ComponentBaseXibView {
     public override func awakeFromNib() {
         super.awakeFromNib()
 
-       
+        properties = ComponentDividerProperty(type: .horizontal, dash: false)
+        
     }
     
     

+ 1 - 0
PDF Office/KMComponentLibrary/KMComponentLibrary/View/Input/ComponentTextarea/ComponentTextarea.xib

@@ -40,6 +40,7 @@
                                             <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                                             <size key="minSize" width="310" height="46"/>
                                             <size key="maxSize" width="385" height="10000000"/>
+                                            <color key="insertionPointColor" name="textInsertionPointColor" catalog="System" colorSpace="catalog"/>
                                         </textView>
                                     </subviews>
                                 </clipView>

+ 0 - 1
PDF Office/PDF Master/Class/PDFWindowController/Side/RightSide/AnnotationProperty/KMAnnotationPropertiesViewController.m

@@ -179,7 +179,6 @@
             
         } else {
             [self selectAnnotations:_annotations];
-            return;
         }
     }
     

+ 0 - 3
PDF Office/PDF Master/KMClass/KMHomeViewController/Views/KMHomeRightView/HeaderFooterView/KMHomeFilesHeaderView.swift

@@ -108,9 +108,6 @@ public class KMHomeFilesHeaderView: BaseXibView {
     }
     
     //MARK: - MouseEvent
-    public override func mouseDown(with event: NSEvent) {
-
-    }
  }
 
 

+ 51 - 20
PDF Office/PDF Master/KMClass/KMPDFViewController/KMLinkViewController/KMLinkViewController.swift

@@ -26,21 +26,27 @@ import KMComponentLibrary
 
     @IBOutlet var contendBox: NSBox!
     @IBOutlet var titleLabel: NSTextField!
-    @IBOutlet var tabsView: ComponentTabs!
+    
     @IBOutlet var infoContendView: NSView!
     
+    @IBOutlet var tabsBGView: NSView!
+    @IBOutlet var tabsView: ComponentTabs!
+    
+    @IBOutlet var typeContendView: NSView!
     @IBOutlet var linkPageView: KMLinkPageView!
     
     @IBOutlet var linkEmailView: KMLinkEmailView!
     
     @IBOutlet var linkWebView: KMLinkWebView!
      
-    private var _annotations: [CPDFLinkAnnotation]? = nil
+    private var _annotations: [CPDFLinkAnnotation] = []
     
     private weak var _pdfView: CPDFListView? = nil
     
     private var annotation: CPDFLinkAnnotation? = nil
     
+    var multiController: KMNLinkMultiController = KMNLinkMultiController.init() //注释多选界面
+    
     let pageProperty = ComponentTabsProperty(tabsType: .underline_Fill, state: .normal, showIcon: false, title: NSLocalizedString("Page", comment: ""))
     let webProperty = ComponentTabsProperty(tabsType: .underline_Fill, state: .normal, showIcon: false, title: NSLocalizedString("Web", comment: ""))
     let emailProperty = ComponentTabsProperty(tabsType: .underline_Fill, state: .normal, showIcon: false, title: NSLocalizedString("Email", comment: ""))
@@ -57,7 +63,7 @@ import KMComponentLibrary
     
     func setUpUI() {
         
-        contendBox.fillColor = NSColor.white
+        contendBox.fillColor = ComponentLibrary.shared.getComponentColorFromKey("colorBg/layout-middle")
         
         titleLabel.stringValue = NSLocalizedString("Link", comment: "")
         titleLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/2")
@@ -79,6 +85,8 @@ import KMComponentLibrary
         linkWebView.delegate = self
         
         linkEmailView.delegate = self
+        
+        multiController.delegate = self
     }
     
     
@@ -101,15 +109,15 @@ import KMComponentLibrary
         }
     }
     
-    var annotations: [CPDFLinkAnnotation]? {
+    var annotations: [CPDFLinkAnnotation] {
         get {
             return _annotations
         }
         set {
             _annotations = newValue
             
-            if _annotations != nil && _annotations?.isEmpty == false {
-                annotation = _annotations?.first
+            if _annotations.isEmpty == false {
+                annotation = _annotations.first
             } else {
                 annotation = nil
             }
@@ -119,24 +127,40 @@ import KMComponentLibrary
     //MARK: - func
     func reloadData() {
         
-        linkPageView.isHidden = true
-        linkEmailView.isHidden = true
-        linkWebView.isHidden = true
-        
-        if pdfLinkType == .Page {
-            linkPageView.isHidden = false
-            linkPageView.pdfView = pdfView
-            linkPageView.annotation = annotation
-            linkPageView.reloadData()
+        if annotations.count > 1 {
             
-        } else if pdfLinkType == .Web {
-            linkWebView.isHidden = false
+            multiController.view.frame = infoContendView.bounds
+            multiController.view.autoresizingMask = [.width, .height]
+            infoContendView.addSubview(multiController.view)
+            
+            multiController.view.isHidden = false
+            tabsBGView.isHidden = true
+            typeContendView.isHidden = true
             
-        } else if pdfLinkType == .Email {
-            linkEmailView.isHidden = false
             
+        } else {
+            multiController.view.isHidden = true
+            tabsBGView.isHidden = false
+            typeContendView.isHidden = false
+            
+            linkPageView.isHidden = true
+            linkEmailView.isHidden = true
+            linkWebView.isHidden = true
+            
+            if pdfLinkType == .Page {
+                linkPageView.isHidden = false
+                linkPageView.pdfView = pdfView
+                linkPageView.annotation = annotation
+                linkPageView.reloadData()
+                
+            } else if pdfLinkType == .Web {
+                linkWebView.isHidden = false
+                
+            } else if pdfLinkType == .Email {
+                linkEmailView.isHidden = false
+                
+            }
         }
-        
     }
     
     //MARK: - private
@@ -281,3 +305,10 @@ extension KMLinkViewController: KMLinkEmailViewDelegate {
     }
     
 }
+
+//MARK: - KMNLinkMultiControllerDelegate
+extension KMLinkViewController: KMNLinkMultiControllerDelegate {
+    func multiControllerDidClick(_ controller: KMNLinkMultiController, _ alignmentType: KMAnnotationsAlignmentType) {
+        
+    }
+}

+ 56 - 38
PDF Office/PDF Master/KMClass/KMPDFViewController/KMLinkViewController/KMLinkViewController.xib

@@ -9,12 +9,14 @@
         <customObject id="-2" userLabel="File's Owner" customClass="KMLinkViewController" customModule="PDF_Reader_Pro" customModuleProvider="target">
             <connections>
                 <outlet property="contendBox" destination="Bzd-YZ-Zid" id="JQz-zd-VGU"/>
-                <outlet property="infoContendView" destination="BK6-TZ-Fw8" id="7Dx-11-wh8"/>
+                <outlet property="infoContendView" destination="lR7-es-a1N" id="DC3-7G-pDh"/>
                 <outlet property="linkEmailView" destination="r4k-oX-xpP" id="2BQ-cZ-Tdv"/>
                 <outlet property="linkPageView" destination="x7p-Hb-EyP" id="a2Z-MU-Fi6"/>
                 <outlet property="linkWebView" destination="fH6-Uy-dbh" id="WXi-Pk-sCY"/>
+                <outlet property="tabsBGView" destination="ZTL-oi-jx1" id="dwu-Yy-p8f"/>
                 <outlet property="tabsView" destination="7KZ-04-qIH" id="EFi-fc-PS2"/>
                 <outlet property="titleLabel" destination="cWl-1z-Oo9" id="Oks-CT-g1E"/>
+                <outlet property="typeContendView" destination="BK6-TZ-Fw8" id="f6j-6h-YqA"/>
                 <outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
             </connections>
         </customObject>
@@ -41,63 +43,79 @@
                                             <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                                         </textFieldCell>
                                     </textField>
+                                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="oAT-Uz-RGE" customClass="ComponentDivider" customModule="KMComponentLibrary">
+                                        <rect key="frame" x="0.0" y="0.0" width="261" height="1"/>
+                                        <constraints>
+                                            <constraint firstAttribute="height" constant="1" id="9kh-oH-cKO"/>
+                                        </constraints>
+                                    </customView>
                                 </subviews>
                                 <constraints>
+                                    <constraint firstAttribute="trailing" secondItem="oAT-Uz-RGE" secondAttribute="trailing" id="0aJ-25-0Qc"/>
+                                    <constraint firstAttribute="bottom" secondItem="oAT-Uz-RGE" secondAttribute="bottom" id="NgW-xr-XYC"/>
                                     <constraint firstAttribute="height" constant="40" id="Ngk-ha-FFg"/>
                                     <constraint firstItem="cWl-1z-Oo9" firstAttribute="centerX" secondItem="ari-Wn-bbp" secondAttribute="centerX" id="WMR-Gr-glX"/>
+                                    <constraint firstItem="oAT-Uz-RGE" firstAttribute="leading" secondItem="ari-Wn-bbp" secondAttribute="leading" id="f6a-dZ-M9a"/>
                                     <constraint firstItem="cWl-1z-Oo9" firstAttribute="centerY" secondItem="ari-Wn-bbp" secondAttribute="centerY" id="sJX-Dy-c9K"/>
                                 </constraints>
                             </customView>
-                            <customView translatesAutoresizingMaskIntoConstraints="NO" id="ZTL-oi-jx1">
-                                <rect key="frame" x="0.0" y="330" width="261" height="56"/>
+                            <customView translatesAutoresizingMaskIntoConstraints="NO" id="lR7-es-a1N">
+                                <rect key="frame" x="0.0" y="0.0" width="261" height="386"/>
                                 <subviews>
-                                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="7KZ-04-qIH" customClass="ComponentTabs" customModule="KMComponentLibrary">
-                                        <rect key="frame" x="15" y="16" width="232" height="32"/>
+                                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="ZTL-oi-jx1">
+                                        <rect key="frame" x="0.0" y="330" width="261" height="56"/>
+                                        <subviews>
+                                            <customView translatesAutoresizingMaskIntoConstraints="NO" id="7KZ-04-qIH" customClass="ComponentTabs" customModule="KMComponentLibrary">
+                                                <rect key="frame" x="15" y="16" width="232" height="32"/>
+                                                <constraints>
+                                                    <constraint firstAttribute="height" constant="32" id="BCh-J7-X5m"/>
+                                                    <constraint firstAttribute="width" constant="232" id="Lq7-jw-65h"/>
+                                                </constraints>
+                                            </customView>
+                                        </subviews>
                                         <constraints>
-                                            <constraint firstAttribute="height" constant="32" id="BCh-J7-X5m"/>
-                                            <constraint firstAttribute="width" constant="232" id="Lq7-jw-65h"/>
+                                            <constraint firstItem="7KZ-04-qIH" firstAttribute="top" secondItem="ZTL-oi-jx1" secondAttribute="top" constant="8" id="6tc-UO-Lo3"/>
+                                            <constraint firstAttribute="height" constant="56" id="Rb9-44-Eut"/>
+                                            <constraint firstItem="7KZ-04-qIH" firstAttribute="centerX" secondItem="ZTL-oi-jx1" secondAttribute="centerX" id="kbY-1M-XWT"/>
                                         </constraints>
                                     </customView>
-                                </subviews>
-                                <constraints>
-                                    <constraint firstItem="7KZ-04-qIH" firstAttribute="top" secondItem="ZTL-oi-jx1" secondAttribute="top" constant="8" id="6tc-UO-Lo3"/>
-                                    <constraint firstAttribute="height" constant="56" id="Rb9-44-Eut"/>
-                                    <constraint firstItem="7KZ-04-qIH" firstAttribute="centerX" secondItem="ZTL-oi-jx1" secondAttribute="centerX" id="kbY-1M-XWT"/>
-                                </constraints>
-                            </customView>
-                            <customView translatesAutoresizingMaskIntoConstraints="NO" id="BK6-TZ-Fw8">
-                                <rect key="frame" x="0.0" y="0.0" width="261" height="330"/>
-                                <subviews>
-                                    <customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="x7p-Hb-EyP" customClass="KMLinkPageView" customModule="PDF_Reader_Pro" customModuleProvider="target">
-                                        <rect key="frame" x="0.0" y="0.0" width="261" height="330"/>
-                                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                                    </customView>
-                                    <customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="r4k-oX-xpP" customClass="KMLinkEmailView" customModule="PDF_Reader_Pro" customModuleProvider="target">
+                                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="BK6-TZ-Fw8">
                                         <rect key="frame" x="0.0" y="0.0" width="261" height="330"/>
-                                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                                    </customView>
-                                    <customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="fH6-Uy-dbh" customClass="KMLinkWebView" customModule="PDF_Reader_Pro" customModuleProvider="target">
-                                        <rect key="frame" x="0.0" y="0.0" width="261" height="330"/>
-                                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                        <subviews>
+                                            <customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="x7p-Hb-EyP" customClass="KMLinkPageView" customModule="PDF_Reader_Pro" customModuleProvider="target">
+                                                <rect key="frame" x="0.0" y="0.0" width="261" height="330"/>
+                                                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                            </customView>
+                                            <customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="r4k-oX-xpP" customClass="KMLinkEmailView" customModule="PDF_Reader_Pro" customModuleProvider="target">
+                                                <rect key="frame" x="0.0" y="0.0" width="261" height="330"/>
+                                                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                            </customView>
+                                            <customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="fH6-Uy-dbh" customClass="KMLinkWebView" customModule="PDF_Reader_Pro" customModuleProvider="target">
+                                                <rect key="frame" x="0.0" y="0.0" width="261" height="330"/>
+                                                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                            </customView>
+                                        </subviews>
                                     </customView>
                                 </subviews>
+                                <constraints>
+                                    <constraint firstItem="ZTL-oi-jx1" firstAttribute="top" secondItem="lR7-es-a1N" secondAttribute="top" id="9U3-Xj-md9"/>
+                                    <constraint firstItem="BK6-TZ-Fw8" firstAttribute="leading" secondItem="lR7-es-a1N" secondAttribute="leading" id="9e3-rL-cop"/>
+                                    <constraint firstItem="BK6-TZ-Fw8" firstAttribute="top" secondItem="ZTL-oi-jx1" secondAttribute="bottom" id="EjE-4W-UuH"/>
+                                    <constraint firstAttribute="bottom" secondItem="BK6-TZ-Fw8" secondAttribute="bottom" id="IQN-h5-VOU"/>
+                                    <constraint firstItem="ZTL-oi-jx1" firstAttribute="leading" secondItem="lR7-es-a1N" secondAttribute="leading" id="Lve-BD-Vdk"/>
+                                    <constraint firstAttribute="trailing" secondItem="BK6-TZ-Fw8" secondAttribute="trailing" id="lgz-Fx-dS6"/>
+                                    <constraint firstAttribute="trailing" secondItem="ZTL-oi-jx1" secondAttribute="trailing" id="u7T-xk-Mvv"/>
+                                </constraints>
                             </customView>
                         </subviews>
                         <constraints>
-                            <constraint firstItem="ZTL-oi-jx1" firstAttribute="leading" secondItem="O0h-RK-4bo" secondAttribute="leading" id="6UD-f0-ote"/>
-                            <constraint firstAttribute="bottom" secondItem="BK6-TZ-Fw8" secondAttribute="bottom" id="BPK-qA-uHY"/>
-                            <constraint firstItem="BK6-TZ-Fw8" firstAttribute="top" secondItem="ZTL-oi-jx1" secondAttribute="bottom" id="CCV-Bi-LqY"/>
-                            <constraint firstAttribute="trailing" secondItem="ZTL-oi-jx1" secondAttribute="trailing" id="D1G-Ed-2Da"/>
-                            <constraint firstItem="ZTL-oi-jx1" firstAttribute="top" secondItem="ari-Wn-bbp" secondAttribute="bottom" id="Dev-iI-648"/>
-                            <constraint firstAttribute="trailing" secondItem="BK6-TZ-Fw8" secondAttribute="trailing" id="GPM-ci-ZJI"/>
-                            <constraint firstItem="BK6-TZ-Fw8" firstAttribute="top" secondItem="ZTL-oi-jx1" secondAttribute="bottom" id="IpD-QO-WVE"/>
+                            <constraint firstItem="lR7-es-a1N" firstAttribute="top" secondItem="ari-Wn-bbp" secondAttribute="bottom" id="2Q9-dr-Haa"/>
+                            <constraint firstItem="lR7-es-a1N" firstAttribute="leading" secondItem="O0h-RK-4bo" secondAttribute="leading" id="HMG-ce-fZj"/>
                             <constraint firstItem="ari-Wn-bbp" firstAttribute="leading" secondItem="O0h-RK-4bo" secondAttribute="leading" id="Iyq-uR-IoN"/>
-                            <constraint firstAttribute="bottom" secondItem="BK6-TZ-Fw8" secondAttribute="bottom" id="KOa-K8-rWr"/>
-                            <constraint firstItem="BK6-TZ-Fw8" firstAttribute="leading" secondItem="O0h-RK-4bo" secondAttribute="leading" id="Ldv-N6-Isp"/>
+                            <constraint firstAttribute="trailing" secondItem="lR7-es-a1N" secondAttribute="trailing" id="PnR-3m-nRx"/>
                             <constraint firstAttribute="trailing" secondItem="ari-Wn-bbp" secondAttribute="trailing" id="R8J-X6-PPa"/>
-                            <constraint firstAttribute="trailing" secondItem="BK6-TZ-Fw8" secondAttribute="trailing" id="di8-tZ-M1j"/>
                             <constraint firstItem="ari-Wn-bbp" firstAttribute="top" secondItem="O0h-RK-4bo" secondAttribute="top" id="hAz-0u-UW9"/>
-                            <constraint firstItem="BK6-TZ-Fw8" firstAttribute="leading" secondItem="O0h-RK-4bo" secondAttribute="leading" id="i0j-6F-uVV"/>
+                            <constraint firstAttribute="bottom" secondItem="lR7-es-a1N" secondAttribute="bottom" id="lpY-dJ-F4a"/>
                         </constraints>
                     </view>
                 </box>

+ 1 - 1
PDF Office/PDF Master/KMClass/KMPDFViewController/KMLinkViewController/Views/KMLinkEmailView/KMLinkEmailView.swift

@@ -49,7 +49,7 @@ public class KMLinkEmailView: BaseXibView {
         inputTextarea.properties = ComponentTextareaProperty(size: .m,
                                                              state: .normal,
                                                              isError: false,
-                                                             placeholderString: "http://www.pdfreaderpro.com",
+                                                             placeholderString: "support@pdfreaderpro.com",
                                                              totalCount: -1,
                                                              text: "",
                                                              isDisabled:false)

+ 1 - 1
PDF Office/PDF Master/KMClass/KMPDFViewController/KMLinkViewController/Views/KMLinkWebView/KMLinkWebView.swift

@@ -51,7 +51,7 @@ public class KMLinkWebView: BaseXibView {
         inputTextarea.properties = ComponentTextareaProperty(size: .m,
                                                              state: .normal,
                                                              isError: false,
-                                                             placeholderString: "http://www.pdfreaderpro.com",
+                                                             placeholderString: "https://www.pdfreaderpro.com",
                                                              totalCount: -1,
                                                              text: "",
                                                              isDisabled:false)

+ 93 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/KMLinkViewController/Views/KMNLinkMultiController/KMNLinkMultiController.swift

@@ -0,0 +1,93 @@
+//
+//  KMNLinkMultiController.swift
+//  PDF Reader Pro
+//
+//  Created by Niehaoyu on 2024/10/21.
+//
+
+import Cocoa
+import KMComponentLibrary
+
+@objc protocol KMNLinkMultiControllerDelegate: AnyObject {
+    
+    @objc optional func multiControllerDidClick(_ controller: KMNLinkMultiController, _ alignmentType: KMAnnotationsAlignmentType)
+ 
+}
+ 
+class KMNLinkMultiController: NSViewController {
+
+    @IBOutlet var contendBox: NSBox!
+    @IBOutlet var titleLabel: NSTextField!
+    
+    @IBOutlet var aligLeftButton: ComponentButton!
+    @IBOutlet var aligLeftCenterButton: ComponentButton!
+    @IBOutlet var aligRightButton: ComponentButton!
+    @IBOutlet var aligTopButton: ComponentButton!
+    @IBOutlet var aligTopCenterButton: ComponentButton!
+    @IBOutlet var aligBottomButton: ComponentButton!
+    @IBOutlet var aligHorizontalXButton: ComponentButton!
+    @IBOutlet var aligVerticalYButton: ComponentButton!
+    
+    weak open var delegate: KMNLinkMultiControllerDelegate?
+    
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        // Do view setup here.
+        
+        titleLabel.stringValue = KMLocalizedString("Alignment")
+        
+        aligLeftButton.properties = ComponentButtonProperty(type: .text_gray, size: .s, onlyIcon: true)
+        aligLeftButton.properties.propertyInfo.leftIcon_nor = NSImage(named: "alignLeft")
+        
+        aligLeftCenterButton.properties = ComponentButtonProperty(type: .text_gray, size: .s, onlyIcon: true)
+        aligLeftCenterButton.properties.propertyInfo.leftIcon_nor = NSImage(named: "alignXCenter")
+        
+        aligRightButton.properties = ComponentButtonProperty(type: .text_gray, size: .s, onlyIcon: true)
+        aligRightButton.properties.propertyInfo.leftIcon_nor = NSImage(named: "alignRight")
+        
+        aligTopButton.properties = ComponentButtonProperty(type: .text_gray, size: .s, onlyIcon: true)
+        aligTopButton.properties.propertyInfo.leftIcon_nor = NSImage(named: "alignTop")
+        
+        aligTopCenterButton.properties = ComponentButtonProperty(type: .text_gray, size: .s, onlyIcon: true)
+        aligTopCenterButton.properties.propertyInfo.leftIcon_nor = NSImage(named: "alignYCenter")
+        
+        aligBottomButton.properties = ComponentButtonProperty(type: .text_gray, size: .s, onlyIcon: true)
+        aligBottomButton.properties.propertyInfo.leftIcon_nor = NSImage(named: "alignBottom")
+        
+        aligHorizontalXButton.properties = ComponentButtonProperty(type: .text_gray, size: .s, onlyIcon: true)
+        aligHorizontalXButton.properties.propertyInfo.leftIcon_dis = NSImage(named: "alignHorizonal_dis")
+        aligHorizontalXButton.properties.isDisabled = true
+        
+        aligVerticalYButton.properties = ComponentButtonProperty(type: .text_gray, size: .s, onlyIcon: true)
+        aligVerticalYButton.properties.propertyInfo.leftIcon_dis = NSImage(named: "alignAverageVertical_dis")
+        aligVerticalYButton.properties.isDisabled = true
+        
+        for button in [aligLeftButton, aligLeftCenterButton, aligRightButton, aligTopButton,
+                       aligTopCenterButton, aligBottomButton, aligHorizontalXButton, aligVerticalYButton] {
+            
+            button?.reloadData()
+            button?.setTarget(self, action: #selector(buttonClicked(_:)))
+        }
+        
+    }
+   
+    @objc func buttonClicked(_ sender: ComponentButton) {
+        var alignmentType: KMAnnotationsAlignmentType = .None
+        if sender == aligLeftButton {
+            alignmentType = .Left
+        } else if sender == aligLeftCenterButton {
+            alignmentType = .XCenter
+        } else if sender == aligRightButton {
+            alignmentType = .Right
+        } else if sender == aligTopButton {
+            alignmentType = .Top
+        } else if sender == aligTopCenterButton {
+            alignmentType = .YCenter
+        } else if sender == aligBottomButton {
+            alignmentType = .Bottom
+        }
+        
+        delegate?.multiControllerDidClick?(self, alignmentType)
+    }
+    
+}

+ 155 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/KMLinkViewController/Views/KMNLinkMultiController/KMNLinkMultiController.xib

@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="22505" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22505"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMNLinkMultiController" customModule="PDF_Reader_Pro" customModuleProvider="target">
+            <connections>
+                <outlet property="aligBottomButton" destination="c5m-oJ-Mrg" id="cTD-cq-fos"/>
+                <outlet property="aligHorizontalXButton" destination="xex-s9-yRv" id="u2j-y5-9is"/>
+                <outlet property="aligLeftButton" destination="JsC-iM-uae" id="XVZ-dc-nS1"/>
+                <outlet property="aligLeftCenterButton" destination="55T-Gf-aTs" id="fSl-Bf-iLt"/>
+                <outlet property="aligRightButton" destination="5bH-Yv-Hcb" id="u9e-cv-QRi"/>
+                <outlet property="aligTopButton" destination="IFg-YZ-X1K" id="hRa-Js-CWz"/>
+                <outlet property="aligTopCenterButton" destination="yzA-t3-rej" id="4Wz-eh-DMO"/>
+                <outlet property="aligVerticalYButton" destination="QFD-j7-2aX" id="Xxz-c5-4Ww"/>
+                <outlet property="contendBox" destination="wds-Gi-bXC" id="ZId-OW-tih"/>
+                <outlet property="titleLabel" destination="5ez-oE-1Ci" id="wgi-QV-6Bn"/>
+                <outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customView id="Hz6-mo-xeY">
+            <rect key="frame" x="0.0" y="0.0" width="264" height="373"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <box boxType="custom" borderWidth="0.0" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="wds-Gi-bXC">
+                    <rect key="frame" x="0.0" y="0.0" width="264" height="373"/>
+                    <view key="contentView" id="68H-im-AUh">
+                        <rect key="frame" x="0.0" y="0.0" width="264" height="373"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <customView translatesAutoresizingMaskIntoConstraints="NO" id="uts-mo-cZM">
+                                <rect key="frame" x="0.0" y="333" width="264" height="40"/>
+                                <subviews>
+                                    <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="5ez-oE-1Ci">
+                                        <rect key="frame" x="14" y="12" width="37" height="16"/>
+                                        <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="sSS-VW-cXZ">
+                                            <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>
+                                </subviews>
+                                <constraints>
+                                    <constraint firstItem="5ez-oE-1Ci" firstAttribute="leading" secondItem="uts-mo-cZM" secondAttribute="leading" constant="16" id="J2Y-wA-fu9"/>
+                                    <constraint firstAttribute="height" constant="40" id="geO-eJ-2Ud"/>
+                                    <constraint firstItem="5ez-oE-1Ci" firstAttribute="centerY" secondItem="uts-mo-cZM" secondAttribute="centerY" id="ndv-uT-XBn"/>
+                                </constraints>
+                            </customView>
+                            <customView translatesAutoresizingMaskIntoConstraints="NO" id="pR5-9r-pOd">
+                                <rect key="frame" x="16" y="261" width="232" height="72"/>
+                                <subviews>
+                                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="JsC-iM-uae" customClass="ComponentButton" customModule="KMComponentLibrary">
+                                        <rect key="frame" x="0.0" y="40" width="32" height="32"/>
+                                        <constraints>
+                                            <constraint firstAttribute="width" constant="32" id="LY4-ht-1Fr"/>
+                                            <constraint firstAttribute="height" constant="32" id="b8x-ev-CSy"/>
+                                        </constraints>
+                                    </customView>
+                                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="55T-Gf-aTs" customClass="ComponentButton" customModule="KMComponentLibrary">
+                                        <rect key="frame" x="40" y="40" width="32" height="32"/>
+                                        <constraints>
+                                            <constraint firstAttribute="width" constant="32" id="Wlf-KV-QCf"/>
+                                            <constraint firstAttribute="height" constant="32" id="bc0-zk-Gpw"/>
+                                        </constraints>
+                                    </customView>
+                                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="5bH-Yv-Hcb" customClass="ComponentButton" customModule="KMComponentLibrary">
+                                        <rect key="frame" x="80" y="40" width="32" height="32"/>
+                                        <constraints>
+                                            <constraint firstAttribute="height" constant="32" id="dZp-rj-YPY"/>
+                                            <constraint firstAttribute="width" constant="32" id="ll8-EC-2SF"/>
+                                        </constraints>
+                                    </customView>
+                                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="IFg-YZ-X1K" customClass="ComponentButton" customModule="KMComponentLibrary">
+                                        <rect key="frame" x="120" y="40" width="32" height="32"/>
+                                        <constraints>
+                                            <constraint firstAttribute="width" constant="32" id="8ut-gj-zIl"/>
+                                            <constraint firstAttribute="height" constant="32" id="lle-Da-UJL"/>
+                                        </constraints>
+                                    </customView>
+                                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="yzA-t3-rej" customClass="ComponentButton" customModule="KMComponentLibrary">
+                                        <rect key="frame" x="160" y="40" width="32" height="32"/>
+                                        <constraints>
+                                            <constraint firstAttribute="width" constant="32" id="Cbq-Xk-Atl"/>
+                                            <constraint firstAttribute="height" constant="32" id="ZBi-cR-mX0"/>
+                                        </constraints>
+                                    </customView>
+                                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="c5m-oJ-Mrg" customClass="ComponentButton" customModule="KMComponentLibrary">
+                                        <rect key="frame" x="200" y="40" width="32" height="32"/>
+                                        <constraints>
+                                            <constraint firstAttribute="height" constant="32" id="8GB-GL-asv"/>
+                                            <constraint firstAttribute="width" constant="32" id="bzX-Ke-ynQ"/>
+                                        </constraints>
+                                    </customView>
+                                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="xex-s9-yRv" customClass="ComponentButton" customModule="KMComponentLibrary">
+                                        <rect key="frame" x="0.0" y="0.0" width="32" height="32"/>
+                                        <constraints>
+                                            <constraint firstAttribute="height" constant="32" id="G2I-82-8em"/>
+                                            <constraint firstAttribute="width" constant="32" id="f9b-Yb-Aux"/>
+                                        </constraints>
+                                    </customView>
+                                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="QFD-j7-2aX" customClass="ComponentButton" customModule="KMComponentLibrary">
+                                        <rect key="frame" x="40" y="0.0" width="32" height="32"/>
+                                        <constraints>
+                                            <constraint firstAttribute="height" constant="32" id="Bd8-fj-kmQ"/>
+                                            <constraint firstAttribute="width" constant="32" id="WLW-Zi-K5X"/>
+                                        </constraints>
+                                    </customView>
+                                </subviews>
+                                <constraints>
+                                    <constraint firstItem="xex-s9-yRv" firstAttribute="leading" secondItem="pR5-9r-pOd" secondAttribute="leading" id="0oY-Bu-61A"/>
+                                    <constraint firstAttribute="height" constant="72" id="23e-4E-5Hd"/>
+                                    <constraint firstItem="JsC-iM-uae" firstAttribute="top" secondItem="pR5-9r-pOd" secondAttribute="top" id="EuB-kt-jyh"/>
+                                    <constraint firstItem="IFg-YZ-X1K" firstAttribute="leading" secondItem="5bH-Yv-Hcb" secondAttribute="trailing" constant="8" id="GGa-IA-uNW"/>
+                                    <constraint firstItem="IFg-YZ-X1K" firstAttribute="top" secondItem="pR5-9r-pOd" secondAttribute="top" id="Gea-zh-A4h"/>
+                                    <constraint firstItem="55T-Gf-aTs" firstAttribute="top" secondItem="pR5-9r-pOd" secondAttribute="top" id="HYC-Ox-gOH"/>
+                                    <constraint firstItem="xex-s9-yRv" firstAttribute="top" secondItem="JsC-iM-uae" secondAttribute="bottom" constant="8" id="OOS-IK-s07"/>
+                                    <constraint firstAttribute="width" constant="232" id="TSt-ga-oxn"/>
+                                    <constraint firstItem="JsC-iM-uae" firstAttribute="leading" secondItem="pR5-9r-pOd" secondAttribute="leading" id="W8E-tV-SKv"/>
+                                    <constraint firstItem="55T-Gf-aTs" firstAttribute="leading" secondItem="JsC-iM-uae" secondAttribute="trailing" constant="8" id="adc-lw-DKn"/>
+                                    <constraint firstItem="QFD-j7-2aX" firstAttribute="top" secondItem="55T-Gf-aTs" secondAttribute="bottom" constant="8" id="iUe-x2-L6S"/>
+                                    <constraint firstItem="yzA-t3-rej" firstAttribute="top" secondItem="pR5-9r-pOd" secondAttribute="top" id="joB-Hj-CjT"/>
+                                    <constraint firstItem="5bH-Yv-Hcb" firstAttribute="top" secondItem="pR5-9r-pOd" secondAttribute="top" id="l02-uW-usa"/>
+                                    <constraint firstItem="5bH-Yv-Hcb" firstAttribute="leading" secondItem="55T-Gf-aTs" secondAttribute="trailing" constant="8" id="lJE-AB-grE"/>
+                                    <constraint firstItem="c5m-oJ-Mrg" firstAttribute="leading" secondItem="yzA-t3-rej" secondAttribute="trailing" constant="8" id="lh6-yj-1ME"/>
+                                    <constraint firstItem="c5m-oJ-Mrg" firstAttribute="top" secondItem="pR5-9r-pOd" secondAttribute="top" id="pbm-Pj-nWC"/>
+                                    <constraint firstItem="yzA-t3-rej" firstAttribute="leading" secondItem="IFg-YZ-X1K" secondAttribute="trailing" constant="8" id="t30-LG-rg8"/>
+                                    <constraint firstItem="QFD-j7-2aX" firstAttribute="leading" secondItem="xex-s9-yRv" secondAttribute="trailing" constant="8" id="tV0-T7-QPj"/>
+                                </constraints>
+                            </customView>
+                        </subviews>
+                        <constraints>
+                            <constraint firstItem="uts-mo-cZM" firstAttribute="top" secondItem="68H-im-AUh" secondAttribute="top" id="9Xl-Gq-RLL"/>
+                            <constraint firstItem="pR5-9r-pOd" firstAttribute="centerX" secondItem="68H-im-AUh" secondAttribute="centerX" id="Vh0-Sr-MfM"/>
+                            <constraint firstAttribute="trailing" secondItem="uts-mo-cZM" secondAttribute="trailing" id="oAR-uH-TMv"/>
+                            <constraint firstItem="uts-mo-cZM" firstAttribute="leading" secondItem="68H-im-AUh" secondAttribute="leading" id="pYk-WW-gmw"/>
+                            <constraint firstItem="pR5-9r-pOd" firstAttribute="top" secondItem="uts-mo-cZM" secondAttribute="bottom" id="yXS-YF-mzM"/>
+                        </constraints>
+                    </view>
+                </box>
+            </subviews>
+            <constraints>
+                <constraint firstAttribute="trailing" secondItem="wds-Gi-bXC" secondAttribute="trailing" id="GcI-gA-vAm"/>
+                <constraint firstAttribute="bottom" secondItem="wds-Gi-bXC" secondAttribute="bottom" id="MaQ-dl-gXu"/>
+                <constraint firstItem="wds-Gi-bXC" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" id="OD1-DM-EcF"/>
+                <constraint firstItem="wds-Gi-bXC" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" id="Qyj-4s-7Hy"/>
+            </constraints>
+            <point key="canvasLocation" x="109" y="145.5"/>
+        </customView>
+    </objects>
+</document>

+ 20 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/KMPDFConfig.swift

@@ -0,0 +1,20 @@
+//
+//  KMPDFConfig.swift
+//  PDF Reader Pro
+//
+//  Created by Niehaoyu on 2024/10/21.
+//
+
+import Cocoa
+
+@objc public enum KMAnnotationsAlignmentType: Int, CaseIterable{
+    case None = 0
+    case Left
+    case XCenter
+    case Right
+    case Top
+    case YCenter
+    case Bottom
+    case Horizontal
+    case Vertical
+}

+ 6 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 12 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignAverageVertical_dis.imageset/Contents.json

@@ -0,0 +1,12 @@
+{
+  "images" : [
+    {
+      "filename" : "alignAverageVertical_dis.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 83 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignAverageVertical_dis.imageset/alignAverageVertical_dis.pdf

@@ -0,0 +1,83 @@
+%PDF-1.7
+
+1 0 obj
+  << >>
+endobj
+
+2 0 obj
+  << /Length 3 0 R >>
+stream
+/DeviceRGB CS
+/DeviceRGB cs
+q
+-1.000000 0.000000 -0.000000 -1.000000 15.000001 18.000000 cm
+0.717647 0.729412 0.749020 scn
+0.000000 10.499999 m
+14.000000 10.500000 l
+14.000000 12.000000 l
+0.000000 12.000000 l
+0.000000 10.499999 l
+h
+3.000000 7.499999 m
+11.000000 7.499999 l
+11.000000 4.500000 l
+3.000000 4.500000 l
+3.000000 7.499999 l
+h
+14.000001 0.000000 m
+0.000000 -0.000001 l
+0.000000 1.499999 l
+14.000001 1.500000 l
+14.000001 0.000000 l
+h
+f*
+n
+Q
+
+endstream
+endobj
+
+3 0 obj
+  449
+endobj
+
+4 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 20.000000 20.000000 ]
+     /Resources 1 0 R
+     /Contents 2 0 R
+     /Parent 5 0 R
+  >>
+endobj
+
+5 0 obj
+  << /Kids [ 4 0 R ]
+     /Count 1
+     /Type /Pages
+  >>
+endobj
+
+6 0 obj
+  << /Pages 5 0 R
+     /Type /Catalog
+  >>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000010 00000 n
+0000000034 00000 n
+0000000539 00000 n
+0000000561 00000 n
+0000000734 00000 n
+0000000808 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 6 0 R
+   /Size 7
+>>
+startxref
+867
+%%EOF

+ 12 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignBottom.imageset/Contents.json

@@ -0,0 +1,12 @@
+{
+  "images" : [
+    {
+      "filename" : "alignBottom.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 83 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignBottom.imageset/alignBottom.pdf

@@ -0,0 +1,83 @@
+%PDF-1.7
+
+1 0 obj
+  << >>
+endobj
+
+2 0 obj
+  << /Length 3 0 R >>
+stream
+/DeviceRGB CS
+/DeviceRGB cs
+q
+1.000000 0.000000 -0.000000 1.000000 1.250000 2.500000 cm
+0.250980 0.274510 0.325490 scn
+10.000000 15.000000 m
+13.750000 15.000000 l
+13.750000 3.750000 l
+10.000000 3.750000 l
+10.000000 15.000000 l
+h
+3.750000 11.250000 m
+7.500000 11.250000 l
+7.500000 3.750000 l
+3.750000 3.750000 l
+3.750000 11.250000 l
+h
+0.000000 0.000000 m
+17.500000 0.000000 l
+17.500000 1.875000 l
+0.000000 1.875000 l
+0.000000 0.000000 l
+h
+f*
+n
+Q
+
+endstream
+endobj
+
+3 0 obj
+  445
+endobj
+
+4 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 20.000000 20.000000 ]
+     /Resources 1 0 R
+     /Contents 2 0 R
+     /Parent 5 0 R
+  >>
+endobj
+
+5 0 obj
+  << /Kids [ 4 0 R ]
+     /Count 1
+     /Type /Pages
+  >>
+endobj
+
+6 0 obj
+  << /Pages 5 0 R
+     /Type /Catalog
+  >>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000010 00000 n
+0000000034 00000 n
+0000000535 00000 n
+0000000557 00000 n
+0000000730 00000 n
+0000000804 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 6 0 R
+   /Size 7
+>>
+startxref
+863
+%%EOF

+ 12 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignHorizonal_dis.imageset/Contents.json

@@ -0,0 +1,12 @@
+{
+  "images" : [
+    {
+      "filename" : "alignHorizonal_dis.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 83 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignHorizonal_dis.imageset/alignHorizonal_dis.pdf

@@ -0,0 +1,83 @@
+%PDF-1.7
+
+1 0 obj
+  << >>
+endobj
+
+2 0 obj
+  << /Length 3 0 R >>
+stream
+/DeviceRGB CS
+/DeviceRGB cs
+q
+1.000000 0.000000 -0.000000 1.000000 2.000000 5.000000 cm
+0.717647 0.729412 0.749020 scn
+0.000000 0.000000 m
+0.000000 14.000000 l
+1.500000 14.000000 l
+1.500000 0.000000 l
+0.000000 0.000000 l
+h
+4.500000 11.000000 m
+7.500000 11.000000 l
+7.500000 3.000000 l
+4.500000 3.000000 l
+4.500000 11.000000 l
+h
+10.500000 14.000000 m
+10.500000 0.000000 l
+12.000000 0.000000 l
+12.000000 14.000000 l
+10.500000 14.000000 l
+h
+f*
+n
+Q
+
+endstream
+endobj
+
+3 0 obj
+  445
+endobj
+
+4 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 20.000000 20.000000 ]
+     /Resources 1 0 R
+     /Contents 2 0 R
+     /Parent 5 0 R
+  >>
+endobj
+
+5 0 obj
+  << /Kids [ 4 0 R ]
+     /Count 1
+     /Type /Pages
+  >>
+endobj
+
+6 0 obj
+  << /Pages 5 0 R
+     /Type /Catalog
+  >>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000010 00000 n
+0000000034 00000 n
+0000000535 00000 n
+0000000557 00000 n
+0000000730 00000 n
+0000000804 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 6 0 R
+   /Size 7
+>>
+startxref
+863
+%%EOF

+ 12 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignLeft.imageset/Contents.json

@@ -0,0 +1,12 @@
+{
+  "images" : [
+    {
+      "filename" : "alignLeft.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 83 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignLeft.imageset/alignLeft.pdf

@@ -0,0 +1,83 @@
+%PDF-1.7
+
+1 0 obj
+  << >>
+endobj
+
+2 0 obj
+  << /Length 3 0 R >>
+stream
+/DeviceRGB CS
+/DeviceRGB cs
+q
+1.000000 0.000000 -0.000000 1.000000 2.704590 1.250000 cm
+0.250980 0.274510 0.325490 scn
+0.000000 0.000000 m
+0.000000 17.500000 l
+1.500000 17.500000 l
+1.500000 0.000000 l
+0.000000 0.000000 l
+h
+3.545410 13.750000 m
+11.045409 13.750000 l
+11.045409 10.000000 l
+3.545410 10.000000 l
+3.545410 13.750000 l
+h
+14.795410 7.500000 m
+3.545410 7.500000 l
+3.545410 3.750000 l
+14.795410 3.750000 l
+14.795410 7.500000 l
+h
+f*
+n
+Q
+
+endstream
+endobj
+
+3 0 obj
+  444
+endobj
+
+4 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 20.000000 20.000000 ]
+     /Resources 1 0 R
+     /Contents 2 0 R
+     /Parent 5 0 R
+  >>
+endobj
+
+5 0 obj
+  << /Kids [ 4 0 R ]
+     /Count 1
+     /Type /Pages
+  >>
+endobj
+
+6 0 obj
+  << /Pages 5 0 R
+     /Type /Catalog
+  >>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000010 00000 n
+0000000034 00000 n
+0000000534 00000 n
+0000000556 00000 n
+0000000729 00000 n
+0000000803 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 6 0 R
+   /Size 7
+>>
+startxref
+862
+%%EOF

+ 12 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignRight.imageset/Contents.json

@@ -0,0 +1,12 @@
+{
+  "images" : [
+    {
+      "filename" : "alignRight.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 83 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignRight.imageset/alignRight.pdf

@@ -0,0 +1,83 @@
+%PDF-1.7
+
+1 0 obj
+  << >>
+endobj
+
+2 0 obj
+  << /Length 3 0 R >>
+stream
+/DeviceRGB CS
+/DeviceRGB cs
+q
+-1.000000 0.000000 -0.000000 -1.000000 17.312502 18.750000 cm
+0.250980 0.274510 0.325490 scn
+0.000000 0.000000 m
+0.000000 17.500000 l
+1.500000 17.500000 l
+1.500000 0.000000 l
+0.000000 0.000000 l
+h
+3.562500 13.750000 m
+14.812499 13.750000 l
+14.812499 10.000001 l
+3.562500 10.000001 l
+3.562500 13.750000 l
+h
+12.312500 7.500001 m
+3.562500 7.500001 l
+3.562500 3.750002 l
+12.312500 3.750001 l
+12.312500 7.500001 l
+h
+f*
+n
+Q
+
+endstream
+endobj
+
+3 0 obj
+  448
+endobj
+
+4 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 20.000000 20.000000 ]
+     /Resources 1 0 R
+     /Contents 2 0 R
+     /Parent 5 0 R
+  >>
+endobj
+
+5 0 obj
+  << /Kids [ 4 0 R ]
+     /Count 1
+     /Type /Pages
+  >>
+endobj
+
+6 0 obj
+  << /Pages 5 0 R
+     /Type /Catalog
+  >>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000010 00000 n
+0000000034 00000 n
+0000000538 00000 n
+0000000560 00000 n
+0000000733 00000 n
+0000000807 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 6 0 R
+   /Size 7
+>>
+startxref
+866
+%%EOF

+ 12 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignTop.imageset/Contents.json

@@ -0,0 +1,12 @@
+{
+  "images" : [
+    {
+      "filename" : "alignTop.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 83 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignTop.imageset/alignTop.pdf

@@ -0,0 +1,83 @@
+%PDF-1.7
+
+1 0 obj
+  << >>
+endobj
+
+2 0 obj
+  << /Length 3 0 R >>
+stream
+/DeviceRGB CS
+/DeviceRGB cs
+q
+0.000000 -1.000000 1.000000 0.000000 3.750000 17.500000 cm
+0.250980 0.274510 0.325490 scn
+0.000000 15.000000 m
+0.000000 -2.500000 l
+1.875000 -2.500000 l
+1.875000 15.000000 l
+0.000000 15.000000 l
+h
+3.750000 11.250000 m
+11.250000 11.250000 l
+11.250000 7.500000 l
+3.750000 7.500000 l
+3.750000 11.250000 l
+h
+3.750000 5.000000 m
+15.000000 5.000000 l
+15.000000 1.250000 l
+3.750000 1.250000 l
+3.750000 5.000000 l
+h
+f*
+n
+Q
+
+endstream
+endobj
+
+3 0 obj
+  445
+endobj
+
+4 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 20.000000 20.000000 ]
+     /Resources 1 0 R
+     /Contents 2 0 R
+     /Parent 5 0 R
+  >>
+endobj
+
+5 0 obj
+  << /Kids [ 4 0 R ]
+     /Count 1
+     /Type /Pages
+  >>
+endobj
+
+6 0 obj
+  << /Pages 5 0 R
+     /Type /Catalog
+  >>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000010 00000 n
+0000000034 00000 n
+0000000535 00000 n
+0000000557 00000 n
+0000000730 00000 n
+0000000804 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 6 0 R
+   /Size 7
+>>
+startxref
+863
+%%EOF

+ 12 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignXCenter.imageset/Contents.json

@@ -0,0 +1,12 @@
+{
+  "images" : [
+    {
+      "filename" : "alignXCenter.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 87 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignXCenter.imageset/alignXCenter.pdf

@@ -0,0 +1,87 @@
+%PDF-1.7
+
+1 0 obj
+  << >>
+endobj
+
+2 0 obj
+  << /Length 3 0 R >>
+stream
+/DeviceRGB CS
+/DeviceRGB cs
+q
+-1.000000 0.000000 -0.000000 -1.000000 17.500002 18.750000 cm
+0.250980 0.274510 0.325490 scn
+6.749998 7.499999 m
+6.749998 10.000001 l
+2.499998 10.000001 l
+2.499998 13.750000 l
+6.749998 13.750000 l
+6.749998 17.500000 l
+8.249998 17.500000 l
+8.249998 13.750000 l
+12.499998 13.750000 l
+12.499998 10.000001 l
+8.249998 10.000001 l
+8.249998 7.499999 l
+15.000000 7.499999 l
+15.000000 3.750001 l
+8.249998 3.750001 l
+8.249998 0.000000 l
+6.749998 0.000000 l
+6.749998 3.750001 l
+0.000000 3.750001 l
+0.000000 7.499999 l
+6.749998 7.499999 l
+h
+f*
+n
+Q
+
+endstream
+endobj
+
+3 0 obj
+  566
+endobj
+
+4 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 20.000000 20.000000 ]
+     /Resources 1 0 R
+     /Contents 2 0 R
+     /Parent 5 0 R
+  >>
+endobj
+
+5 0 obj
+  << /Kids [ 4 0 R ]
+     /Count 1
+     /Type /Pages
+  >>
+endobj
+
+6 0 obj
+  << /Pages 5 0 R
+     /Type /Catalog
+  >>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000010 00000 n
+0000000034 00000 n
+0000000656 00000 n
+0000000678 00000 n
+0000000851 00000 n
+0000000925 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 6 0 R
+   /Size 7
+>>
+startxref
+984
+%%EOF

+ 12 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignYCenter.imageset/Contents.json

@@ -0,0 +1,12 @@
+{
+  "images" : [
+    {
+      "filename" : "alignYCenter.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 87 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Alignment/alignYCenter.imageset/alignYCenter.pdf

@@ -0,0 +1,87 @@
+%PDF-1.7
+
+1 0 obj
+  << >>
+endobj
+
+2 0 obj
+  << /Length 3 0 R >>
+stream
+/DeviceRGB CS
+/DeviceRGB cs
+q
+0.000000 -1.000000 1.000000 0.000000 3.750000 17.500000 cm
+0.250980 0.274510 0.325490 scn
+6.749998 5.000000 m
+6.749998 7.500000 l
+2.499999 7.500000 l
+2.499999 11.249999 l
+6.749998 11.249999 l
+6.749998 15.000000 l
+8.249998 15.000000 l
+8.249998 11.249999 l
+12.499998 11.249999 l
+12.499999 7.500000 l
+8.249998 7.500000 l
+8.249998 5.000000 l
+15.000000 5.000000 l
+15.000000 1.250002 l
+8.249998 1.250002 l
+8.249998 -2.500000 l
+6.749998 -2.500000 l
+6.749998 1.250002 l
+0.000000 1.250002 l
+0.000000 5.000000 l
+6.749998 5.000000 l
+h
+f*
+n
+Q
+
+endstream
+endobj
+
+3 0 obj
+  561
+endobj
+
+4 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 20.000000 20.000000 ]
+     /Resources 1 0 R
+     /Contents 2 0 R
+     /Parent 5 0 R
+  >>
+endobj
+
+5 0 obj
+  << /Kids [ 4 0 R ]
+     /Count 1
+     /Type /Pages
+  >>
+endobj
+
+6 0 obj
+  << /Pages 5 0 R
+     /Type /Catalog
+  >>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000010 00000 n
+0000000034 00000 n
+0000000651 00000 n
+0000000673 00000 n
+0000000846 00000 n
+0000000920 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 6 0 R
+   /Size 7
+>>
+startxref
+979
+%%EOF

+ 6 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/PDFImages.xcassets/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 40 - 12
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -4331,6 +4331,18 @@
 		BB89DD7E2953F863007C3FFA /* KMWatermarkFileOutsideView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB89DD7D2953F863007C3FFA /* KMWatermarkFileOutsideView.swift */; };
 		BB89DD7F2953F863007C3FFA /* KMWatermarkFileOutsideView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB89DD7D2953F863007C3FFA /* KMWatermarkFileOutsideView.swift */; };
 		BB89DD802953F863007C3FFA /* KMWatermarkFileOutsideView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB89DD7D2953F863007C3FFA /* KMWatermarkFileOutsideView.swift */; };
+		BB8AA5382CC65C900084F183 /* KMNLinkMultiController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8AA5362CC65C900084F183 /* KMNLinkMultiController.swift */; };
+		BB8AA5392CC65C900084F183 /* KMNLinkMultiController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8AA5362CC65C900084F183 /* KMNLinkMultiController.swift */; };
+		BB8AA53A2CC65C900084F183 /* KMNLinkMultiController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8AA5362CC65C900084F183 /* KMNLinkMultiController.swift */; };
+		BB8AA53B2CC65C900084F183 /* KMNLinkMultiController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB8AA5372CC65C900084F183 /* KMNLinkMultiController.xib */; };
+		BB8AA53C2CC65C900084F183 /* KMNLinkMultiController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB8AA5372CC65C900084F183 /* KMNLinkMultiController.xib */; };
+		BB8AA53D2CC65C900084F183 /* KMNLinkMultiController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB8AA5372CC65C900084F183 /* KMNLinkMultiController.xib */; };
+		BB8AA53F2CC66E490084F183 /* PDFImages.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BB8AA53E2CC66E490084F183 /* PDFImages.xcassets */; };
+		BB8AA5402CC66E490084F183 /* PDFImages.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BB8AA53E2CC66E490084F183 /* PDFImages.xcassets */; };
+		BB8AA5412CC66E490084F183 /* PDFImages.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BB8AA53E2CC66E490084F183 /* PDFImages.xcassets */; };
+		BB8AA5432CC6711B0084F183 /* KMPDFConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8AA5422CC6711B0084F183 /* KMPDFConfig.swift */; };
+		BB8AA5442CC6711B0084F183 /* KMPDFConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8AA5422CC6711B0084F183 /* KMPDFConfig.swift */; };
+		BB8AA5452CC6711B0084F183 /* KMPDFConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8AA5422CC6711B0084F183 /* KMPDFConfig.swift */; };
 		BB8B17322907B63D001C5EA5 /* CipherTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8B17312907B63D001C5EA5 /* CipherTextView.swift */; };
 		BB8B17332907B63D001C5EA5 /* CipherTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8B17312907B63D001C5EA5 /* CipherTextView.swift */; };
 		BB8B17342907B63D001C5EA5 /* CipherTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8B17312907B63D001C5EA5 /* CipherTextView.swift */; };
@@ -7525,6 +7537,10 @@
 		BB897274294DC04F0045787C /* KMWatermartAdjectivePageRangeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMWatermartAdjectivePageRangeView.swift; sourceTree = "<group>"; };
 		BB897278294DFD1E0045787C /* KMWatermarkTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMWatermarkTextView.swift; sourceTree = "<group>"; };
 		BB89DD7D2953F863007C3FFA /* KMWatermarkFileOutsideView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMWatermarkFileOutsideView.swift; sourceTree = "<group>"; };
+		BB8AA5362CC65C900084F183 /* KMNLinkMultiController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMNLinkMultiController.swift; sourceTree = "<group>"; };
+		BB8AA5372CC65C900084F183 /* KMNLinkMultiController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMNLinkMultiController.xib; sourceTree = "<group>"; };
+		BB8AA53E2CC66E490084F183 /* PDFImages.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = PDFImages.xcassets; sourceTree = "<group>"; };
+		BB8AA5422CC6711B0084F183 /* KMPDFConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPDFConfig.swift; sourceTree = "<group>"; };
 		BB8B17312907B63D001C5EA5 /* CipherTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CipherTextView.swift; sourceTree = "<group>"; };
 		BB8B17352907B64D001C5EA5 /* CipherTextView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CipherTextView.xib; sourceTree = "<group>"; };
 		BB8B173B2907CDD8001C5EA5 /* NibLoadable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NibLoadable.swift; sourceTree = "<group>"; };
@@ -12814,6 +12830,8 @@
 		BB52F54C2CC1FA69007418DB /* KMPDFViewController */ = {
 			isa = PBXGroup;
 			children = (
+				BB8AA53E2CC66E490084F183 /* PDFImages.xcassets */,
+				BB8AA5422CC6711B0084F183 /* KMPDFConfig.swift */,
 				BB52F5632CC22FE8007418DB /* KMPDFViewController.swift */,
 				BB52F5642CC22FE8007418DB /* KMPDFViewController.xib */,
 				BB52F54E2CC1FA8F007418DB /* KMLinkViewController */,
@@ -12834,6 +12852,7 @@
 		BB52F5572CC1FB60007418DB /* Views */ = {
 			isa = PBXGroup;
 			children = (
+				BB8AA5342CC65C310084F183 /* KMNLinkMultiController */,
 				BB52F55A2CC1FB9A007418DB /* KMLinkEmailView */,
 				BB52F5592CC1FB91007418DB /* KMLinkWebView */,
 				BB52F5582CC1FB86007418DB /* KMLinkPageView */,
@@ -13643,6 +13662,15 @@
 			path = Model;
 			sourceTree = "<group>";
 		};
+		BB8AA5342CC65C310084F183 /* KMNLinkMultiController */ = {
+			isa = PBXGroup;
+			children = (
+				BB8AA5362CC65C900084F183 /* KMNLinkMultiController.swift */,
+				BB8AA5372CC65C900084F183 /* KMNLinkMultiController.xib */,
+			);
+			path = KMNLinkMultiController;
+			sourceTree = "<group>";
+		};
 		BB8B172F2907A81E001C5EA5 /* RightSide */ = {
 			isa = PBXGroup;
 			children = (
@@ -15356,8 +15384,6 @@
 				ADD1B6FC2946C0D400C3FFF7 /* KMPrintChoosePageSizePamphletView.xib in Resources */,
 				ADBC376629CD86A000D93208 /* KMReadModelView.xcassets in Resources */,
 				9FF94F0C29A62B5000B1EF69 /* KMDesignSelect.xib in Resources */,
-				ADED71D929B57C01005EEC0A /* Localizable.strings in Resources */,
-				ADAFDA852AEB804B00F084BC /* KMQucikToolCollectionViewItem.xib in Resources */,
 				AD3AAD702B0DCC6800DE5FE7 /* KMCompareSaveWindow.xib in Resources */,
 				9F8810882B564E9700F69815 /* KMAnnotationButtonWidgetOptionsViewController.xib in Resources */,
 				AD3AAD4D2B0B7B9300DE5FE7 /* KMCompareTextView.xib in Resources */,
@@ -15446,6 +15472,7 @@
 				BB0FE0402B734DD1001E0F88 /* AITypeChooseView.xib in Resources */,
 				F3A9DC81294309D80074E5D2 /* CPDFListEditAnnotationViewController.xib in Resources */,
 				BB19A7362CB79D77008204DC /* KMHomeRecommondView.xib in Resources */,
+				BB8AA53F2CC66E490084F183 /* PDFImages.xcassets in Resources */,
 				ADBC375829CAE95700D93208 /* KMComparativeOutlineSectionCell.xib in Resources */,
 				BB234F042BA3D798008B3754 /* KMAIIconGuideView.xib in Resources */,
 				ADDF83982B391A5D00A81A4E /* PDFCertExportAccessoryView.xib in Resources */,
@@ -15495,6 +15522,7 @@
 				AD1CA4242A061D190070541F /* KMAnnotationScreenAuthorViewItem.xib in Resources */,
 				BBE788A22CBD2463008086E2 /* DropdownDemoVC.xib in Resources */,
 				9F0CB4622966C9E200007028 /* KMFormPropertPanelViewController.xib in Resources */,
+				BB8AA53B2CC65C900084F183 /* KMNLinkMultiController.xib in Resources */,
 				658FDBB52C9D90CE00EFA72E /* KMNoteFilterStateCollevtionViewItem.xib in Resources */,
 				BB5F8A1929BB15AD00365ADB /* pic_mail.pdf in Resources */,
 				9FDD0F962952FF4D000C4DAD /* $metadata.json in Resources */,
@@ -15653,8 +15681,6 @@
 				BB183DD42B4EAD5400F99C7E /* Ubuntu-Bold.ttf in Resources */,
 				9FB220DA2B0F4ED400A5B208 /* KMAnnotationSelectLinkViewController.xib in Resources */,
 				BB031B5A2C47BB080099F7AD /* KMUserFbHelpPopController.xib in Resources */,
-				89752DED293875FC003FF08E /* KMMainToolbarController.xib in Resources */,
-				9FAAA335290BD0A20046FFCE /* KMHistoryFileCollectionViewItem.xib in Resources */,
 				ADD1B6CB2942E85300C3FFF7 /* KMPrintBottomView.xib in Resources */,
 				89752DB02936F505003FF08E /* KMCustomButtonPopMenuViewController.xib in Resources */,
 				BB1B0B012B4FC6E900889528 /* KMConvertGuideView.xib in Resources */,
@@ -15967,7 +15993,6 @@
 				F30B22892CB8D9630041002E /* KMNQuickToolCollectionViewItem.xib in Resources */,
 				ADF1569829A62D31001D1018 /* KMLoginLeftImageView.xib in Resources */,
 				89316856296E45CA0073EA59 /* KMImageAccessoryController.xib in Resources */,
-				9F02018A2A1DA28B00C9B673 /* KMAILanguagePopVC.xib in Resources */,
 				9FF371D42C69B8C6005F9CC5 /* CPerimeterMeasureInfoWindowController.xib in Resources */,
 				9FA693AC2987C0590055488A /* KMStepperView.xib in Resources */,
 				BB1B0AFF2B4FC6E900889528 /* KMOpenFileFunctionView.xib in Resources */,
@@ -16047,6 +16072,7 @@
 				AD85D1BE2AF0D2DD000F4D28 /* KMHomeQuickToolsCollectionView.xib in Resources */,
 				BB03D6A12B024AC8008C9976 /* KMPDFEditInsertPageWindow.xib in Resources */,
 				BBA19F3729ADACC5001A285A /* signPicture_nor.pdf in Resources */,
+				BB8AA5402CC66E490084F183 /* PDFImages.xcassets in Resources */,
 				ADE3C1E829A5ABC200793B13 /* KMLoginWindowController.xib in Resources */,
 				BB49ED02293F459500C82CA2 /* KMConvertPPTsWindowController.xib in Resources */,
 				AD3AAD312B0B700500DE5FE7 /* KMCompareCoveringView.xib in Resources */,
@@ -16096,6 +16122,7 @@
 				658FDBB62C9D90CE00EFA72E /* KMNoteFilterStateCollevtionViewItem.xib in Resources */,
 				AD1D481D2AFB6B96007AC1F0 /* KMMergeWindowController.xib in Resources */,
 				ADFCEB652B4FBFC50001EBAF /* ad_cancel_button00@2x.png in Resources */,
+				BB8AA53C2CC65C900084F183 /* KMNLinkMultiController.xib in Resources */,
 				8997010228F40710009AF911 /* KMBookMarkViewController.xib in Resources */,
 				BB19A7532CB7C710008204DC /* KMHistoryFileThumbItem.xib in Resources */,
 				BBFE6E69293097A600142C01 /* KMPageRangePickerWindowController.xib in Resources */,
@@ -16299,7 +16326,6 @@
 				9FDD0F9D2952FF4D000C4DAD /* comp-light.json in Resources */,
 				BBB376A22B10A7FD009539CC /* a_2b.png in Resources */,
 				BB5A9D502CB6521400F64C1F /* SettingsWindowController.xib in Resources */,
-				ADED71DA29B57C01005EEC0A /* Localizable.strings in Resources */,
 				899700EC28F3E4D3009AF911 /* MainWindowController.xib in Resources */,
 				BB8F4553295A9FA50037EA22 /* KMCreateHeaderFooterController.xib in Resources */,
 				9F8539EC2947131F00DF644E /* KMChromiumTabView.xib in Resources */,
@@ -16322,7 +16348,6 @@
 				BB52F5712CC236A2007418DB /* KMLinkEmailView.xib in Resources */,
 				ADFA8F162B60E02B002595A4 /* KMSecureAlertView.xib in Resources */,
 				BB1EC8022967B26700EC0BC3 /* KMPDFEditViewController.xib in Resources */,
-				ADAFDA5F2AEB455500F084BC /* KMHomeContentView.xib in Resources */,
 				9FF371E02C69B93E005F9CC5 /* CAreaSettingWindowController.xib in Resources */,
 				AD1D48532AFB8510007AC1F0 /* KMMergeTableViewCell.xib in Resources */,
 				ADBC2CFF299CA6C7006280C8 /* KMPrintDuplexPrintingSetView.xib in Resources */,
@@ -16394,7 +16419,6 @@
 				ADAFDA522AEB43BF00F084BC /* KMAdvertisement.xcassets in Resources */,
 				9FF371DC2C69B937005F9CC5 /* CDistanceSettingWindowController.xib in Resources */,
 				AD68783929A60FC0005B5210 /* KMLoginView.xib in Resources */,
-				AD85D1882AEF46DF000F4D28 /* KMHomeNOFileView.xib in Resources */,
 				9FF371D02C69B8B6005F9CC5 /* KMMeasureSideVC.xib in Resources */,
 				BBB789972BE8BF2400F7E09C /* AIInfoInputView.xib in Resources */,
 				AD3AAD602B0DA3D400DE5FE7 /* KMCompareTextViewItem.xib in Resources */,
@@ -16545,6 +16569,7 @@
 				9F8810922B56614600F69815 /* KMAnnotationChoiceWidgetAppearanceViewController.xib in Resources */,
 				BB5E2EFE2C2BF3FF00657A61 /* KMEditPDFCropComfirmWindowController.xib in Resources */,
 				9F94748129FA24200042F949 /* Credits.rtf in Resources */,
+				BB8AA5412CC66E490084F183 /* PDFImages.xcassets in Resources */,
 				AD1D480D2AFB18DA007AC1F0 /* KMCompressWIndowControllerNew.xib in Resources */,
 				AD85D1A92AF09864000F4D28 /* KMHomeQuickToolsWindowController.xib in Resources */,
 				BBE788DD2CBD2464008086E2 /* ControllerVC.xib in Resources */,
@@ -16600,7 +16625,6 @@
 				AD85D1BF2AF0D2DD000F4D28 /* KMHomeQuickToolsCollectionView.xib in Resources */,
 				AD2432D52B89DFF800A119A9 /* KMFormAlertView.xib in Resources */,
 				654A5A862C89628C001FBD4B /* KMWatermarkAdjectivePropertyBaseController.xib in Resources */,
-				ADAFD9F92AE68A8500F084BC /* KMCreatPDFView.xib in Resources */,
 				9F1F82E82934D5240092C4B4 /* KMHomeExtractActionViewController.xib in Resources */,
 				ADDF83612B391A5C00A81A4E /* DSignatureCertifyDetailViewController.xib in Resources */,
 				BBA9222A2B4E96450061057A /* KMPurchaseCompareWindowController.xib in Resources */,
@@ -16794,7 +16818,6 @@
 				896933D629AEEE3D0055327F /* PageSheet.xib in Resources */,
 				BBAFC8412985194800D0648E /* KMPDFEditAppendWindow.xib in Resources */,
 				BBA19F3829ADACC5001A285A /* signPicture_nor.pdf in Resources */,
-				9FBA0EE628FEC253001117AF /* KMProductPromotionViewController.xib in Resources */,
 				F328C0BB2CA16F0500BFDD23 /* KMPresentationTopViewController.xib in Resources */,
 				ADD56F5C2BB3F48300E87ED9 /* KMFreeTextStylesViewController.xib in Resources */,
 				89E9B3FB295BE2EC00AEFA61 /* KMEditPDFTextPropertyViewController.xib in Resources */,
@@ -16847,6 +16870,7 @@
 				9F56648C2988B16F00020985 /* KMTextfieldVC.xib in Resources */,
 				9FA607E328FD4C9F00B46586 /* KMHomePopViewController.xib in Resources */,
 				F356720A29AF184A00740FF3 /* CPDFListAnnotationNoteWindowController.xib in Resources */,
+				BB8AA53D2CC65C900084F183 /* KMNLinkMultiController.xib in Resources */,
 				658FDBB72C9D90CE00EFA72E /* KMNoteFilterStateCollevtionViewItem.xib in Resources */,
 				BB10FAF42AFE23BE00F18D65 /* LineInspector.xib in Resources */,
 				BB183DD62B4EAD5400F99C7E /* Ubuntu-Bold.ttf in Resources */,
@@ -18123,6 +18147,7 @@
 				BBAC26A12AFDF54F00563A08 /* KMConvertOperationQueue.swift in Sources */,
 				AD9527EA2955520C0039D2BC /* KMBaseTextFieldModel.swift in Sources */,
 				9FDCD80E2B6C904900E22166 /* KMFormListMenuPopWindowController.swift in Sources */,
+				BB8AA5432CC6711B0084F183 /* KMPDFConfig.swift in Sources */,
 				BB2C845F2BAE70C400AF6142 /* KMLeftSideViewSearchField.swift in Sources */,
 				BB146FEA299DC0D100784A6A /* GTLRDuration.m in Sources */,
 				BBE788AB2CBD2463008086E2 /* CheckBoxVC.swift in Sources */,
@@ -18397,6 +18422,7 @@
 				BBBB6CD22AD14A5F0035AA66 /* CPDFChoiceWidgetAnnotation+PDFListView.swift in Sources */,
 				BB4A94A42B04DA0C00940F8B /* KMGOCRManagerNew.swift in Sources */,
 				9F1FE3DE293EE51F00E952CA /* KMMainDocument.swift in Sources */,
+				BB8AA5382CC65C900084F183 /* KMNLinkMultiController.swift in Sources */,
 				AD85D1A42AF09864000F4D28 /* KMHomeQuickToolsWindowController.swift in Sources */,
 				BBF2455D2AE78FF900037D08 /* KMBatchWindow.swift in Sources */,
 				BBB9B31F299A5D6D004F3235 /* KMGoogleDriveManager.m in Sources */,
@@ -19183,6 +19209,7 @@
 				8942F80429262B2E00389627 /* KMSideViewController.swift in Sources */,
 				BB1D41D42B26D9BD00994EDC /* KMReusable.swift in Sources */,
 				9F0CB51E2986569B00007028 /* KMDesignToken+BorderRadiusBottomRight.swift in Sources */,
+				BB8AA5442CC6711B0084F183 /* KMPDFConfig.swift in Sources */,
 				9FDD0F7D2952F2D8000C4DAD /* KMBaseParser.swift in Sources */,
 				654A5A8D2C8AE200001FBD4B /* KMAnalytics+KMExtensions.swift in Sources */,
 				ADD1B6C82942E83000C3FFF7 /* KMPrintBottomView.swift in Sources */,
@@ -19301,7 +19328,6 @@
 				ADDF833C2B391A5C00A81A4E /* CPDFSignatureWidgetAnnotation+PDFListView.m in Sources */,
 				9FF371CC2C69B8AE005F9CC5 /* KMMeasureSideVC.swift in Sources */,
 				BB10FAEF2AFE233C00F18D65 /* KMLineInspector.swift in Sources */,
-				9FAAA32B290BD01D0046FFCE /* KMHomeHistoryFileViewController.swift in Sources */,
 				F328C0B72CA16F0500BFDD23 /* KMPresentationTopViewController.swift in Sources */,
 				BB2C84802BAE732700AF6142 /* KMBotaLeftView.swift in Sources */,
 				BBFEF72C2B3A791B00C28AC0 /* KMSystemWindowMenu.swift in Sources */,
@@ -19535,6 +19561,7 @@
 				BB2F9AB92AFCC3AD00F9DD93 /* KMProfileInfo.swift in Sources */,
 				BB146FE5299DC0D100784A6A /* GTLRURITemplate.m in Sources */,
 				9F1FE4F129406E4700E952CA /* BackgroundGradientView.m in Sources */,
+				BB8AA5392CC65C900084F183 /* KMNLinkMultiController.swift in Sources */,
 				BBAC26A52AFE134300563A08 /* KMToolbarItemPopViewController.swift in Sources */,
 				9F0CB4BE2977C06300007028 /* KMPropertiesPanelColorSubVC.swift in Sources */,
 				9F94617E2BD643720076574B /* KMTableAnnotation.m in Sources */,
@@ -19719,7 +19746,6 @@
 				BBE788952CBD2463008086E2 /* ProgressVC.swift in Sources */,
 				9F0CB48929683DC400007028 /* KMPropertiesPanelPresetColorSubVC.swift in Sources */,
 				BB99ACC4292DE22E0048AFD9 /* KMMergeViewController.swift in Sources */,
-				9F78EFC828F7E965001E66F4 /* KMHomeViewController+UI.swift in Sources */,
 				9FF371DF2C69B93B005F9CC5 /* CAreaSettingWindowController.swift in Sources */,
 				AD3AAD432B0B7B6C00DE5FE7 /* KMCompareManager.swift in Sources */,
 				9FBA0EFB2900188F001117AF /* KMFastToolCollectionView.swift in Sources */,
@@ -20653,6 +20679,7 @@
 				ADE3C1A129A3894900793B13 /* KMSearchTableRowView.swift in Sources */,
 				BB2C845C2BAE6DC100AF6142 /* KMLeftMethodMode.swift in Sources */,
 				AD1CA41B2A061CE10070541F /* KMAnnotationScreenTypeViewItem.swift in Sources */,
+				BB8AA53A2CC65C900084F183 /* KMNLinkMultiController.swift in Sources */,
 				BB276A4E2B03760000AB5578 /* KMOperationQueue.swift in Sources */,
 				9F94617F2BD643720076574B /* KMTableAnnotation.m in Sources */,
 				AD055E552B73220A0035F824 /* KMBookmarkManager.swift in Sources */,
@@ -20892,6 +20919,7 @@
 				AD7D5CE62B96B394006562CD /* KMBookmarkOutlineSeparatorCellView.swift in Sources */,
 				BB24D4A92977BE6700041659 /* KMRedactConfirmWindowController.swift in Sources */,
 				BBB14A61297929BD00936EDB /* KMRedactPageRangeWindowController.swift in Sources */,
+				BB8AA5452CC6711B0084F183 /* KMPDFConfig.swift in Sources */,
 				ADE86AA62B031FF000414DFA /* KMCompareView.swift in Sources */,
 				BB5DF1F32959C9F00025CDA1 /* KMHeaderFooterPropertyMainController.swift in Sources */,
 				ADC63E4A2A49BEDD00854E02 /* KMSubscribeWaterMarkCollectionItem.swift in Sources */,