Pārlūkot izejas kodu

【2025】【Edit】水印模块完善&组件库补充

niehaoyu 4 mēneši atpakaļ
vecāks
revīzija
5f48e1f5ac
16 mainītis faili ar 461 papildinājumiem un 18 dzēšanām
  1. 12 0
      PDF Office/KMComponentLibrary/KMComponentLibrary/Component.xcassets/Tooltips/menuItem_Select.imageset/Contents.json
  2. 76 0
      PDF Office/KMComponentLibrary/KMComponentLibrary/Component.xcassets/Tooltips/menuItem_Select.imageset/menuItem_Select.pdf
  3. 12 0
      PDF Office/KMComponentLibrary/KMComponentLibrary/Component.xcassets/Tooltips/menuItem_Select_dis.imageset/Contents.json
  4. 77 0
      PDF Office/KMComponentLibrary/KMComponentLibrary/Component.xcassets/Tooltips/menuItem_Select_dis.imageset/menuItem_Select_dis.pdf
  5. 12 1
      PDF Office/KMComponentLibrary/KMComponentLibrary/View/Card/ComponentCardWatermark/ComponentCardWatermark.swift
  6. 5 1
      PDF Office/KMComponentLibrary/KMComponentLibrary/View/MenuItem/ComponentMenuitemProperty.swift
  7. 5 1
      PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/KMWatermarkController.swift
  8. 6 2
      PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/KMNWatermarkPropertyController.swift
  9. 0 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/KMWatermarkSaveWindow/KMWatermarkSaveWindow.swift
  10. 0 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/KMWatermarkSaveWindow/KMWatermarkSaveWindow.xib
  11. 7 5
      PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/Model/KMPDFWatermarkData.swift
  12. 207 3
      PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/Model/KMWatermarkManager.swift
  13. 15 2
      PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/Templates/KMNWatermarkTemplateController.swift
  14. 15 1
      PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/Templates/KMNWatermarkTemplateController.xib
  15. 2 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/Templates/KMNWatermarkTemplateItem.swift
  16. 10 2
      PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

+ 12 - 0
PDF Office/KMComponentLibrary/KMComponentLibrary/Component.xcassets/Tooltips/menuItem_Select.imageset/Contents.json

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

+ 76 - 0
PDF Office/KMComponentLibrary/KMComponentLibrary/Component.xcassets/Tooltips/menuItem_Select.imageset/menuItem_Select.pdf

@@ -0,0 +1,76 @@
+%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 3.203186 cm
+0.254902 0.772549 0.533333 scn
+11.804739 8.601552 m
+12.065088 8.341203 12.065088 7.919092 11.804739 7.658743 c
+4.471405 0.325409 l
+4.211055 0.065060 3.788945 0.065060 3.528596 0.325409 c
+0.195262 3.658743 l
+-0.065087 3.919092 -0.065087 4.341202 0.195262 4.601552 c
+0.455612 4.861901 0.877722 4.861901 1.138071 4.601552 c
+4.000000 1.739623 l
+10.861930 8.601552 l
+11.122279 8.861901 11.544388 8.861901 11.804739 8.601552 c
+h
+f*
+n
+Q
+
+endstream
+endobj
+
+3 0 obj
+  518
+endobj
+
+4 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 16.000000 16.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
+0000000608 00000 n
+0000000630 00000 n
+0000000803 00000 n
+0000000877 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 6 0 R
+   /Size 7
+>>
+startxref
+936
+%%EOF

+ 12 - 0
PDF Office/KMComponentLibrary/KMComponentLibrary/Component.xcassets/Tooltips/menuItem_Select_dis.imageset/Contents.json

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

+ 77 - 0
PDF Office/KMComponentLibrary/KMComponentLibrary/Component.xcassets/Tooltips/menuItem_Select_dis.imageset/menuItem_Select_dis.pdf

@@ -0,0 +1,77 @@
+%PDF-1.7
+
+1 0 obj
+  << /ExtGState << /E1 << /ca 0.250000 >> >> >>
+endobj
+
+2 0 obj
+  << /Length 3 0 R >>
+stream
+/DeviceRGB CS
+/DeviceRGB cs
+q
+/E1 gs
+1.000000 0.000000 -0.000000 1.000000 2.000000 3.203125 cm
+1.000000 1.000000 1.000000 scn
+11.804739 8.601613 m
+12.065088 8.341264 12.065088 7.919153 11.804739 7.658804 c
+4.471405 0.325470 l
+4.211055 0.065121 3.788945 0.065121 3.528596 0.325470 c
+0.195262 3.658804 l
+-0.065087 3.919153 -0.065087 4.341263 0.195262 4.601613 c
+0.455612 4.861962 0.877722 4.861962 1.138071 4.601613 c
+4.000000 1.739684 l
+10.861930 8.601613 l
+11.122279 8.861962 11.544388 8.861962 11.804739 8.601613 c
+h
+f*
+n
+Q
+
+endstream
+endobj
+
+3 0 obj
+  525
+endobj
+
+4 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 16.000000 16.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
+0000000074 00000 n
+0000000655 00000 n
+0000000677 00000 n
+0000000850 00000 n
+0000000924 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 6 0 R
+   /Size 7
+>>
+startxref
+983
+%%EOF

+ 12 - 1
PDF Office/KMComponentLibrary/KMComponentLibrary/View/Card/ComponentCardWatermark/ComponentCardWatermark.swift

@@ -212,13 +212,24 @@ public class ComponentCardWatermark: ComponentBaseXibView {
     public override func mouseMoved(with event: NSEvent) {
         super.mouseMoved(with: event)
         
+        if properties.state != .pressed {
+            if properties.state == .normal {
+                properties.state = .hover
+                
+                refreshUI()
+            }
+        }
+        
     }
     
     public override func mouseExited(with event: NSEvent) {
         super.mouseExited(with: event)
         
         if properties.state != .pressed {
-            properties.state = .normal
+            let point = convert(event.locationInWindow, from: nil)
+             if CGRectContainsPoint(self.contendBox.frame, point) == false {
+                 properties.state = .normal
+             }
         }
         
         refreshUI()

+ 5 - 1
PDF Office/KMComponentLibrary/KMComponentLibrary/View/MenuItem/ComponentMenuitemProperty.swift

@@ -29,6 +29,8 @@ import Cocoa
     public var text: String = ""                    //文字信息
     public var identifier: String = ""
     
+    public var representedObject: Any?
+    
     public var subPropertys: [ComponentMenuitemProperty] = []
     
     public var propertyInfo = MenuitemPropertyInfo()
@@ -57,7 +59,8 @@ import Cocoa
                 righticon: NSImage? = nil,
                 keyEquivalent: String? = nil,
                 text: String = "",
-                identifier: String = "") {
+                identifier: String = "",
+                representedObject: Any? = nil) {
         
         self.type = type
         self.multipleSelect = multipleSelect
@@ -69,6 +72,7 @@ import Cocoa
         self.keyEquivalent = keyEquivalent
         self.text = text
         self.identifier = identifier
+        self.representedObject = representedObject
         
     }
 }

+ 5 - 1
PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/KMWatermarkController.swift

@@ -158,18 +158,22 @@ extension KMWatermarkController: KMNWatermarkPropertyControllerDelegate {
         
         watermarkMode = .Template
         delegate?.kmWatermarkControllerDidUpdateMode?(self)
+        
+        templatesController.reloadData()
     }
     
     func watermarkPropertyControllerCancelTemplateEdit(_ controller: KMNWatermarkPropertyController) {
         watermarkMode = .Template
         
+        templatesController.reloadData()
+
     }
     
 }
 
 extension KMWatermarkController: KMNWatermarkTemplateControllerDelegate {
     func templateControllerDidAddWatermarkData(_ controller: KMNWatermarkTemplateController) {
-        
+        watermarkMode = .AddWatermark
     }
     
     func templateControllerDidEditWatermarkData(_ controller: KMNWatermarkTemplateController, _ watermark: KMPDFWatermarkData) {

+ 6 - 2
PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/KMNWatermarkPropertyController.swift

@@ -410,13 +410,17 @@ class KMNWatermarkPropertyController: NSViewController {
         saveWindow.saveHandler = {[weak self] string in
             guard let weakSelf = self else { return }
             
-            weakSelf.delegate?.watermarkPropertyControllerSaveTemplateSuccess?(weakSelf)
+            weakSelf.watermarkData.watermarkName = string ?? ""
+            
+            if KMWatermarkManager.defaultManager.addWatermark(watermark: weakSelf.watermarkData) == true {
+                 weakSelf.delegate?.watermarkPropertyControllerSaveTemplateSuccess?(weakSelf)
+            }
         }
         saveWindow.own_beginSheetModal(for: view.window) { string in
         
         }
         
-//        KMWatermarkManager.defaultManager.addWatermark(watermark: watermarkData)
+
     }
     
     @objc func chooseURLAction(_ sender: NSView) {

PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/KMWatermarkSaveWindow.swift → PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/KMWatermarkSaveWindow/KMWatermarkSaveWindow.swift


PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/KMWatermarkSaveWindow.xib → PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/KMWatermarkSaveWindow/KMWatermarkSaveWindow.xib


+ 7 - 5
PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/Model/KMPDFWatermarkData.swift

@@ -6,9 +6,7 @@
 //
 
 import Cocoa
-
-
-
+  
 @objcMembers class KMPDFWatermarkData: NSObject {
     
     var watermarkType: CPDFWatermarkType = .text
@@ -44,8 +42,12 @@ import Cocoa
     
     var tag: String = ""
     
+    var watermarkName: String = ""
+    
     var watermark: CPDFWatermark?
     
+    var resultImage: NSImage?
+    
     class func defaultData() -> KMPDFWatermarkData{
         let data = KMPDFWatermarkData()
         data.watermarkType = .text
@@ -97,13 +99,13 @@ import Cocoa
         return [colorA, colorB, colorC, colorD, colorE]
     }
     
-    func image() -> NSImage {
+    func image() -> NSImage? {
         if let imagePath = self.imagePath {
             if let image = NSImage(contentsOfFile: imagePath) {
                 return image
             }
         }
-        return NSImage()
+        return nil
     }
     
     

+ 207 - 3
PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/Model/KMWatermarkManager.swift

@@ -40,7 +40,7 @@ enum KMWatermarkKey: String {
     case lastAddData = "kAddLastWatermarkDataKey1"
     case id = "kWatermarkIDKey"
     case tag = "kWatermarkTagKey"
-      
+    case watermarkName = "watermarkNameKey"
     
 }
 
@@ -63,6 +63,9 @@ class KMWatermarkManager: NSObject {
                 let watermarkDict: NSDictionary = dataDict?.object(forKey: key) as! NSDictionary
                 
                 let model = parseDictionary(dict: watermarkDict)
+                let image = self.drawImageAtpageRect(rect: CGRectMake(0, 0, 136, 181), data: model)
+                model.resultImage = image
+                
                 self.watermarks.append(model)
             }
             self.watermarks.sort(){$0.tag > $1.tag}
@@ -296,6 +299,206 @@ class KMWatermarkManager: NSObject {
         return result
     }
     
+    func drawImageAtpageRect(rect: NSRect, data: KMPDFWatermarkData) -> NSImage? {
+        var size = NSZeroSize
+        let text: String = data.text ?? ""
+        if data.watermarkType == .image {
+            if let image = data.image() {
+                size = image.size
+                size.width *= data.scale
+                size.height *= data.scale
+            }
+        } else if data.watermarkType == .text {
+            var font = NSFont.systemFont(ofSize: 52)
+            if data.isTilePage {
+                font = NSFont.systemFont(ofSize: data.fontSize)
+            }
+            let style = NSMutableParagraphStyle()
+            style.alignment = .center
+            style.lineBreakMode = .byCharWrapping
+            let attributes: [NSAttributedString.Key: Any] = [ .paragraphStyle: style, .font: font ]
+            size = text.boundingRect(with: CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude), options: [.usesLineFragmentOrigin, .usesFontLeading], attributes: attributes).size
+        }
+        
+        let radian = data.rotation * (CGFloat.pi/180)
+        let t = CGAffineTransform(rotationAngle: radian)
+        var newRect = rect
+        if !data.isTilePage {
+            newRect = CGRect(x: 0, y: 0, width: size.width + 40, height: size.height + 40).applying(t)
+        }
+        let image = NSImage(size: newRect.size)
+        image.lockFocus()
+        NSGraphicsContext.current?.imageInterpolation = .high
+        NSGraphicsContext.saveGraphicsState()
+        NSColor.clear.set()
+        rect.fill()
+        NSGraphicsContext.restoreGraphicsState()
+        guard let context = NSGraphicsContext.current?.cgContext else { return nil }
+        let imageSize = newRect.size
+        NSGraphicsContext.current = NSGraphicsContext(cgContext: context, flipped: false)
+        NSGraphicsContext.saveGraphicsState()
+        
+        if data.watermarkType == .image {
+            guard let image = data.image() else { return nil }
+            var size = image.size
+            size.width *= data.scale
+            size.height *= data.scale
+            let width = sqrt(image.size.height * image.size.height + image.size.width * image.size.width)
+            let newRect = CGRect(x: -(width - image.size.width)/2, y: -(width - image.size.height)/2, width: width, height: width)
+            let new_w = newRect.size.width
+            let new_h = newRect.size.height
+            let radian = data.rotation * (CGFloat.pi / 180)
+            let t = CGAffineTransform(rotationAngle: radian)
+            if data.isTilePage {
+                context.translateBy(x: image.size.width/2, y: image.size.height/2)
+                context.concatenate(t)
+                context.translateBy(x: -(image.size.width/2), y: -(image.size.height/2))
+                
+                let verticalWidth = size.width + data.horizontalSpacing * data.scale
+                let horizontalHeight = size.height + data.verticalSpacing * data.scale
+                let line: Int = Int((new_h - data.verticalSpacing * data.scale)/horizontalHeight + 1)
+                let row: Int = Int((new_w - data.horizontalSpacing * data.scale) / verticalWidth + 1)
+                let point = CGPoint(x: image.size.width/2 - size.width/2 + data.tx*data.scale, y:image.size.height/2 - size.height/2 + data.ty * data.scale)
+                for i in 0..<line/2+1 {
+                    for j in 0..<row {
+                        let area = CGRect(x: point.x + CGFloat(j) * verticalWidth, y: point.y + CGFloat(i) * horizontalHeight, width: size.width, height: size.height)
+                        image.draw(in: area, from: NSZeroRect, operation: .sourceOver, fraction: data.opacity)
+                    }
+                }
+                for i in 1..<line/2+1 {
+                    for j in 0..<row {
+                        let area = CGRect(x: point.x + CGFloat(j) * verticalWidth, y: point.y - CGFloat(i) * horizontalHeight, width: size.width, height: size.height)
+                        image.draw(in: area, from: NSZeroRect, operation: .sourceOver, fraction: data.opacity)
+                    }
+                }
+                for i in 0..<line/2+1 {
+                    for j in 1..<row {
+                        let area = CGRect(x: point.x - CGFloat(j) * verticalWidth, y: point.y + CGFloat(i) * horizontalHeight, width: size.width, height: size.height)
+                        image.draw(in: area, from: NSZeroRect, operation: .sourceOver, fraction: data.opacity)
+                    }
+                }
+                for i in 1..<(line/2 + 1) {
+                    for j in 1..<row {
+                        let area = CGRect(x: point.x - CGFloat(j)*verticalWidth, y: point.y - CGFloat(i)*horizontalHeight, width: size.width, height: size.height)
+                        image.draw(in: area, from: NSZeroRect, operation: .sourceOver, fraction: data.opacity)
+                    }
+                }
+            } else {
+                var size = image.size
+                size.width *= data.scale
+                size.height *= data.scale
+                let radian = data.rotation * (CGFloat.pi / 180)
+                let t = CGAffineTransform(rotationAngle: radian)
+                var imageRect = CGRect(origin: .zero, size: size).applying(t)
+                if data.verticalPosition == .bottom {
+                    imageRect.origin.y = imageSize.height - imageRect.size.height
+                } else if data.verticalPosition == .center {
+                    imageRect.origin.y = (imageSize.height - imageRect.size.height) / 2.0
+                } else {
+                    imageRect.origin.y = 0
+                }
+                if data.horizontalPosition == .left {
+                    imageRect.origin.x = 0
+                } else if data.horizontalPosition == .center {
+                    imageRect.origin.x = (imageSize.width - imageRect.size.width) / 2.0
+                } else {
+                    imageRect.origin.x = imageSize.width - imageRect.size.width
+                }
+                let contextCenter = CGPoint(x: imageRect.midX, y: imageRect.midY)
+                context.translateBy(x: contextCenter.x, y: contextCenter.y)
+                context.rotate(by: radian)
+                context.translateBy(x: -contextCenter.x, y: -contextCenter.y)
+                image.draw(in: CGRect(x: imageRect.origin.x+(imageRect.size.width-size.width)/2.0, y: imageRect.origin.y+(imageRect.size.height-size.height)/2.0, width: size.width, height: size.height), from: NSZeroRect, operation: .sourceOver, fraction: data.opacity)
+            }
+        }else if text.count > 0 {
+            var font = NSFont.systemFont(ofSize: 52)
+            if data.isTilePage {
+                font = NSFont.systemFont(ofSize: data.fontSize)
+            }
+            var color = data.textColor
+            var red: CGFloat = 0, green: CGFloat = 0, blue: CGFloat = 0
+            color.usingColorSpaceName(.calibratedRGB)?.getRed(&red, green: &green, blue: &blue, alpha: nil)
+            color = NSColor.init(calibratedRed: red, green: green, blue: blue, alpha: data.opacity)
+            
+            size = .zero
+            
+            let alpha = data.opacity
+            let tileHorizontalSpace = data.horizontalSpacing
+            let tileVerticalSpace = data.verticalSpacing
+            let horizontalSpace = data.tx
+            let verticalSpace = data.ty
+            let style = NSMutableParagraphStyle()
+            style.alignment = .center
+            style.lineBreakMode = .byCharWrapping
+            let attributes: [NSAttributedString.Key: Any] = [ .paragraphStyle: style, .foregroundColor: NSColor(calibratedRed: red, green: green, blue: blue, alpha: alpha), .font: font ]
+            size = text.boundingRect(with: CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude), options: [.usesLineFragmentOrigin, .usesFontLeading], attributes: attributes).size
+            let textRect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
+            if data.isTilePage {
+                let width = sqrt(image.size.height * image.size.height + image.size.width * image.size.width)
+                let newRect = CGRect(x: -(width - image.size.width) / 2, y: -(width - image.size.height) / 2, width: width, height: width)
+                let new_w = newRect.size.width
+                let new_h = newRect.size.height
+                context.translateBy(x: image.size.width / 2, y: image.size.height / 2)
+                context.concatenate(CGAffineTransform(rotationAngle: radian))
+                context.translateBy(x: -(image.size.width / 2), y: -(image.size.height / 2))
+                let verticalWidth = size.width + tileHorizontalSpace / 3.0
+                let horizontalHeight = size.height + tileVerticalSpace / 3.0
+                let line: Int = Int((new_h - tileHorizontalSpace / 3.0) / horizontalHeight + 1)
+                let row: Int = Int((new_w - tileVerticalSpace / 3.0) / verticalWidth + 1)
+                let point = CGPoint(x: image.size.width / 2 - size.width / 2 + horizontalSpace / 3.0, y: image.size.height / 2 - size.height / 2 + verticalSpace / 3.0)
+                for i in 0..<line {
+                    for j in 0..<row {
+                        let drawRect = CGRect(x: point.x + CGFloat(j) * verticalWidth, y: point.y + CGFloat(i) * horizontalHeight, width: size.width, height: size.height)
+                        text.draw(in: drawRect, withAttributes: attributes)
+                    }
+                }
+                for i in 1..<line {
+                    for j in 0..<row {
+                        let drawRect = CGRect(x: point.x + CGFloat(j) * verticalWidth, y: point.y - CGFloat(i) * horizontalHeight, width: size.width, height: size.height)
+                        text.draw(in: drawRect, withAttributes: attributes)
+                    }
+                }
+                for i in 0..<line {
+                    for j in 1..<row {
+                        let drawRect = CGRect(x: point.x - CGFloat(j) * verticalWidth, y: point.y + CGFloat(i) * horizontalHeight, width: size.width, height: size.height)
+                        text.draw(in: drawRect, withAttributes: attributes)
+                    }
+                }
+                for i in 1..<line {
+                    for j in 1..<row {
+                        let drawRect = CGRect(x: point.x - CGFloat(j) * verticalWidth, y: point.y - CGFloat(i) * horizontalHeight, width: size.width, height: size.height)
+                        text.draw(in: drawRect, withAttributes: attributes)
+                    }
+                }
+            } else {
+                var textRect = textRect
+                if data.verticalPosition == .bottom {
+                    textRect.origin.y = imageSize.height - textRect.size.height
+                } else if data.verticalPosition == .center {
+                    textRect.origin.y = (imageSize.height - textRect.size.height) / 2.0
+                } else {
+                    textRect.origin.y = 0
+                }
+                if data.horizontalPosition == .left {
+                    textRect.origin.x = 0
+                } else if data.horizontalPosition == .center {
+                    textRect.origin.x = (imageSize.width - textRect.size.width) / 2.0
+                } else {
+                    textRect.origin.x = imageSize.width - textRect.size.width
+                }
+                let contextCenter = CGPoint(x: textRect.midX, y: textRect.midY)
+                context.translateBy(x: contextCenter.x, y: contextCenter.y)
+                context.rotate(by: radian)
+                context.translateBy(x: -contextCenter.x, y: -contextCenter.y)
+                (data.text ?? "").draw(in: CGRect(x: textRect.origin.x + (textRect.size.width - size.width) / 2.0, y: textRect.origin.y + (textRect.size.height - size.height) / 2.0, width: size.width, height: size.height), withAttributes: attributes)
+            }
+        }
+        NSGraphicsContext.restoreGraphicsState()
+        NSGraphicsContext.current?.imageInterpolation = .default
+        image.unlockFocus()
+        return image
+    }
+    
     //MARK: - private
     private func parseWaterMark(model: KMPDFWatermarkData) -> Dictionary<String, Any> {
         
@@ -334,6 +537,7 @@ class KMWatermarkManager: NSObject {
         dict[KMWatermarkKey.pageRangeType.rawValue] = model.pageRangeType.rawValue
         dict[KMWatermarkKey.pageRangeString.rawValue] = model.pageRangeString
         dict[KMWatermarkKey.tag.rawValue] = model.tag
+        dict[KMWatermarkKey.watermarkName.rawValue] = model.watermarkName
         
         return dict
     }
@@ -354,8 +558,7 @@ class KMWatermarkManager: NSObject {
                 model.imagePath = path ?? ""
             }
         }
-        
-        
+         
         model.isScale = (dict.object(forKey: KMWatermarkKey.isScale.rawValue) as? Bool) ?? false
         model.scale = (dict.object(forKey: KMWatermarkKey.scale.rawValue) as? CGFloat) ?? 1
         model.rotation = dict.object(forKey: KMWatermarkKey.rotate.rawValue) as? CGFloat ?? 0
@@ -379,6 +582,7 @@ class KMWatermarkManager: NSObject {
         model.horizontalSpacing = (dict.object(forKey: KMWatermarkKey.tileHorizontalSpace.rawValue) as? CGFloat) ?? 0
         model.verticalSpacing = (dict.object(forKey: KMWatermarkKey.tileVerticalSpace.rawValue) as? CGFloat) ?? 0
         model.tag = (dict.object(forKey: KMWatermarkKey.tag.rawValue) as? String) ?? ""
+        model.watermarkName = (dict.object(forKey: KMWatermarkKey.watermarkName.rawValue) as? String) ?? ""
         
         return model
     }

+ 15 - 2
PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/Templates/KMNWatermarkTemplateController.swift

@@ -22,6 +22,7 @@ class KMNWatermarkTemplateController: NSViewController {
     @IBOutlet var titleLabel: NSTextField!
     @IBOutlet var addButton: ComponentButton!
     
+    @IBOutlet var emptyView: ComponentEmpty!
     
     @IBOutlet var scrollView: NSScrollView!
     @IBOutlet var collectionView: NSCollectionView!
@@ -33,6 +34,8 @@ class KMNWatermarkTemplateController: NSViewController {
         // Do view setup here.
         
         configUI()
+     
+        setupProperty()
         
         reloadData()
     }
@@ -42,6 +45,7 @@ class KMNWatermarkTemplateController: NSViewController {
         addButton.properties = ComponentButtonProperty(type: .text_gray, size: .xxs, onlyIcon: true, icon: NSImage(named: "watermark_template_add"), keepPressState: false)
         addButton.setTarget(self, action: #selector(buttonClicked(_:)))
         
+        emptyView.properties = ComponentEmptyProperty(emptyType: .noWatermark, text: KMLocalizedString("No Template"), subText: KMLocalizedString("Here is the description."))
     }
       
     func configUI() {
@@ -62,7 +66,16 @@ class KMNWatermarkTemplateController: NSViewController {
     //刷新所有数据
     public func reloadData() {
          
-        collectionView.reloadData()
+        if KMWatermarkManager.defaultManager.watermarks.count == 0 {
+            collectionView.isHidden = true
+            emptyView.isHidden = false
+            
+        } else {
+            emptyView.isHidden = true
+            
+            collectionView.isHidden = false
+            collectionView.reloadData()
+        }
         
     }
     
@@ -138,7 +151,7 @@ extension KMNWatermarkTemplateController: kmNWatermarkTemplateItemDelegate {
             
             alert.beginSheetModal(for: NSApp.mainWindow!) { (response) in
                 if response == .alertFirstButtonReturn {
-                    KMWatermarkManager.defaultManager.removeWatermark(watermark: watermark)
+                    let _ = KMWatermarkManager.defaultManager.removeWatermark(watermark: watermark)
                     
                     self.reloadData()
                 }

+ 15 - 1
PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/Templates/KMNWatermarkTemplateController.xib

@@ -11,6 +11,7 @@
                 <outlet property="addButton" destination="hsJ-js-mMa" id="AWd-9f-mNi"/>
                 <outlet property="collectionView" destination="hJc-Et-79J" id="Pra-6L-sb8"/>
                 <outlet property="contendView" destination="jGd-4K-rX2" id="gxt-OZ-oKG"/>
+                <outlet property="emptyView" destination="guc-lb-Hqx" id="oG0-Hk-Psg"/>
                 <outlet property="scrollView" destination="Qjb-H8-5lF" id="yV7-te-Yc3"/>
                 <outlet property="titleLabel" destination="eD9-Wi-qDA" id="YIx-pA-QDh"/>
                 <outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
@@ -63,10 +64,23 @@
                         </customView>
                         <customView translatesAutoresizingMaskIntoConstraints="NO" id="fLx-Sd-Y5U">
                             <rect key="frame" x="0.0" y="0.0" width="322" height="376"/>
+                            <subviews>
+                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="guc-lb-Hqx" customClass="ComponentEmpty" customModule="KMComponentLibrary">
+                                    <rect key="frame" x="45" y="96" width="232" height="184"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="232" id="TXM-6o-0hS"/>
+                                        <constraint firstAttribute="height" constant="184" id="cIU-pg-e6k"/>
+                                    </constraints>
+                                </customView>
+                            </subviews>
+                            <constraints>
+                                <constraint firstItem="guc-lb-Hqx" firstAttribute="centerX" secondItem="fLx-Sd-Y5U" secondAttribute="centerX" id="89h-Ix-Ej6"/>
+                                <constraint firstItem="guc-lb-Hqx" firstAttribute="centerY" secondItem="fLx-Sd-Y5U" secondAttribute="centerY" id="Mfl-AO-P8O"/>
+                            </constraints>
                         </customView>
                         <scrollView wantsLayer="YES" borderType="none" autohidesScrollers="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Qjb-H8-5lF">
                             <rect key="frame" x="0.0" y="0.0" width="322" height="376"/>
-                            <clipView key="contentView" id="0gA-3w-lgm">
+                            <clipView key="contentView" drawsBackground="NO" id="0gA-3w-lgm">
                                 <rect key="frame" x="0.0" y="0.0" width="322" height="376"/>
                                 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                                 <subviews>

+ 2 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/Templates/KMNWatermarkTemplateItem.swift

@@ -48,7 +48,9 @@ class KMNWatermarkTemplateItem: NSCollectionViewItem {
     }
     
     func reloadData() {
+        watermarkItem.properties.icon = watermark?.resultImage
         watermarkItem.properties.state = isSelected ? .pressed : .normal
+        watermarkItem.properties.text = watermark?.watermarkName
         watermarkItem.reloadData()
         
     }

+ 10 - 2
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -11868,6 +11868,15 @@
 			path = Designs;
 			sourceTree = "<group>";
 		};
+		BB0F58552CDAF3F300B4D353 /* KMWatermarkSaveWindow */ = {
+			isa = PBXGroup;
+			children = (
+				BBD14F5D2CDA16080077D52E /* KMWatermarkSaveWindow.swift */,
+				BBD14F5E2CDA16080077D52E /* KMWatermarkSaveWindow.xib */,
+			);
+			path = KMWatermarkSaveWindow;
+			sourceTree = "<group>";
+		};
 		BB0FE01F2B734DD1001E0F88 /* AIInfo */ = {
 			isa = PBXGroup;
 			children = (
@@ -14629,9 +14638,8 @@
 				BBDF18142CD4853C00ACDB15 /* KMNWatermarkPropertyController.xib */,
 				BBD14F552CDA02570077D52E /* KMWatermarkToolbarView.swift */,
 				BBD14F592CDA02640077D52E /* KMWatermarkToolbarView.xib */,
-				BBD14F5D2CDA16080077D52E /* KMWatermarkSaveWindow.swift */,
-				BBD14F5E2CDA16080077D52E /* KMWatermarkSaveWindow.xib */,
 				BB955EC22CD8ECE20042FDE1 /* Templates */,
+				BB0F58552CDAF3F300B4D353 /* KMWatermarkSaveWindow */,
 			);
 			path = Views;
 			sourceTree = "<group>";