Browse Source

【OCToSwift】KMPDFSignatureImageView

lizhe 1 year ago
parent
commit
5793a766c5

+ 8 - 10
PDF Office/PDF Master.xcodeproj/project.pbxproj

@@ -22,9 +22,6 @@
 		89316843296E436B0073EA59 /* KMDrawView.m in Sources */ = {isa = PBXBuildFile; fileRef = 89316831296E436B0073EA59 /* KMDrawView.m */; };
 		89316844296E436B0073EA59 /* KMDrawView.m in Sources */ = {isa = PBXBuildFile; fileRef = 89316831296E436B0073EA59 /* KMDrawView.m */; };
 		89316845296E436B0073EA59 /* KMDrawView.m in Sources */ = {isa = PBXBuildFile; fileRef = 89316831296E436B0073EA59 /* KMDrawView.m */; };
-		89316846296E436B0073EA59 /* KMPDFSignatureImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 89316832296E436B0073EA59 /* KMPDFSignatureImageView.m */; };
-		89316847296E436B0073EA59 /* KMPDFSignatureImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 89316832296E436B0073EA59 /* KMPDFSignatureImageView.m */; };
-		89316848296E436B0073EA59 /* KMPDFSignatureImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 89316832296E436B0073EA59 /* KMPDFSignatureImageView.m */; };
 		8931684C296E436B0073EA59 /* KMSignatureWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 89316836296E436B0073EA59 /* KMSignatureWindowController.xib */; };
 		8931684D296E436B0073EA59 /* KMSignatureWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 89316836296E436B0073EA59 /* KMSignatureWindowController.xib */; };
 		8931684E296E436B0073EA59 /* KMSignatureWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 89316836296E436B0073EA59 /* KMSignatureWindowController.xib */; };
@@ -1858,6 +1855,9 @@
 		ADDEEA622AD3A6E700EF675D /* KMPDFSignatureTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADDEEA612AD3A6E700EF675D /* KMPDFSignatureTextView.swift */; };
 		ADDEEA632AD3A6E700EF675D /* KMPDFSignatureTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADDEEA612AD3A6E700EF675D /* KMPDFSignatureTextView.swift */; };
 		ADDEEA642AD3A6E700EF675D /* KMPDFSignatureTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADDEEA612AD3A6E700EF675D /* KMPDFSignatureTextView.swift */; };
+		ADDEEA662AD3C4BE00EF675D /* KMPDFSignatureImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADDEEA652AD3C4BE00EF675D /* KMPDFSignatureImageView.swift */; };
+		ADDEEA672AD3C4BE00EF675D /* KMPDFSignatureImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADDEEA652AD3C4BE00EF675D /* KMPDFSignatureImageView.swift */; };
+		ADDEEA682AD3C4BF00EF675D /* KMPDFSignatureImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADDEEA652AD3C4BE00EF675D /* KMPDFSignatureImageView.swift */; };
 		ADE3C19F29A3894900793B13 /* KMSearchTableRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE3C19E29A3894900793B13 /* KMSearchTableRowView.swift */; };
 		ADE3C1A029A3894900793B13 /* KMSearchTableRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE3C19E29A3894900793B13 /* KMSearchTableRowView.swift */; };
 		ADE3C1A129A3894900793B13 /* KMSearchTableRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE3C19E29A3894900793B13 /* KMSearchTableRowView.swift */; };
@@ -3517,10 +3517,8 @@
 		89316828296E436A0073EA59 /* NSImage+CustomImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSImage+CustomImage.m"; sourceTree = "<group>"; };
 		89316829296E436A0073EA59 /* KMSignatureWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KMSignatureWindowController.m; sourceTree = "<group>"; };
 		8931682B296E436A0073EA59 /* NSImage+CustomImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSImage+CustomImage.h"; sourceTree = "<group>"; };
-		8931682D296E436A0073EA59 /* KMPDFSignatureImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMPDFSignatureImageView.h; sourceTree = "<group>"; };
 		8931682F296E436B0073EA59 /* KMSignatureWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMSignatureWindowController.h; sourceTree = "<group>"; };
 		89316831296E436B0073EA59 /* KMDrawView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KMDrawView.m; sourceTree = "<group>"; };
-		89316832296E436B0073EA59 /* KMPDFSignatureImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KMPDFSignatureImageView.m; sourceTree = "<group>"; };
 		89316833296E436B0073EA59 /* KMDrawView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMDrawView.h; sourceTree = "<group>"; };
 		89316836296E436B0073EA59 /* KMSignatureWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMSignatureWindowController.xib; sourceTree = "<group>"; };
 		8931684F296E45CA0073EA59 /* KMImageAccessoryController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMImageAccessoryController.h; sourceTree = "<group>"; };
@@ -4216,6 +4214,7 @@
 		ADDEEA592AD399BB00EF675D /* KMSignature.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMSignature.swift; sourceTree = "<group>"; };
 		ADDEEA5D2AD39DC500EF675D /* KMSignatureManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMSignatureManager.swift; sourceTree = "<group>"; };
 		ADDEEA612AD3A6E700EF675D /* KMPDFSignatureTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPDFSignatureTextView.swift; sourceTree = "<group>"; };
+		ADDEEA652AD3C4BE00EF675D /* KMPDFSignatureImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPDFSignatureImageView.swift; sourceTree = "<group>"; };
 		ADE3C19E29A3894900793B13 /* KMSearchTableRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMSearchTableRowView.swift; sourceTree = "<group>"; };
 		ADE3C1A929A4779E00793B13 /* KMPrintAccessoryController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPrintAccessoryController.swift; sourceTree = "<group>"; };
 		ADE3C1AA29A4779E00793B13 /* KMPrintAccessoryController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMPrintAccessoryController.xib; sourceTree = "<group>"; };
@@ -5042,8 +5041,7 @@
 				BB7F7BF629AA469F00A3E4E7 /* KMSigntureViewItem.xib */,
 				89316833296E436B0073EA59 /* KMDrawView.h */,
 				89316831296E436B0073EA59 /* KMDrawView.m */,
-				8931682D296E436A0073EA59 /* KMPDFSignatureImageView.h */,
-				89316832296E436B0073EA59 /* KMPDFSignatureImageView.m */,
+				ADDEEA652AD3C4BE00EF675D /* KMPDFSignatureImageView.swift */,
 				ADDEEA612AD3A6E700EF675D /* KMPDFSignatureTextView.swift */,
 				ADDEEA592AD399BB00EF675D /* KMSignature.swift */,
 				ADDEEA5D2AD39DC500EF675D /* KMSignatureManager.swift */,
@@ -10712,6 +10710,7 @@
 				ADC63E3F2A49816900854E02 /* KMSubscribeSuccessView.swift in Sources */,
 				9F0CB531298656EA00007028 /* KMDesignToken+BorderWidthBottom.swift in Sources */,
 				BB8115FF2992682F0008F536 /* KMSecureLimitAlertView.swift in Sources */,
+				ADDEEA662AD3C4BE00EF675D /* KMPDFSignatureImageView.swift in Sources */,
 				BBB14A5B2978EBBE00936EDB /* KMRedactMutilPageFlagContentView.swift in Sources */,
 				9F72D2032994A3B800DCACF1 /* KMDesignToken+Notification.swift in Sources */,
 				AD2D74AD29F0CEB300EDC5E4 /* KMCancellationWindowController.swift in Sources */,
@@ -10876,7 +10875,6 @@
 				9F1F82B4292DEF370092C4B4 /* KMCloudDocumentsViewController.swift in Sources */,
 				ADE8BC2529F7CCA600570F89 /* KMPageNumberDisplayView.swift in Sources */,
 				BB4DD047299B294000E80DF6 /* KMCloudFileEmptyView.swift in Sources */,
-				89316846296E436B0073EA59 /* KMPDFSignatureImageView.m in Sources */,
 				ADD272D029B9CFD30032B5D6 /* KMLightNoNetworkView.swift in Sources */,
 				9F1F82CA292F6CF90092C4B4 /* KMPDFInsertPageWindow.swift in Sources */,
 				9FBA0EE128FEC253001117AF /* KMProductPromotionViewController.swift in Sources */,
@@ -11680,7 +11678,6 @@
 				ADE8BC2629F7CCA600570F89 /* KMPageNumberDisplayView.swift in Sources */,
 				BB4DD048299B294000E80DF6 /* KMCloudFileEmptyView.swift in Sources */,
 				ADD272D129B9CFD30032B5D6 /* KMLightNoNetworkView.swift in Sources */,
-				89316847296E436B0073EA59 /* KMPDFSignatureImageView.m in Sources */,
 				BB49ECF7293F44DC00C82CA2 /* KMConvertExcelWindowController.swift in Sources */,
 				9F1FE4EB29406E4700E952CA /* NSBezierPath+MCAdditions.m in Sources */,
 				BBFE6E762930E53000142C01 /* KMMergePopoverViewController.swift in Sources */,
@@ -11946,6 +11943,7 @@
 				F34BF94A295310AB002C25A2 /* NSUserDefaults+PDFListView.m in Sources */,
 				ADE8BC3F29F9458700570F89 /* KMRecommondInfo.m in Sources */,
 				89752DA02936EC50003FF08E /* KMToolbar.m in Sources */,
+				ADDEEA672AD3C4BE00EF675D /* KMPDFSignatureImageView.swift in Sources */,
 				BB146FE5299DC0D100784A6A /* GTLRURITemplate.m in Sources */,
 				9F1FE4F129406E4700E952CA /* BackgroundGradientView.m in Sources */,
 				89E4E6E42963CD82002DBA6F /* KMGeneralAnnotationViewController.m in Sources */,
@@ -12308,6 +12306,7 @@
 				BB3A81AE2AC2A4E4006FC66C /* NSTextView+KMExtension.swift in Sources */,
 				9F0CB4DF2986554D00007028 /* KMDesignToken+HorizontalPadding.swift in Sources */,
 				AD44D654292C9E7900A94554 /* KMImageToPDFChooseView.swift in Sources */,
+				ADDEEA682AD3C4BF00EF675D /* KMPDFSignatureImageView.swift in Sources */,
 				BBB9B318299A5D6D004F3235 /* KMDropboxManager.m in Sources */,
 				BB74DA7D2AC41DE9006EDFE7 /* NSString+KMExtension.swift in Sources */,
 				9FCFEC6A2AC2EAD500EAD2CB /* CPDFListViewColorMenuItemView.swift in Sources */,
@@ -12560,7 +12559,6 @@
 				BBC745EC295F067B0072C2ED /* KMCropSettingWindowController.swift in Sources */,
 				ADE8BC2729F7CCA600570F89 /* KMPageNumberDisplayView.swift in Sources */,
 				ADB5E50E2A3703E6007110A8 /* KMInAppPurchaseManager.swift in Sources */,
-				89316848296E436B0073EA59 /* KMPDFSignatureImageView.m in Sources */,
 				ADD1B6C92942E83000C3FFF7 /* KMPrintBottomView.swift in Sources */,
 				ADD1B7042946C8AD00C3FFF7 /* KMBaseTextField.swift in Sources */,
 				9FD0FA2B29CD3ED400F2AB0D /* KMRightSideEmptyVC.swift in Sources */,

+ 0 - 25
PDF Office/PDF Master/Class/PDFWindowController/Side/RightSide/Signature/KMPDFSignatureImageView.h

@@ -1,25 +0,0 @@
-//
-//  KMPDFSignatureImageView.h
-//  PDF Reader
-//
-//  Created by 丁林圭 on 2018/6/8.
-//  Copyright © 2018年 Kdan Mobile. All rights reserved.
-//
-
-#import <Cocoa/Cocoa.h>
-
-@interface KMPDFSignatureImageView : NSView
-
-@property (nonatomic, assign) BOOL clearBackground;
-
-@property (nonatomic, weak, readonly) NSTextField *emptyTipLbl;
-
-- (void)clearImage;
-
-- (void)reSelectImage;
-
-- (NSImage *)signatureImage;
-
-@property (nonatomic,copy) void (^changeSignatureImageCallback) (BOOL isTure);
-
-@end

+ 0 - 415
PDF Office/PDF Master/Class/PDFWindowController/Side/RightSide/Signature/KMPDFSignatureImageView.m

@@ -1,415 +0,0 @@
-//
-//  KMPDFSignatureImageView.m
-//  PDF Reader
-//
-//  Created by 丁林圭 on 2018/6/8.
-//  Copyright © 2018年 Kdan Mobile. All rights reserved.
-//
-
-#import "KMPDFSignatureImageView.h"
-#import <Quartz/Quartz.h>
-#import "KMImageAccessoryController.h"
-#import <PDF_Master-Swift.h>
-
-#define KMSignatureMaxWidth 400
-#define KMSignatureMaxHeight 300
-
-@interface KMPDFSignatureImageView()
-
-@property (nonatomic, retain) NSImage * picImage;
-@property (nonatomic) IBOutlet NSView *pictureView;
-@property (nonatomic) IBOutlet NSTextField *emptyTipLbl;
-@property (nonatomic) IBOutlet NSButton *dragButton;
-@property (nonatomic) IBOutlet NSImageView *emptyImg;
-
-@property (nonatomic, copy) NSTrackingArea *trackingArea;
-
-@property (nonatomic, strong) NSURL *imageURL;
-
-@end
-
-
-@implementation KMPDFSignatureImageView
-
-- (void)dealloc {
-
-    [self removeTrackingArea:self.trackingArea];
-}
-
-- (id)initWithFrame:(NSRect)frameRect
-{
-    if (self = [super initWithFrame:frameRect])
-    {
-        self.wantsLayer = YES;
-        self.layer.borderWidth = 1.0;
-        self.layer.borderColor = [NSColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.05].CGColor;
-        self.layer.backgroundColor = [NSColor colorWithRed:1 green:1 blue:1 alpha:0.9].CGColor;;
-        
-        [self registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]];
-        
-    }
-    return self;
-}
-
-- (void)awakeFromNib
-{
-    [super awakeFromNib];
-    
-    self.emptyTipLbl.stringValue = NSLocalizedString(@"Select image file", nil);
-    self.emptyTipLbl.textColor = [NSColor labelColor];
-    self.dragButton.wantsLayer = YES;
-    [self.dragButton setTitleColorWithColor:[NSColor labelColor] font:nil];
-    
-    self.pictureView.wantsLayer = YES;
-    self.emptyImg.image = [NSImage imageNamed:@"signPicture_nor"];
-    
-    self.trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds]
-                                                 options:NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingActiveAlways
-                                                   owner:self
-                                                userInfo:nil];
-    [self addTrackingArea:self.trackingArea];
-}
-
-- (NSArray *)supportedImageTypes
-{
-    return [NSArray arrayWithObjects:@"jpg",@"cur",@"bmp",@"jpeg",@"gif",@"png",@"tiff",@"tif",@"ico",@"icns",@"tga",@"psd",@"eps",@"hdr",@"jp2",@"jpc",@"pict",@"sgi",@"pdf", nil];
-}
-
-- (void)drawRect:(NSRect)dirtyRect
-{
-    [super drawRect:dirtyRect];
-    if (self.pictureView) {
-        
-        CGRect rect = NSZeroRect;
-        CIImage *imageCIImage = [CIImage imageWithData:self.picImage.TIFFRepresentation];
-        NSSize size = [imageCIImage extent].size;
-        
-        CGFloat scale = MIN((dirtyRect.size.width - 30)/size.width, (dirtyRect.size.height - 30)/size.height);
-        if (scale > 1) {
-            rect = CGRectMake(0, 0, size.width, size.height);
-        } else {
-            rect = CGRectMake(0, 0, size.width * scale, size.height *scale);
-        }
-        [self.picImage drawInRect:CGRectMake((dirtyRect.size.width - rect.size.width)/2,
-                                             (dirtyRect.size.height - rect.size.height)/2,
-                                             rect.size.width,rect.size.height)
-                         fromRect:NSZeroRect
-                        operation:NSCompositingOperationSourceOver
-                         fraction:1.0];
-    }
-}
-
-- (void)setClearBackground:(BOOL)clearBackground {
-    _clearBackground = clearBackground;
-    
-    if (self.imageURL && self.imageURL.path.length > 0) {
-        [self loadImageViewPath:self.imageURL isRemoveBGColor:self.clearBackground];
-    }
-}
-
-#pragma mark Public
-- (void)clearImage
-{
-    self.picImage = nil;
-    self.imageURL = nil;
-    self.pictureView.hidden = self.emptyTipLbl.hidden = NO;
-    [self setNeedsDisplay:YES];
-    
-    if (self.changeSignatureImageCallback) {
-        self.changeSignatureImageCallback(YES);
-    }
-}
-
-- (void)reSelectImage {
-    [self buttonItemClick_SelectPhoto:nil];
-}
-
-- (NSImage *)signatureImage
-{
-    CGRect rect = CGRectZero;
-    
-    if (!self.picImage) {
-        return nil;
-    } else {
-        CIImage *imageCIImage = [CIImage imageWithData:self.picImage.TIFFRepresentation];
-        NSSize size = [imageCIImage extent].size;
-        CGFloat scale = MIN(KMSignatureMaxWidth/size.width, KMSignatureMaxHeight/size.height);
-        if (scale > 1) {
-            rect = CGRectMake(0, 0, size.width, size.height);
-        } else {
-            rect = CGRectMake(0, 0, size.width * scale, size.height *scale);
-        }
-    }
-    
-    NSImage *image = [[NSImage alloc] initWithSize:rect.size];
-    [image lockFocus];
-    [self.picImage drawInRect:rect
-             fromRect:NSZeroRect
-                    operation:NSCompositingOperationSourceOver
-             fraction:1.0];
-
-    [image unlockFocus];
-    return image;
-}
-
-- (void)loadImageViewPath:(NSURL *)url isRemoveBGColor:(BOOL)isRemove
-{
-    self.imageURL = url;
-    
-    NSString * filePath = url.path;
-
-    if ([filePath.pathExtension.lowercaseString isEqualToString:@"pdf"]) {
-        PDFDocument *pdf = [[PDFDocument alloc] initWithURL:url];
-        if (pdf.isEncrypted) {
-            return;
-        }
-    }
-    NSImage *image = [[NSImage alloc] initWithContentsOfFile:filePath];
-    
-    if (isRemove) {
-        NSData *imageData = [image TIFFRepresentation];
-        CGImageRef imageRef;
-        if (imageData) {
-            CGImageSourceRef imageSource = CGImageSourceCreateWithData((CFDataRef)imageData, NULL);
-            imageRef = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL);
-        }
-        
-        const int imageWidth = image.size.width;
-        const int imageHeight = image.size.height;
-        size_t bytesPerRow = imageWidth * 4;
-        uint32_t* rgbImageBuf = (uint32_t*)malloc(bytesPerRow * imageHeight);
-        
-        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
-        CGContextRef context = CGBitmapContextCreate(rgbImageBuf,
-                                                     imageWidth,
-                                                     imageHeight,
-                                                     8,
-                                                     bytesPerRow,
-                                                     colorSpace,
-                                                     kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast);
-        CGContextDrawImage(context, CGRectMake(0, 0, imageWidth, imageHeight), imageRef);
-        
-        int pixelNum = imageWidth * imageHeight;
-        uint32_t* pCurPtr = rgbImageBuf;
-        for (int i = 0; i < pixelNum; i++, pCurPtr++) {
-            uint8_t* ptr = (uint8_t*)pCurPtr;
-            if (ptr[1] > 240 && ptr[2] > 240 && ptr[3] > 240) {
-                ptr[0] = 0;
-            }
-        }
-        
-        CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, rgbImageBuf, bytesPerRow * imageHeight, nil);
-        imageRef = CGImageCreate(imageWidth,
-                                 imageHeight,
-                                 8,
-                                 32,
-                                 bytesPerRow,
-                                 colorSpace,
-                                 kCGImageAlphaLast |kCGBitmapByteOrder32Little,
-                                 dataProvider,
-                                 NULL,
-                                 true,
-                                 kCGRenderingIntentDefault);
-        CGDataProviderRelease(dataProvider);
-        
-        NSImage *newImage = nil;
-        if (imageRef) {
-            NSRect imageRect = NSMakeRect(0.0, 0.0, 0.0, 0.0);
-            CGContextRef imageContext = nil;
-            
-            // Get the image dimensions.
-            imageRect.size.height = CGImageGetHeight(imageRef);
-            imageRect.size.width = CGImageGetWidth(imageRef);
-            
-            // Create a new image to receive the Quartz image data.
-            newImage = [[NSImage alloc] initWithSize:imageRect.size];
-            [newImage lockFocus];
-            
-            // Get the Quartz context and draw.
-            imageContext = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
-            CGContextDrawImage(imageContext, *(CGRect*)&imageRect, imageRef);
-            [newImage unlockFocus];
-            CGImageRelease(imageRef);
-        }
-        
-        if (newImage) {
-            image = newImage;
-        }
-    }
-    
-    if (image) {
-        self.picImage = image;
-        self.pictureView.hidden = self.emptyTipLbl.hidden = YES;
-        [self setNeedsDisplay:YES];
-    }
-}
-
-- (CAGradientLayer *)setGradualChanging {
-
-    CAGradientLayer *gradientLayer = [CAGradientLayer layer];
-    gradientLayer.frame = _dragButton.bounds;
-    gradientLayer.colors = @[(__bridge id)[NSColor lightGrayColor].CGColor,(__bridge id)[NSColor whiteColor].CGColor];
-    gradientLayer.startPoint = CGPointMake(0, 0);
-    gradientLayer.endPoint = CGPointMake(1, 1);
-    gradientLayer.locations = @[@0,@1];
-    return gradientLayer;
-}
-
-- (BOOL)isDamageImage:(NSImage *)image imagePath:(NSString *)path {
-    NSString *addImageAnnotation = [[[NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:[NSBundle mainBundle].bundleIdentifier] stringByAppendingPathComponent:@"addImageAnnotation"];
-    if (![[NSFileManager defaultManager] fileExistsAtPath:addImageAnnotation]) {
-        [[NSFileManager defaultManager] createDirectoryAtPath:addImageAnnotation withIntermediateDirectories:NO attributes:nil error:nil];
-    }
-    NSData *data = [image TIFFRepresentation];
-    NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:data];
-    [imageRep setSize:[image size]];
-    NSData *imageData  = nil;
-    if ([path.lowercaseString isEqualToString:@"png"]) {
-        imageData = [imageRep representationUsingType:NSBitmapImageFileTypePNG properties:@{}];
-    } else {
-        imageData = [imageRep representationUsingType:NSJPEGFileType properties:@{}];
-    }
-    
-    NSString *rPath = [addImageAnnotation stringByAppendingPathComponent:[[self tagString] stringByAppendingPathExtension:@"png"]];
-    if (![imageData writeToFile:rPath atomically:YES]) {
-        return YES;
-    } else {
-        return NO;
-    }
-}
-
-- (NSString *)tagString {
-    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
-    dateFormatter.dateFormat    = @"yyMMddHHmmss";
-    return [NSString stringWithFormat:@"%@%04d", [dateFormatter stringFromDate:[NSDate date]], rand()%10000];
-}
-
-
-#pragma mark - Button Action
-- (IBAction)buttonItemClick_SelectPhoto:(id)sender
-{
-    NSOpenPanel *openPanel = [NSOpenPanel openPanel];
-    
-    [openPanel setAllowedFileTypes:[self supportedImageTypes]];
-    [openPanel setAllowedFileTypes:[KMImageAccessoryController supportedImageTypes]];
-    if ([openPanel respondsToSelector:@selector(setAccessoryViewDisclosed:)]) {
-        [openPanel setAccessoryViewDisclosed:YES];
-    }
-    [openPanel setAllowsMultipleSelection:NO];
-    [openPanel beginSheetModalForWindow:[self window] completionHandler:^(NSInteger result) {
-        if (result == NSModalResponseOK) {
-        
-            NSURL *url = [openPanel URL];
-            
-            //判断PDF文件是否已损坏
-            NSString * filePath = url.path;
-            if ([filePath.pathExtension.lowercaseString isEqualToString:@"pdf"]) {
-                PDFDocument *pdf = [[PDFDocument alloc] initWithURL:url];
-                if (!pdf) {
-                    NSAlert *alert = [[NSAlert alloc] init];
-                    [alert setAlertStyle:NSAlertStyleCritical];
-                    [alert setMessageText:[NSString stringWithFormat:@"%@",NSLocalizedString(@"An error occurred while opening this document. The file is damaged and could not be repaired.", nil)]];
-                    [alert runModal];
-                    return;
-                }
-            }
-            
-            NSImage *image = [[NSImage alloc] initWithContentsOfFile:url.path];
-            if ([self isDamageImage:image imagePath:url.path]) {
-                NSAlert *alert = [[NSAlert alloc] init];
-                [alert setAlertStyle:NSAlertStyleCritical];
-                [alert setMessageText: [NSString stringWithFormat:NSLocalizedString(@"The file \"%@\" could not be opened.", nil), url.path.lastPathComponent]];
-                [alert setInformativeText:NSLocalizedString(@"It may be damaged or use a file format that PDF Reader Pro doesn’t recognize.", nil)];
-                [alert addButtonWithTitle:NSLocalizedString(@"Cancel", nil)];
-                [alert beginSheetModalForWindow:[NSApp mainWindow] completionHandler:^(NSModalResponse returnCode) {
-                        if (returnCode == NSAlertFirstButtonReturn) {
-
-                        }
-                }];
-
-                return;
-            }
-            
-            [self loadImageViewPath:url isRemoveBGColor:self.clearBackground];
-            if (self.changeSignatureImageCallback) {
-                self.changeSignatureImageCallback(YES);
-            }
-        }
-    }];
-}
-
-- (void)mouseEntered:(NSEvent *)event {
-    [super mouseEntered:event];
-    self.emptyImg.image = [NSImage imageNamed:@"signPicture_hover"];
-}
-
-- (void)mouseMoved:(NSEvent *)event {
-    [super mouseMoved:event];
-    
-    CGPoint point = [event locationInWindow];
-    CGPoint convertPoint = [self.pictureView convertPoint:point fromView:self.window.contentView];
-    
-    if (CGRectContainsPoint(self.pictureView.bounds, convertPoint)) {
-        self.emptyImg.image = [NSImage imageNamed:@"signPicture_hover"];
-    } else {
-        self.emptyImg.image = [NSImage imageNamed:@"signPicture_nor"];
-    }
-}
-
-- (void)mouseExited:(NSEvent *)event {
-    [super mouseExited:event];
-
-    self.emptyImg.image = [NSImage imageNamed:@"signPicture_nor"];
-}
-
-#pragma mark - Drag
-- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender
-{
-    NSPasteboard *pboard = [sender draggingPasteboard];
-    if ([pboard availableTypeFromArray:[NSArray arrayWithObject:NSFilenamesPboardType]]) {
-        NSArray *fileNames = [pboard propertyListForType:NSFilenamesPboardType];
-        if (fileNames.count == 1) {
-            NSArray *supportArray= [self supportedImageTypes];
-            NSString* path  = fileNames.firstObject;
-            if ([supportArray containsObject:[path.pathExtension lowercaseString]]) {
-                return NSDragOperationEvery;
-            }
-        }
-    }
-    return NSDragOperationNone;
-}
-
-- (BOOL)prepareForDragOperation:(id<NSDraggingInfo>)sender
-{
-    NSPasteboard *pboard = [sender draggingPasteboard];
-    if ([pboard availableTypeFromArray:[NSArray arrayWithObject:NSFilenamesPboardType]]) {
-        NSMutableArray *fileNames = [pboard propertyListForType:NSFilenamesPboardType];
-        
-        if (fileNames.count == 1) {
-            NSArray *supportArray= [self supportedImageTypes];
-            NSString* path  = fileNames.firstObject;
-            
-            //判断PDF文件是否已损坏
-            NSString * filePath = path;
-            if ([filePath.pathExtension.lowercaseString isEqualToString:@"pdf"]) {
-                PDFDocument *pdf = [[PDFDocument alloc] initWithURL:[NSURL fileURLWithPath:path]];
-                if (!pdf) {
-                    NSAlert *alert = [[NSAlert alloc] init];
-                    [alert setAlertStyle:NSAlertStyleCritical];
-                    [alert setMessageText:[NSString stringWithFormat:@"%@",NSLocalizedString(@"An error occurred while opening this document. The file is damaged and could not be repaired.", nil)]];
-                    [alert runModal];
-                    return NO;
-                }
-            }
-            if ([supportArray containsObject:[path.pathExtension lowercaseString]]) {
-                [self loadImageViewPath:[NSURL fileURLWithPath:path] isRemoveBGColor:self.clearBackground];
-                if (self.changeSignatureImageCallback) {
-                    self.changeSignatureImageCallback(YES);
-                }
-            }
-        }
-    }
-    return YES;
-}
-
-@end

+ 347 - 0
PDF Office/PDF Master/Class/PDFWindowController/Side/RightSide/Signature/KMPDFSignatureImageView.swift

@@ -0,0 +1,347 @@
+//
+//  KMPDFSignatureImageView.swift
+//  PDF Master
+//
+//  Created by lizhe on 2023/10/9.
+//
+
+import Cocoa
+import Quartz
+
+let KMSignatureMaxWidth = 400.0
+let KMSignatureMaxHeight = 300.0
+
+@objcMembers class KMPDFSignatureImageView: NSView {
+
+    var picImage: NSImage?
+    @IBOutlet var pictureView: NSView!
+    @IBOutlet var emptyTipLbl: NSTextField!
+    @IBOutlet var dragButton: NSButton!
+    @IBOutlet var emptyImg: NSImageView!
+
+    var clearBackground: Bool = false {
+        didSet {
+            if let imageURL = imageURL, imageURL.path.count > 0 {
+                loadImageViewPath(imageURL, isRemoveBGColor: clearBackground)
+            }
+        }
+    }
+    
+    var trackingArea: NSTrackingArea?
+
+    var imageURL: URL?
+    
+    var changeSignatureImageCallback: ((Bool) -> Void)?
+
+    required init?(coder: NSCoder) {
+        super.init(coder: coder)
+        wantsLayer = true
+        layer?.borderWidth = 1.0
+        layer?.borderColor = NSColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.05).cgColor
+        layer?.backgroundColor = NSColor(red: 1, green: 1, blue: 1, alpha: 0.9).cgColor
+        registerForDraggedTypes([.fileURL])
+    }
+
+    override func awakeFromNib() {
+        super.awakeFromNib()
+        emptyTipLbl.stringValue = NSLocalizedString("Select image file", comment: "")
+        emptyTipLbl.textColor = .labelColor
+        dragButton.wantsLayer = true
+        dragButton.setTitleColor(color: .labelColor, font: nil)
+        pictureView.wantsLayer = true
+        emptyImg.image = NSImage(named: "signPicture_nor")
+
+        trackingArea = NSTrackingArea(rect: bounds, options: [.mouseEnteredAndExited, .mouseMoved, .activeAlways], owner: self, userInfo: nil)
+        if let trackingArea = trackingArea {
+            addTrackingArea(trackingArea)
+        }
+    }
+
+    func supportedImageTypes() -> [String] {
+        return ["jpg", "cur", "bmp", "jpeg", "gif", "png", "tiff", "tif", "ico", "icns", "tga", "psd", "eps", "hdr", "jp2", "jpc", "pict", "sgi", "pdf"]
+    }
+
+    override func draw(_ dirtyRect: NSRect) {
+        super.draw(dirtyRect)
+        if let picImage = picImage {
+            var rect = NSZeroRect
+            if let imageCIImage = CIImage(data: picImage.tiffRepresentation!) {
+                let size = imageCIImage.extent.size
+                let scale = min((dirtyRect.size.width - 30) / size.width, (dirtyRect.size.height - 30) / size.height)
+                if scale > 1 {
+                    rect = NSRect(x: 0, y: 0, width: size.width, height: size.height)
+                } else {
+                    rect = NSRect(x: 0, y: 0, width: size.width * scale, height: size.height * scale)
+                }
+                picImage.draw(in: NSRect(x: (dirtyRect.size.width - rect.size.width) / 2, y: (dirtyRect.size.height - rect.size.height) / 2, width: rect.size.width, height: rect.size.height), from: NSZeroRect, operation: .sourceOver, fraction: 1.0)
+            }
+        }
+    }
+
+    func clearImage() {
+        picImage = nil
+        imageURL = nil
+        pictureView.isHidden = false
+        emptyTipLbl.isHidden = false
+        needsDisplay = true
+    }
+
+    func reSelectImage() {
+        buttonItemClick_SelectPhoto(nil)
+    }
+
+    func signatureImage() -> NSImage? {
+        var rect = CGRect.zero
+        
+        guard let picImage = self.picImage else {
+            return nil
+        }
+        
+        let imageCIImage = CIImage(data: picImage.tiffRepresentation!)
+        let size = imageCIImage?.extent.size ?? CGSize.zero
+        
+        let scale = min(KMSignatureMaxWidth / size.width, KMSignatureMaxHeight / size.height)
+        
+        if scale > 1 {
+            rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
+        } else {
+            rect = CGRect(x: 0, y: 0, width: size.width * scale, height: size.height * scale)
+        }
+        
+        let image = NSImage(size: rect.size)
+        image.lockFocus()
+        picImage.draw(in: rect, from: NSZeroRect, operation: .sourceOver, fraction: 1.0)
+        image.unlockFocus()
+        
+        return image
+    }
+
+    func loadImageViewPath(_ url: URL, isRemoveBGColor: Bool) {
+        self.imageURL = url
+        let filePath: NSString = url.path as NSString
+        
+        if filePath.pathExtension.lowercased() == "pdf" {
+            if let pdf = PDFDocument(url: url), pdf.isEncrypted {
+                return
+            }
+        }
+        
+        if let image = NSImage(contentsOfFile: filePath as String) {
+            if isRemoveBGColor {
+                if let imageData = image.tiffRepresentation {
+                    if let imageSource = CGImageSourceCreateWithData(imageData as CFData, nil),
+                       let imageRef = CGImageSourceCreateImageAtIndex(imageSource, 0, nil) {
+                        
+                        let imageWidth = image.size.width
+                        let imageHeight = image.size.height
+                        let bytesPerRow = Int(imageWidth) * 4
+                        var rgbImageBuf = [UInt32](repeating: 0, count: Int(bytesPerRow) * Int(imageHeight))
+                        
+                        let colorSpace = CGColorSpaceCreateDeviceRGB()
+                        let imageRect = CGRect(x: 0.0, y: 0.0, width: imageWidth, height: imageHeight)
+                        
+                        if let context = CGContext(data: &rgbImageBuf,
+                                                   width: Int(imageWidth),
+                                                   height: Int(imageHeight),
+                                                   bitsPerComponent: 8,
+                                                   bytesPerRow: bytesPerRow,
+                                                   space: colorSpace,
+                                                   bitmapInfo: CGImageAlphaInfo.noneSkipLast.rawValue),
+                           let dataProvider = CGDataProvider(dataInfo: nil,
+                                                             data: &rgbImageBuf,
+                                                             size: Int(bytesPerRow) * Int(imageHeight),
+                                                             releaseData: { (info, data, size) in
+                                                                 data.deallocate()
+                                                             }),
+                           let newImageRef = CGImage(width: Int(imageWidth),
+                                                     height: Int(imageHeight),
+                                                     bitsPerComponent: 8,
+                                                     bitsPerPixel: 32,
+                                                     bytesPerRow: bytesPerRow,
+                                                     space: colorSpace,
+                                                     bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.last.rawValue),
+                                                     provider: dataProvider,
+                                                     decode: nil,
+                                                     shouldInterpolate: true,
+                                                     intent: .defaultIntent) {
+                            
+                            let newImage = NSImage(size: CGSize(width: imageWidth, height: imageHeight))
+                            newImage.lockFocus()
+                            
+                            let imageContext = NSGraphicsContext(cgContext: context, flipped: false)
+                            NSGraphicsContext.current = imageContext
+                            context.draw(imageRef, in: imageRect)
+                            newImage.unlockFocus()
+                            self.picImage = newImage
+                            self.pictureView.isHidden = true
+                            self.emptyTipLbl.isHidden = true
+                            self.setNeedsDisplay(NSRect.zero)
+                            
+                        }
+                    }
+                }
+            } else {
+                self.picImage = image
+                self.pictureView.isHidden = true
+                self.emptyTipLbl.isHidden = true
+                self.setNeedsDisplay(NSRect.zero)
+            }
+        }
+    }
+
+
+    func setGradualChanging() -> CAGradientLayer {
+        let gradientLayer = CAGradientLayer()
+        gradientLayer.frame = dragButton.bounds
+        gradientLayer.colors = [NSColor.lightGray.cgColor, NSColor.white.cgColor]
+        gradientLayer.startPoint = CGPoint(x: 0, y: 0)
+        gradientLayer.endPoint = CGPoint(x: 1, y: 1)
+        gradientLayer.locations = [0, 1]
+        return gradientLayer
+    }
+
+    func isDamageImage(_ image: NSImage, imagePath: String) -> Bool {
+        let addImageAnnotation = ((try? FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true))?.appendingPathComponent(Bundle.main.bundleIdentifier ?? ""))?.appendingPathComponent("addImageAnnotation")
+
+        if let addImageAnnotation = addImageAnnotation, !FileManager.default.fileExists(atPath: addImageAnnotation.path) {
+            try? FileManager.default.createDirectory(atPath: addImageAnnotation.path, withIntermediateDirectories: false, attributes: nil)
+        }
+
+        if let imageData = image.tiffRepresentation, let imageRep = NSBitmapImageRep(data: imageData) {
+            imageRep.size = image.size
+            var imageData: Data?
+
+            if imagePath.lowercased() == "png" {
+                imageData = imageRep.representation(using: .png, properties: [:])
+            } else {
+                imageData = imageRep.representation(using: .jpeg, properties: [:])
+            }
+
+            if let imageData = imageData, let tagString = tagString() {
+                let rPath = (addImageAnnotation?.appendingPathComponent(tagString))?.appendingPathExtension("png")
+                if !FileManager.default.createFile(atPath: rPath?.path ?? "", contents: imageData, attributes: nil) {
+                    return true
+                } else {
+                    return false
+                }
+            }
+        }
+
+        return false
+    }
+
+    func tagString() -> String? {
+        let dateFormatter = DateFormatter()
+        dateFormatter.dateFormat = "yyMMddHHmmss"
+        return String(format: "%@%04d", dateFormatter.string(from: Date()), Int(arc4random_uniform(10000)))
+    }
+
+    @IBAction func buttonItemClick_SelectPhoto(_ sender: Any?) {
+        let openPanel = NSOpenPanel()
+        openPanel.allowedFileTypes = supportedImageTypes()
+        if let accessoryView = openPanel.accessoryView as? NSButton {
+            accessoryView.state = UserDefaults.standard.bool(forKey: "AnnotationSelectPhoto") ? .on : .off
+        }
+
+        openPanel.allowsMultipleSelection = false
+        openPanel.beginSheetModal(for: window ?? NSApp.mainWindow!) { [weak self] (result) in
+            if result == .OK, let url = openPanel.url {
+                // Check if the PDF file is damaged
+                let filePath: NSString = url.path as NSString
+                if filePath.pathExtension.lowercased() == "pdf" {
+                    if let pdf = PDFDocument(url: url), !pdf.isEncrypted {
+                        self?.loadImageViewPath(url, isRemoveBGColor: self?.clearBackground ?? false)
+                        self?.changeSignatureImageCallback?(true)
+                        return
+                    } else {
+                        let alert = NSAlert()
+                        alert.alertStyle = .critical
+                        alert.messageText = NSLocalizedString("An error occurred while opening this document. The file is damaged and could not be repaired.", comment: "")
+                        alert.runModal()
+                        return
+                    }
+                }
+
+                if let image = NSImage(contentsOfFile: url.path), self?.isDamageImage(image, imagePath: url.path) == true {
+                    let alert = NSAlert()
+                    alert.alertStyle = .critical
+                    alert.messageText = String(format: NSLocalizedString("The file \"%@\" could not be opened.", comment: ""), url.path.lastPathComponent)
+                    alert.informativeText = NSLocalizedString("It may be damaged or use a file format that PDF Reader Pro doesn’t recognize.", comment: "")
+                    alert.addButton(withTitle: NSLocalizedString("Cancel", comment: ""))
+                    alert.beginSheetModal(for: NSApp.mainWindow ?? NSApp.keyWindow!) { (returnCode) in
+                        if returnCode == .alertFirstButtonReturn {
+
+                        }
+                    }
+                    return
+                }
+
+                self?.loadImageViewPath(url, isRemoveBGColor: self?.clearBackground ?? false)
+                self?.changeSignatureImageCallback?(true)
+            }
+        }
+    }
+
+    override func mouseEntered(with event: NSEvent) {
+        super.mouseEntered(with: event)
+        emptyImg.image = NSImage(named: "signPicture_hover")
+    }
+
+    override func mouseMoved(with event: NSEvent) {
+        super.mouseMoved(with: event)
+
+        if let windowContentView = window?.contentView, let convertPoint = pictureView?.convert(event.locationInWindow, from: windowContentView) {
+            if pictureView.bounds.contains(convertPoint) {
+                emptyImg.image = NSImage(named: "signPicture_hover")
+            } else {
+                emptyImg.image = NSImage(named: "signPicture_nor")
+            }
+        }
+    }
+
+    override func mouseExited(with event: NSEvent) {
+        super.mouseExited(with: event)
+        emptyImg.image = NSImage(named: "signPicture_nor")
+    }
+
+    override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation {
+        let pboard = sender.draggingPasteboard
+        if pboard.availableType(from: [.fileURL]) != nil {
+            if let fileNames = pboard.propertyList(forType: .fileURL) as? [String], fileNames.count == 1 {
+                if let path: NSString = fileNames.first as NSString?, supportedImageTypes().contains(path.pathExtension.lowercased()) {
+                    return .every
+                }
+            }
+        }
+        return []
+    }
+
+    override func prepareForDragOperation(_ sender: NSDraggingInfo) -> Bool {
+        let pboard = sender.draggingPasteboard
+        if pboard.availableType(from: [.fileURL]) != nil {
+            if let fileNames = pboard.propertyList(forType: .fileURL) as? [String], fileNames.count == 1 {
+                if let path: NSString = fileNames.first as NSString?, supportedImageTypes().contains(path.pathExtension.lowercased()) {
+                    loadImageViewPath(URL(fileURLWithPath: path as String), isRemoveBGColor: clearBackground)
+                    changeSignatureImageCallback?(true)
+                    return true
+                }
+            }
+        }
+        return false
+    }
+}
+
+private extension NSImage {
+    func resized(to size: NSSize) -> NSImage {
+        let image = NSImage(size: size)
+        image.lockFocus()
+
+        let ctx = NSGraphicsContext.current?.cgContext
+        ctx?.interpolationQuality = .high
+
+        draw(in: NSRect(origin: .zero, size: size), from: NSRect(origin: .zero, size: self.size), operation: .sourceOver, fraction: 1.0)
+
+        image.unlockFocus()
+        return image
+    }
+}

+ 0 - 1
PDF Office/PDF Master/Class/PDFWindowController/Side/RightSide/Signature/KMSignatureWindowController.m

@@ -9,7 +9,6 @@
 #import "KMSignatureWindowController.h"
 #import "KMDrawView.h"
 #import "NSImage+CustomImage.h"
-#import "KMPDFSignatureImageView.h"
 #import "KMPopUpButton.h"
 #import "CPDFListView.h"
 #import <PDF_Master-Swift.h>

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

@@ -65,3 +65,4 @@
 #import <Sparkle/Sparkle.h>
 #import "KMTableRowView.h"
 #import "KMPDFEditAppendCustomView.h"
+#import "KMImageAccessoryController.h"

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

@@ -44,3 +44,4 @@
 #import "CPDFListView+Extension.h"
 #import "KMTableRowView.h"
 #import "KMPDFEditAppendCustomView.h"
+#import "KMImageAccessoryController.h"

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

@@ -69,3 +69,4 @@
 #import "KMTableRowView.h"
 #import "NSGraphics+PDFListView.h"
 #import "KMPDFEditAppendCustomView.h"
+#import "KMImageAccessoryController.h"