KMWatermarkModel.swift 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. //
  2. // KMWatermarkModel.swift
  3. // PDF Master
  4. //
  5. // Created by tangchao on 2022/12/19.
  6. //
  7. import Cocoa
  8. @objcMembers class KMWatermarkModel: KMWatermarkAdjectiveBaseModel {
  9. var text: String = ""
  10. var image: NSImage!
  11. var imagePath: String!
  12. var textAligement: NSTextAlignment = .left
  13. var textFontSize: CGFloat = 48
  14. var waterTextColor: NSColor = NSColor.black
  15. var rotation: CGFloat = 0.0
  16. var opacity: CGFloat = 1.0
  17. var scale: CGFloat = 1.0
  18. /**
  19. (Top:0 Middle:1 Bottom:2)
  20. */
  21. var verticalMode: Int = 1
  22. var verticalSpace: CGFloat = 0.0
  23. /**
  24. (Left:0 Middle:1 Right:2)
  25. */
  26. var horizontalMode: Int = 1
  27. var horizontalSpace: CGFloat = 0.0
  28. var tileHorizontalSpace: CGFloat = 60
  29. var tileVerticalSpace: CGFloat = 60
  30. var pagesString: String!
  31. var isFront: Bool = true
  32. var isTilePage: Bool = false
  33. var tag: String!
  34. var creatTemplateDate: String!
  35. var watermark: CPDFWatermark!
  36. var watermarkID: String!
  37. override func copy() -> Any {
  38. let model = KMWatermarkModel()
  39. model.text = self.text
  40. model.image = self.image
  41. model.imagePath = self.imagePath
  42. model.textColor = self.textColor
  43. model.textFont = self.textFont
  44. model.rotation = self.rotation
  45. model.opacity = self.opacity
  46. model.scale = self.scale
  47. model.verticalMode = self.verticalMode
  48. model.verticalSpace = self.verticalSpace
  49. model.horizontalMode = self.horizontalMode
  50. model.horizontalSpace = self.horizontalSpace
  51. model.tileHorizontalSpace = self.tileHorizontalSpace
  52. model.tileVerticalSpace = self.tileVerticalSpace
  53. model.pagesString = self.pagesString
  54. model.isFront = self.isFront
  55. model.isTilePage = self.isTilePage
  56. model.tag = self.tag
  57. model.pageRangeType = self.pageRangeType
  58. model.creatTemplateDate = self.creatTemplateDate
  59. model.watermark = self.watermark
  60. model.watermarkID = self.watermarkID
  61. return model
  62. }
  63. func updateData(document: CPDFDocument) {
  64. if (self.watermark == nil) {
  65. var scale: CGFloat = self.scale
  66. if (!self.text.isEmpty) {
  67. self.watermark = CPDFWatermark(document: document, type: .text)
  68. self.watermark.text = self.text
  69. self.watermark.textColor = self.getTextColor()
  70. scale = self.getTextFont().pointSize / 24.0
  71. } else {
  72. self.watermark = CPDFWatermark(document: document, type: .image)
  73. self.watermark.image = self.image
  74. }
  75. } else {
  76. if (!self.text.isEmpty) {
  77. self.watermark.text = self.text
  78. self.watermark.textColor = self.getTextColor()
  79. scale = self.getTextFont().pointSize / 24.0
  80. } else {
  81. self.watermark.image = self.image
  82. }
  83. }
  84. self.watermark.scale = scale
  85. self.watermark.rotation = -self.rotation
  86. self.watermark.opacity = self.opacity
  87. self.watermark.tx = self.horizontalSpace
  88. self.watermark.ty = self.verticalSpace
  89. self.watermark.isFront = self.isFront
  90. self.watermark.pageString = self.pagesString
  91. self.watermark.isTilePage = self.isTilePage
  92. self.watermark.horizontalSpacing = self.tileHorizontalSpace / scale
  93. self.watermark.verticalSpacing = self.tileVerticalSpace / scale
  94. if (self.verticalMode == 0) {
  95. self.watermark.verticalPosition = .top
  96. } else if (self.verticalMode == 1) {
  97. self.watermark.verticalPosition = .center
  98. } else if (self.verticalMode == 2) {
  99. self.watermark.verticalPosition = .bottom
  100. }
  101. if (self.horizontalMode == 0) {
  102. self.watermark.horizontalPosition = .left
  103. } else if (self.horizontalMode == 1) {
  104. self.watermark.horizontalPosition = .center
  105. } else if (self.horizontalMode == 2) {
  106. self.watermark.horizontalPosition = .right
  107. }
  108. }
  109. func drawImage(rect: CGRect) -> NSImage {
  110. var size: NSSize = NSZeroSize
  111. var drawRect: CGRect = NSMakeRect(0, 0, 128, 160)
  112. if (!self.text.isEmpty) {
  113. var font = NSFont.systemFont(ofSize: 48)
  114. if (self.isTilePage) {
  115. font = self.getTextFont()
  116. }
  117. var style = NSMutableParagraphStyle()
  118. style.alignment = self.textAligement
  119. style.lineBreakMode = .byCharWrapping
  120. let dictionary = [NSAttributedString.Key.paragraphStyle : style, NSAttributedString.Key.font : font]
  121. size = self.text.boundingRect(with: NSSize(width: 1000, height: 1000), options: NSString.DrawingOptions(rawValue: 3), attributes: dictionary).size
  122. } else if (self.image != nil) {
  123. size = self.image.size
  124. size.width = size.width * self.scale
  125. size.height = size.height * self.scale
  126. }
  127. let radian = self.rotation * (Double.pi/180.0)
  128. let t: CGAffineTransform = CGAffineTransform(rotationAngle: radian)
  129. if (!self.isTilePage) {
  130. drawRect = NSMakeRect(0, 0, size.width+40, size.height+40).applying(t);
  131. }
  132. let image = NSImage(size: drawRect.size)
  133. image.lockFocus()
  134. NSGraphicsContext.current?.imageInterpolation = .high
  135. NSGraphicsContext.saveGraphicsState()
  136. NSColor.clear.set()
  137. drawRect.fill()
  138. NSGraphicsContext.restoreGraphicsState()
  139. let context: CGContext = NSGraphicsContext.current!.cgContext
  140. let imageSize: NSSize = NSMakeSize(drawRect.size.width, drawRect.size.height)
  141. if (context != nil) {
  142. NSGraphicsContext.current = NSGraphicsContext(cgContext: context, flipped: false)
  143. }
  144. NSGraphicsContext.saveGraphicsState()
  145. if (!self.text.isEmpty) {
  146. var font = NSFont.systemFont(ofSize: 48)
  147. if (self.isTilePage) {
  148. font = self.getTextFont()
  149. }
  150. var color = NSColor.black
  151. if (self.textColor != nil) {
  152. color = self.getTextColor()
  153. }
  154. var red: CGFloat = 0
  155. var green: CGFloat = 0
  156. var blue: CGFloat = 0
  157. color.usingColorSpaceName(NSColorSpaceName.calibratedRGB)?.getRed(&red, green: &green, blue: &blue, alpha: nil)
  158. color = NSColor(calibratedRed: red, green: green, blue: blue, alpha: 1.0)
  159. var size = NSZeroSize
  160. let style = NSMutableParagraphStyle()
  161. style.alignment = self.textAligement
  162. style.lineBreakMode = .byCharWrapping
  163. let dictionary = [NSAttributedString.Key.paragraphStyle : style, NSAttributedString.Key.foregroundColor : color, NSAttributedString.Key.font : font]
  164. size = self.text.boundingRect(with: NSSize(width: 1000, height: 1000), options: NSString.DrawingOptions(rawValue: 3), attributes: dictionary).size
  165. let radian: CGFloat = self.rotation * (Double.pi / 180.0)
  166. let t: CGAffineTransform = CGAffineTransform(rotationAngle: radian)
  167. var textRect = NSMakeRect(0, 0, size.width, size.height).applying(t)
  168. if (self.isTilePage) {
  169. let width = sqrt(image.size.height * image.size.height + image.size.width * image.size.width)
  170. let newRect = NSMakeRect(-(width - image.size.width)/2, -(width - image.size.height)/2, width, width)
  171. let new_w = NSWidth(newRect)
  172. let new_h = NSHeight(newRect)
  173. context.translateBy(x: image.size.width/2,y: image.size.height/2);
  174. context.concatenate(t);
  175. context.translateBy(x: -(image.size.width/2), y: -(image.size.height/2));
  176. let verticalWidth: CGFloat = size.width + self.tileHorizontalSpace/3.0
  177. let horizontalHeight: CGFloat = size.height + self.tileVerticalSpace/3.0
  178. let line: Int = Int(((new_h - self.tileHorizontalSpace/3.0)/horizontalHeight) + 1)
  179. let row: Int = Int((new_w - self.tileVerticalSpace/3.0) / verticalWidth + 1)
  180. let point = NSPoint(x: image.size.width/2 - size.width/2+self.horizontalSpace/3.0, y: image.size.height/2 - size.height/2+self.verticalSpace/3.0)
  181. for i in 0 ..< line {
  182. for j in 0 ..< row {
  183. self.text.draw(in: NSRect(x: point.x+CGFloat(j)*verticalWidth, y: point.y+CGFloat(i)*horizontalHeight, width: size.width, height: size.height), withAttributes: dictionary)
  184. }
  185. }
  186. for i in 1 ..< line {
  187. for j in 0 ..< row {
  188. self.text.draw(in: NSRect(x: point.x+CGFloat(j)*verticalWidth, y: point.y-CGFloat(i)*horizontalHeight, width: size.width, height: size.height), withAttributes: dictionary)
  189. }
  190. }
  191. for i in 0 ..< line {
  192. for j in 1 ..< row {
  193. self.text.draw(in: NSRect(x: point.x-CGFloat(j)*verticalWidth, y: point.y+CGFloat(i)*horizontalHeight, width: size.width, height: size.height), withAttributes: dictionary)
  194. }
  195. }
  196. for i in 1 ..< line {
  197. for j in 1 ..< row {
  198. self.text.draw(in: NSRect(x: point.x-CGFloat(j)*verticalWidth, y: point.y-CGFloat(i)*horizontalHeight, width: size.width, height: size.height), withAttributes: dictionary)
  199. }
  200. }
  201. } else {
  202. if (self.verticalMode == 0) {
  203. textRect.origin.y = imageSize.height-textRect.size.height
  204. } else if (self.verticalMode == 1) {
  205. textRect.origin.y = (imageSize.height-textRect.size.height) * 0.5
  206. } else {
  207. textRect.origin.y = 0
  208. }
  209. if (self.horizontalMode == 0) {
  210. textRect.origin.x = 0
  211. } else if (self.horizontalMode == 1) {
  212. textRect.origin.x = (imageSize.width-textRect.size.width) * 0.5
  213. } else {
  214. textRect.origin.x = imageSize.width-textRect.size.width
  215. }
  216. textRect.origin.x += self.horizontalSpace
  217. textRect.origin.y += self.verticalSpace
  218. let contextCenter = CGPoint(x: textRect.midX, y: textRect.midY)
  219. context.translateBy(x: contextCenter.x, y: contextCenter.y)
  220. context.rotate(by: radian)
  221. context.translateBy(x: -contextCenter.x, y: -contextCenter.y)
  222. let testRect = NSMakeRect(textRect.origin.x+(textRect.size.width-size.width)/2.0,
  223. textRect.origin.y+(textRect.size.height-size.height)/2.0,
  224. size.width, size.height)
  225. self.text.draw(in: NSMakeRect(textRect.origin.x+(textRect.size.width-size.width)/2.0,
  226. textRect.origin.y+(textRect.size.height-size.height)/2.0,
  227. size.width, size.height), withAttributes: dictionary)
  228. }
  229. } else if (self.image != nil) {
  230. var size = self.image.size
  231. size.width *= self.scale
  232. size.height *= self.scale
  233. let width: CGFloat = sqrt(image.size.height * image.size.height + image.size.width * image.size.width)
  234. let newRect = NSMakeRect(-(width - image.size.width)/2, -(width - image.size.height)/2, width, width)
  235. let new_w = newRect.size.width
  236. let new_h = newRect.size.height
  237. let radian: CGFloat = self.rotation * (Double.pi / 180.0)
  238. let t: CGAffineTransform = CGAffineTransform(rotationAngle: radian)
  239. if (self.isTilePage) {
  240. context.translateBy(x: image.size.width/2,y: image.size.height/2)
  241. context.concatenate(t)
  242. context.translateBy(x: -(image.size.width/2), y: -(image.size.height/2))
  243. let verticalWidth: CGFloat = size.width + self.tileHorizontalSpace * self.scale
  244. let horizontalHeight: CGFloat = size.height + self.tileVerticalSpace * self.scale
  245. let line: Int = Int((new_h - self.tileVerticalSpace * self.scale) / horizontalHeight + 1)
  246. let row: Int = Int((new_w - self.tileHorizontalSpace * self.scale) / verticalWidth + 1)
  247. let point = NSPoint(x: image.size.width/2 - size.width/2+self.horizontalSpace*self.scale, y: image.size.height/2 - size.height/2+self.verticalSpace * self.scale)
  248. for i in 0 ..< (line/2+1) {
  249. for j in 0 ..< row {
  250. let area = CGRect(x: point.x + CGFloat(j) * verticalWidth, y: point.y + CGFloat(i)*horizontalHeight, width: size.width, height: size.height)
  251. self.image.draw(in: area, from: NSZeroRect, operation: .overlay, fraction: self.opacity)
  252. }
  253. }
  254. for i in 1 ..< (line/2+1) {
  255. for j in 0 ..< row {
  256. let area = CGRect(x: point.x + CGFloat(j) * verticalWidth, y: point.y - CGFloat(i)*horizontalHeight, width: size.width, height: size.height)
  257. self.image.draw(in: area, from: NSZeroRect, operation: .overlay, fraction: self.opacity)
  258. }
  259. }
  260. for i in 0 ..< (line/2+1) {
  261. for j in 1 ..< row {
  262. let area = CGRect(x: point.x - CGFloat(j) * verticalWidth, y: point.y + CGFloat(i)*horizontalHeight, width: size.width, height: size.height)
  263. self.image.draw(in: area, from: NSZeroRect, operation: .overlay, fraction: self.opacity)
  264. }
  265. }
  266. for i in 1 ..< (line/2+1) {
  267. for j in 1 ..< row {
  268. let area = CGRect(x: point.x - CGFloat(j) * verticalWidth, y: point.y - CGFloat(i)*horizontalHeight, width: size.width, height: size.height)
  269. self.image.draw(in: area, from: NSZeroRect, operation: .overlay, fraction: self.opacity)
  270. }
  271. }
  272. } else {
  273. var size = self.image.size
  274. size.width *= self.scale
  275. size.height *= self.scale
  276. let radian: CGFloat = self.rotation * (Double.pi / 180.0)
  277. let t: CGAffineTransform = CGAffineTransform(rotationAngle: radian)
  278. var imageRect = NSMakeRect(0, 0, size.width, size.height).applying(t)
  279. if (self.verticalMode == 0) {
  280. imageRect.origin.y = imageSize.height-imageRect.size.height
  281. } else if (self.verticalMode == 1) {
  282. imageRect.origin.y = (imageSize.height-imageRect.size.height) * 0.5
  283. } else {
  284. imageRect.origin.y = 0
  285. }
  286. if (self.horizontalMode == 0) {
  287. imageRect.origin.x = 0
  288. } else if (self.horizontalMode == 1) {
  289. imageRect.origin.x = (imageSize.width-imageRect.size.width) * 0.5
  290. } else {
  291. imageRect.origin.x = imageSize.width-imageRect.size.width
  292. }
  293. let contextCenter = CGPoint(x: rect.midX, y: rect.midY)
  294. context.translateBy(x: contextCenter.x, y: contextCenter.y)
  295. context.rotate(by: radian)
  296. context.translateBy(x: -contextCenter.x, y: -contextCenter.y)
  297. let finalRect = NSMakeRect(imageRect.origin.x+(imageRect.size.width-size.width)/2.0,
  298. imageRect.origin.y+(imageRect.size.height-size.height)/2.0,
  299. size.width, size.height)
  300. self.image.draw(in: finalRect, from: NSZeroRect, operation: .overlay, fraction: self.opacity)
  301. }
  302. }
  303. NSGraphicsContext.restoreGraphicsState()
  304. NSGraphicsContext.current?.imageInterpolation = .default
  305. image.unlockFocus()
  306. return image
  307. }
  308. }