CPDFJSONDataParse.swift 67 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169
  1. //
  2. // CPDFJSONDataParse.swift
  3. // ComPDFKit_Tools
  4. //
  5. // Copyright © 2014-2024 PDF Technologies, Inc. All Rights Reserved.
  6. //
  7. // THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
  8. // AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
  9. // UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
  10. // This notice may not be removed from this file.
  11. //
  12. import UIKit
  13. import ComPDFKit
  14. import Foundation
  15. open class CPDFJSONDataParse: NSObject {
  16. public var configuration: CPDFConfiguration?
  17. public init(filePath jsonFilePath: String) {
  18. super.init()
  19. let jsonDic = readJSONFromPath(jsonFilePath)
  20. self.configuration = parseJSON(jsonDic)
  21. }
  22. public init(String jsonSting: String) {
  23. super.init()
  24. let jsonDic = readJSONSting(jsonSting)
  25. self.configuration = parseJSON(jsonDic)
  26. }
  27. public init(HttpURL httpUrl:String) {
  28. super.init()
  29. fetchJSONData(from: httpUrl) { result in
  30. switch result {
  31. case .success(let json):
  32. let jsonDic = self.getConfigDic(json)
  33. self.configuration = self.parseJSON(jsonDic)
  34. // Handle your JSON data here
  35. case .failure(let error):
  36. print("Failed to fetch JSON with error: \(error)")
  37. // Handle the error here
  38. }
  39. }
  40. }
  41. func fetchJSONData(from url: String, completion: @escaping (Result<[String: Any], Error>) -> Void) {
  42. guard let url = URL(string: url) else {
  43. completion(.failure(NSError(domain: "Invalid URL", code: 0, userInfo: nil)))
  44. return
  45. }
  46. URLSession.shared.dataTask(with: url) { data, response, error in
  47. if let error = error {
  48. completion(.failure(error))
  49. return
  50. }
  51. guard let data = data else {
  52. completion(.failure(NSError(domain: "No data received", code: 0, userInfo: nil)))
  53. return
  54. }
  55. do {
  56. let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] ?? [:]
  57. completion(.success(json))
  58. } catch {
  59. completion(.failure(error))
  60. }
  61. }.resume()
  62. }
  63. func readJSONFromPath(_ jsonFilePath: String) -> Dictionary<String, Any> {
  64. do {
  65. let jsonData = try Data(contentsOf: URL(fileURLWithPath: jsonFilePath))
  66. let jsonDic = try JSONSerialization.jsonObject(with: jsonData, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String: Any] ?? [String: Any]()
  67. return jsonDic
  68. } catch{
  69. }
  70. return Dictionary()
  71. }
  72. func readJSONSting(_ jsonSting: String) -> Dictionary<String, Any> {
  73. do {
  74. if let jsonData = jsonSting.data(using: .utf8) {
  75. let jsonDic = try JSONSerialization.jsonObject(with: jsonData, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String: Any] ?? [String: Any]()
  76. return jsonDic
  77. }
  78. } catch{
  79. }
  80. return Dictionary()
  81. }
  82. func getConfigDic(_ jsonDic: Dictionary<String, Any>) -> Dictionary<String, Any> {
  83. for (key, value) in jsonDic {
  84. if key == "list" {
  85. if let innerArray = value as? [Any] {
  86. for (_, item) in innerArray.enumerated() {
  87. if let innerDict = item as? [String: Any] {
  88. for (innerKey, innerValue) in innerDict {
  89. if innerKey == "detail" {
  90. if let string = innerValue as? String {
  91. return readJSONSting(string)
  92. }
  93. }
  94. }
  95. }
  96. }
  97. }
  98. }
  99. }
  100. return [String: Any]()
  101. }
  102. func parseJSON(_ jsonDic: Dictionary<String, Any>) -> CPDFConfiguration {
  103. let configuration = CPDFConfiguration()
  104. for (key, value) in jsonDic {
  105. if key == "modeConfig" {
  106. if let innerDict = value as? [String: Any] {
  107. for (innerKey, innerValue) in innerDict {
  108. if innerKey == "initialViewMode" {
  109. let innerValueString = innerValue as? String ?? ""
  110. if innerValueString == "viewer" {
  111. configuration.enterToolModel = .viewer
  112. } else if innerValueString == "annotations" {
  113. configuration.enterToolModel = .annotation
  114. } else if innerValueString == "contentEditor" {
  115. configuration.enterToolModel = .edit
  116. } else if innerValueString == "forms" {
  117. configuration.enterToolModel = .form
  118. } else if innerValueString == "signatures" {
  119. configuration.enterToolModel = .signature
  120. }
  121. } else if innerKey == "readerOnly" {
  122. configuration.readerOnly = innerValue as? Bool ?? false
  123. } else if innerKey == "availableViewModes" {
  124. if let innerArray = innerValue as? [Any] {
  125. var availableViewModes: [CPDFToolFunctionTypeState] = []
  126. for (_, item) in innerArray.enumerated() {
  127. let itemString = item as? String ?? ""
  128. if itemString == "viewer" && !availableViewModes.contains(.viewer) {
  129. availableViewModes.append(.viewer)
  130. } else if itemString == "annotations" && !availableViewModes.contains(.annotation) {
  131. availableViewModes.append(.annotation)
  132. } else if itemString == "contentEditor" && !availableViewModes.contains(.edit) {
  133. availableViewModes.append(.edit)
  134. } else if itemString == "forms" && !availableViewModes.contains(.form) {
  135. availableViewModes.append(.form)
  136. } else if itemString == "signatures" && !availableViewModes.contains(.signature) {
  137. availableViewModes.append(.signature)
  138. }
  139. }
  140. configuration.availableViewModes = availableViewModes
  141. }
  142. }
  143. }
  144. }
  145. } else if key == "toolbarConfig" {
  146. if let innerDict = value as? [String: Any] {
  147. for (innerKey, innerValue) in innerDict {
  148. if let innerArray = innerValue as? [Any] {
  149. if innerKey == "iosRightBarAvailableActions" {
  150. var showRightItems: [CNavBarButtonItem] = []
  151. var rightItems: [CPDFViewBarRightButtonItem] = []
  152. for (_, item) in innerArray.enumerated() {
  153. let itemString = item as? String ?? ""
  154. if itemString == "search" && !rightItems.contains(.search) {
  155. let search = CNavBarButtonItem(viewRightBarButtonItem: .search)
  156. showRightItems.append(search)
  157. rightItems.append(.search)
  158. } else if itemString == "bota" && !rightItems.contains(.bota) {
  159. let bota = CNavBarButtonItem(viewRightBarButtonItem: .bota)
  160. showRightItems.append(bota)
  161. rightItems.append(.bota)
  162. } else if itemString == "menu" && !rightItems.contains(.more) {
  163. let more = CNavBarButtonItem(viewRightBarButtonItem: .more)
  164. showRightItems.append(more)
  165. rightItems.append(.more)
  166. }
  167. }
  168. configuration.showRightItems = showRightItems
  169. } else if innerKey == "iosLeftBarAvailableActions" {
  170. var showleftItems: [CNavBarButtonItem] = []
  171. var leftItems: [CPDFViewBarLeftButtonItem] = []
  172. for (_, item) in innerArray.enumerated() {
  173. let itemString = item as? String ?? ""
  174. if itemString == "back" && !leftItems.contains(.back) {
  175. let back = CNavBarButtonItem(viewLeftBarButtonItem: .back)
  176. showleftItems.append(back)
  177. leftItems.append(.back)
  178. } else if itemString == "thumbnail" && !leftItems.contains(.thumbnail) {
  179. let thumbnail = CNavBarButtonItem(viewLeftBarButtonItem: .thumbnail)
  180. showleftItems.append(thumbnail)
  181. leftItems.append(.thumbnail)
  182. }
  183. }
  184. configuration.showleftItems = showleftItems
  185. } else if innerKey == "availableMenus" {
  186. var showMoreItems: [CPDFPopMenuViewType] = []
  187. for (_, item) in innerArray.enumerated() {
  188. let itemString = item as? String ?? ""
  189. if itemString == "viewSettings" && !showMoreItems.contains(.setting) {
  190. showMoreItems.append(.setting)
  191. } else if itemString == "documentEditor" && !showMoreItems.contains(.pageEdit) {
  192. showMoreItems.append(.pageEdit)
  193. } else if itemString == "security" && !showMoreItems.contains(.security) {
  194. showMoreItems.append(.security)
  195. } else if itemString == "watermark" && !showMoreItems.contains(.watermark) {
  196. showMoreItems.append(.watermark)
  197. } else if itemString == "documentInfo" && !showMoreItems.contains(.info) {
  198. showMoreItems.append(.info)
  199. } else if itemString == "save" && !showMoreItems.contains(.save) {
  200. showMoreItems.append(.save)
  201. } else if itemString == "share" && !showMoreItems.contains(.share) {
  202. showMoreItems.append(.share)
  203. } else if itemString == "openDocument" && !showMoreItems.contains(.addFile) {
  204. showMoreItems.append(.addFile)
  205. } else if itemString == "flattened" && !showMoreItems.contains(.flattened) {
  206. showMoreItems.append(.flattened)
  207. }
  208. }
  209. configuration.showMoreItems = showMoreItems
  210. }
  211. }
  212. }
  213. }
  214. } else if key == "annotationsConfig" {
  215. if let innerDict = value as? [String: Any] {
  216. for (innerKey, innerValue) in innerDict {
  217. if let innerArray = innerValue as? [Any] {
  218. if innerKey == "availableTypes" {
  219. var annotationsTypes: [CPDFAnnotationToolbarType] = []
  220. for (_, item) in innerArray.enumerated() {
  221. let itemString = item as? String ?? ""
  222. if itemString == "note" && !annotationsTypes.contains(.note) {
  223. annotationsTypes.append(.note)
  224. } else if itemString == "highlight" && !annotationsTypes.contains(.highlight) {
  225. annotationsTypes.append(.highlight)
  226. } else if itemString == "underline" && !annotationsTypes.contains(.underline) {
  227. annotationsTypes.append(.underline)
  228. } else if itemString == "squiggly" && !annotationsTypes.contains(.squiggly) {
  229. annotationsTypes.append(.squiggly)
  230. } else if itemString == "strikeout" && !annotationsTypes.contains(.strikeout) {
  231. annotationsTypes.append(.strikeout)
  232. } else if itemString == "ink" && !annotationsTypes.contains(.freehand) {
  233. annotationsTypes.append(.freehand)
  234. } else if itemString == "pencil" && !annotationsTypes.contains(.pencilDrawing) {
  235. annotationsTypes.append(.pencilDrawing)
  236. } else if itemString == "circle" && !annotationsTypes.contains(.shapeCircle) {
  237. annotationsTypes.append(.shapeCircle)
  238. } else if itemString == "square" && !annotationsTypes.contains(.shapeRectangle) {
  239. annotationsTypes.append(.shapeRectangle)
  240. } else if itemString == "arrow" && !annotationsTypes.contains(.shapeArrow) {
  241. annotationsTypes.append(.shapeArrow)
  242. } else if itemString == "line" && !annotationsTypes.contains(.shapeLine) {
  243. annotationsTypes.append(.shapeLine)
  244. } else if itemString == "freetext" && !annotationsTypes.contains(.freeText) {
  245. annotationsTypes.append(.freeText)
  246. } else if itemString == "signature" && !annotationsTypes.contains(.signature) {
  247. annotationsTypes.append(.signature)
  248. } else if itemString == "stamp" && !annotationsTypes.contains(.stamp) {
  249. annotationsTypes.append(.stamp)
  250. } else if itemString == "pictures" && !annotationsTypes.contains(.image) {
  251. annotationsTypes.append(.image)
  252. } else if itemString == "link" && !annotationsTypes.contains(.link) {
  253. annotationsTypes.append(.link)
  254. } else if itemString == "sound" && !annotationsTypes.contains(.sound) {
  255. annotationsTypes.append(.sound)
  256. }
  257. }
  258. configuration.annotationsTypes = annotationsTypes
  259. } else if innerKey == "availableTools" {
  260. var annotationsTools: [CPDFAnnotationPropertieType] = []
  261. for (_, item) in innerArray.enumerated() {
  262. let itemString = item as? String ?? ""
  263. if itemString == "setting" && !annotationsTools.contains(.setting) {
  264. annotationsTools.append(.setting)
  265. } else if itemString == "undo" && !annotationsTools.contains(.undo) {
  266. annotationsTools.append(.undo)
  267. } else if itemString == "redo" && !annotationsTools.contains(.redo) {
  268. annotationsTools.append(.redo)
  269. }
  270. }
  271. configuration.annotationsTools = annotationsTools
  272. }
  273. } else if let innerDict = innerValue as? [String: Any] {
  274. if innerKey == "initAttribute" {
  275. configuration.annotationAttribute = innerDict
  276. }
  277. }
  278. }
  279. }
  280. } else if key == "contentEditorConfig" {
  281. if let innerDict = value as? [String: Any] {
  282. for (innerKey, innerValue) in innerDict {
  283. if let innerArray = innerValue as? [Any] {
  284. if innerKey == "availableTypes" {
  285. var contentEditorTypes: [CPDFEditMode] = []
  286. for (_, item) in innerArray.enumerated() {
  287. let itemString = item as? String ?? ""
  288. if itemString == "editorText" && !contentEditorTypes.contains(.text) {
  289. contentEditorTypes.append(.text)
  290. } else if itemString == "editorImage" && !contentEditorTypes.contains(.image) {
  291. contentEditorTypes.append(.image)
  292. }
  293. }
  294. configuration.contentEditorTypes = contentEditorTypes
  295. } else if innerKey == "availableTools" {
  296. var contentEditorTools: [CPDFEditToolMode] = []
  297. for (_, item) in innerArray.enumerated() {
  298. let itemString = item as? String ?? ""
  299. if itemString == "setting" && !contentEditorTools.contains(.setting) {
  300. contentEditorTools.append(.setting)
  301. } else if itemString == "undo" && !contentEditorTools.contains(.undo) {
  302. contentEditorTools.append(.undo)
  303. } else if itemString == "redo" && !contentEditorTools.contains(.redo) {
  304. contentEditorTools.append(.redo)
  305. }
  306. }
  307. configuration.contentEditorTools = contentEditorTools
  308. }
  309. } else if let innerDict = innerValue as? [String: Any] {
  310. if innerKey == "initAttribute" {
  311. configuration.contentEditorAttribute = innerDict
  312. CPDFJSONDataParse.initializeContentEditorAttribute(Configuration: configuration)
  313. }
  314. }
  315. }
  316. }
  317. } else if key == "formsConfig" {
  318. if let innerDict = value as? [String: Any] {
  319. for (innerKey, innerValue) in innerDict {
  320. if let innerArray = innerValue as? [Any] {
  321. if innerKey == "availableTypes" {
  322. var formTypes: [CPDFFormToolbarSelectedIndex] = []
  323. for (_, item) in innerArray.enumerated() {
  324. let itemString = item as? String ?? ""
  325. if itemString == "textField" && !formTypes.contains(.text) {
  326. formTypes.append(.text)
  327. } else if itemString == "checkBox" && !formTypes.contains(.checkBox) {
  328. formTypes.append(.checkBox)
  329. } else if itemString == "radioButton" && !formTypes.contains(.radioButton) {
  330. formTypes.append(.radioButton)
  331. } else if itemString == "listBox" && !formTypes.contains(.list) {
  332. formTypes.append(.list)
  333. } else if itemString == "comboBox" && !formTypes.contains(.comboBox) {
  334. formTypes.append(.comboBox)
  335. } else if itemString == "signaturesFields" && !formTypes.contains(.sign) {
  336. formTypes.append(.sign)
  337. } else if itemString == "pushButton" && !formTypes.contains(.button) {
  338. formTypes.append(.button)
  339. }
  340. }
  341. configuration.formTypes = formTypes
  342. } else if innerKey == "availableTools" {
  343. var formTools: [CPDFFormPropertieType] = []
  344. for (_, item) in innerArray.enumerated() {
  345. let itemString = item as? String ?? ""
  346. if itemString == "undo" && !formTools.contains(.undo) {
  347. formTools.append(.undo)
  348. } else if itemString == "redo" && !formTools.contains(.redo) {
  349. formTools.append(.redo)
  350. }
  351. }
  352. configuration.formTools = formTools
  353. }
  354. } else if let innerDict = innerValue as? [String: Any] {
  355. if innerKey == "initAttribute" {
  356. configuration.formsAttribute = innerDict
  357. CPDFJSONDataParse.initializeFormsAttribute(Configuration: configuration)
  358. }
  359. }
  360. }
  361. }
  362. } else if key == "readerViewConfig" {
  363. if let innerDict = value as? [String: Any] {
  364. for (innerKey, innerValue) in innerDict {
  365. configuration.readerViewConfig = innerDict
  366. if innerKey == "linkHighlight" {
  367. let linkHighlight = innerValue as? Bool ?? false
  368. CPDFKitConfig.sharedInstance().setEnableLinkFieldHighlight(linkHighlight)
  369. } else if innerKey == "formFieldHighlight" {
  370. let formFieldHighlight = innerValue as? Bool ?? false
  371. CPDFKitConfig.sharedInstance().setEnableFormFieldHighlight(formFieldHighlight)
  372. }
  373. }
  374. }
  375. }
  376. }
  377. return configuration
  378. }
  379. class func initializeReaderViewConfig(_ configuration: CPDFConfiguration, PDFView pdfListView: CPDFListView) {
  380. for (key, value) in configuration.readerViewConfig {
  381. if key == "displayMode" {
  382. let valueString = value as? String ?? ""
  383. if valueString == "singlePage" {
  384. pdfListView.displayTwoUp = false
  385. pdfListView.displaysAsBook = false
  386. } else if valueString == "doublePage" {
  387. pdfListView.displayTwoUp = true
  388. pdfListView.displaysAsBook = false
  389. } else if valueString == "coverPage" {
  390. pdfListView.displayTwoUp = true
  391. pdfListView.displaysAsBook = true
  392. }
  393. } else if key == "continueMode" {
  394. let continueMode = value as? Bool ?? false
  395. pdfListView.displaysPageBreaks = continueMode
  396. } else if key == "verticalMode" {
  397. let verticalMode = value as? Bool ?? false
  398. if verticalMode {
  399. pdfListView.displayDirection = .vertical
  400. } else {
  401. pdfListView.displayDirection = .horizontal
  402. }
  403. } else if key == "cropMode" {
  404. let cropMode = value as? Bool ?? false
  405. pdfListView.displayCrop = cropMode
  406. } else if key == "themes" {
  407. let valueString = value as? String ?? ""
  408. if valueString == "light" {
  409. pdfListView.displayMode = .normal
  410. } else if valueString == "dark" {
  411. pdfListView.displayMode = .night
  412. } else if valueString == "sepia" {
  413. pdfListView.displayMode = .soft
  414. } else if valueString == "reseda" {
  415. pdfListView.displayMode = .green
  416. }
  417. } else if key == "enableSliderBar" {
  418. let enableSliderBar = value as? Bool ?? false
  419. pdfListView.pageSliderView?.isHidden = !enableSliderBar
  420. } else if key == "enablePageIndicator" {
  421. let enablePageIndicator = value as? Bool ?? false
  422. pdfListView.pageIndicatorView?.alpha = enablePageIndicator ? 1 : 0
  423. } else if key == "pageSpacing" {
  424. let pageSpacing = value as? CGFloat ?? 0
  425. pdfListView.pageBreakMargins = UIEdgeInsets(top: pageSpacing, left: 10.0, bottom: pageSpacing, right: 10.0)
  426. }
  427. }
  428. pdfListView.layoutDocumentView()
  429. for (key, value) in configuration.readerViewConfig {
  430. if key == "pageScale" {
  431. var pageScale = value as? CGFloat ?? 0
  432. if pageScale < 1 {
  433. pageScale = 1
  434. }
  435. pdfListView.setScaleFactor(pageScale, animated: false)
  436. }
  437. }
  438. }
  439. class func initializeFormsAttribute(Configuration configuration: CPDFConfiguration) {
  440. let userDefaults = UserDefaults.standard
  441. for (key, value) in configuration.formsAttribute {
  442. if key == "textField" {
  443. if let innerDict = value as? [String: Any] {
  444. var isBold = false
  445. var isItalic = false
  446. var baseName = ""
  447. for (innerKey, innerValue) in innerDict {
  448. if innerKey == "fillColor" {
  449. let string = innerValue as? String ?? ""
  450. let color = UserDefaults.colorWithHexString(string)
  451. userDefaults.setPDFListViewColor(color, forKey: CTextFieldInteriorColorKey)
  452. } else if innerKey == "borderColor" {
  453. let string = innerValue as? String ?? ""
  454. let color = UserDefaults.colorWithHexString(string)
  455. userDefaults.setPDFListViewColor(color, forKey: CTextFieldColorKey)
  456. } else if innerKey == "borderWidth" {
  457. let borderWidth = innerValue as? CGFloat ?? 1
  458. userDefaults.set(borderWidth, forKey: CTextFieldLineWidthKey)
  459. } else if innerKey == "fontColor" {
  460. let string = innerValue as? String ?? ""
  461. let color = UserDefaults.colorWithHexString(string)
  462. userDefaults.setPDFListViewColor(color, forKey: CTextFieldFontColorKey)
  463. } else if innerKey == "fontSize" {
  464. let fontSize = innerValue as? CGFloat ?? 10
  465. userDefaults.set(fontSize, forKey: CTextFieldFontSizeKey)
  466. } else if innerKey == "isBold" {
  467. isBold = innerValue as? Bool ?? false
  468. } else if innerKey == "isItalic" {
  469. isItalic = innerValue as? Bool ?? false
  470. } else if innerKey == "alignment" {
  471. let string = innerValue as? String ?? ""
  472. if string == "left" {
  473. userDefaults.set(0, forKey: CTextFieldAlignmentKey)
  474. } else if string == "center" {
  475. userDefaults.set(1, forKey: CTextFieldAlignmentKey)
  476. } else if string == "right" {
  477. userDefaults.set(2, forKey: CTextFieldAlignmentKey)
  478. }
  479. } else if innerKey == "typeface" {
  480. baseName = innerValue as? String ?? ""
  481. } else if innerKey == "multiline" {
  482. let multiline = innerValue as? Bool ?? false
  483. userDefaults.set(multiline, forKey: CTextFieldIsMultilineKey)
  484. }
  485. }
  486. let constructName = CPDFJSONDataParse.constructionFontName(BaseName: baseName, isBold: isBold, isItalic: isItalic)
  487. userDefaults.set(baseName, forKey: CTextFieldFontFamilyNameKey)
  488. userDefaults.set(constructName, forKey: CTextFieldFontStyleNameKey)
  489. }
  490. } else if key == "checkBox" {
  491. if let innerDict = value as? [String: Any] {
  492. for (innerKey, innerValue) in innerDict {
  493. if innerKey == "fillColor" {
  494. let string = innerValue as? String ?? ""
  495. let color = UserDefaults.colorWithHexString(string)
  496. userDefaults.setPDFListViewColor(color, forKey: CCheckBoxInteriorColorKey)
  497. } else if innerKey == "borderColor" {
  498. let string = innerValue as? String ?? ""
  499. let color = UserDefaults.colorWithHexString(string)
  500. userDefaults.setPDFListViewColor(color, forKey: CCheckBoxColorKey)
  501. } else if innerKey == "borderWidth" {
  502. let borderWidth = innerValue as? CGFloat ?? 1
  503. userDefaults.set(borderWidth, forKey: CCheckBoxLineWidthKey)
  504. } else if innerKey == "checkedColor" {
  505. let string = innerValue as? String ?? ""
  506. let color = UserDefaults.colorWithHexString(string)
  507. userDefaults.setPDFListViewColor(color, forKey: CCheckBoxCheckedColorKey)
  508. } else if innerKey == "isChecked" {
  509. let isChecked = innerValue as? Bool ?? false
  510. userDefaults.set(isChecked, forKey: CCheckBoxIsCheckedKey)
  511. } else if innerKey == "checkedStyle" {
  512. let string = innerValue as? String ?? ""
  513. if string == "check" {
  514. userDefaults.set(0, forKey: CCheckBoxCheckedStyleKey)
  515. } else if string == "circle," {
  516. userDefaults.set(1, forKey: CCheckBoxCheckedStyleKey)
  517. } else if string == "cross" {
  518. userDefaults.set(2, forKey: CCheckBoxCheckedStyleKey)
  519. } else if string == "diamond" {
  520. userDefaults.set(3, forKey: CCheckBoxCheckedStyleKey)
  521. } else if string == "square" {
  522. userDefaults.set(4, forKey: CCheckBoxCheckedStyleKey)
  523. } else if string == "star" {
  524. userDefaults.set(5, forKey: CCheckBoxCheckedStyleKey)
  525. }
  526. }
  527. }
  528. }
  529. } else if key == "radioButton" {
  530. if let innerDict = value as? [String: Any] {
  531. for (innerKey, innerValue) in innerDict {
  532. if innerKey == "fillColor" {
  533. let string = innerValue as? String ?? ""
  534. let color = UserDefaults.colorWithHexString(string)
  535. userDefaults.setPDFListViewColor(color, forKey: CRadioButtonInteriorColorKey)
  536. } else if innerKey == "borderColor" {
  537. let string = innerValue as? String ?? ""
  538. let color = UserDefaults.colorWithHexString(string)
  539. userDefaults.setPDFListViewColor(color, forKey: CRadioButtonColorKey)
  540. } else if innerKey == "borderWidth" {
  541. let borderWidth = innerValue as? CGFloat ?? 1
  542. userDefaults.set(borderWidth, forKey: CRadioButtonLineWidthKey)
  543. } else if innerKey == "checkedColor" {
  544. let string = innerValue as? String ?? ""
  545. let color = UserDefaults.colorWithHexString(string)
  546. userDefaults.setPDFListViewColor(color, forKey: CRadioButtonCheckedColorKey)
  547. } else if innerKey == "isChecked" {
  548. let isChecked = innerValue as? Bool ?? false
  549. userDefaults.set(isChecked, forKey: CRadioButtonIsCheckedKey)
  550. } else if innerKey == "checkedStyle" {
  551. let string = innerValue as? String ?? ""
  552. if string == "check" {
  553. userDefaults.set(0, forKey: CRadioButtonCheckedStyleKey)
  554. } else if string == "circle" {
  555. userDefaults.set(1, forKey: CRadioButtonCheckedStyleKey)
  556. } else if string == "cross" {
  557. userDefaults.set(2, forKey: CRadioButtonCheckedStyleKey)
  558. } else if string == "diamond" {
  559. userDefaults.set(3, forKey: CRadioButtonCheckedStyleKey)
  560. } else if string == "square" {
  561. userDefaults.set(4, forKey: CRadioButtonCheckedStyleKey)
  562. } else if string == "star" {
  563. userDefaults.set(5, forKey: CRadioButtonCheckedStyleKey)
  564. }
  565. }
  566. }
  567. }
  568. } else if key == "listBox" {
  569. if let innerDict = value as? [String: Any] {
  570. var isBold = false
  571. var isItalic = false
  572. var baseName = ""
  573. for (innerKey, innerValue) in innerDict {
  574. if innerKey == "fillColor" {
  575. let string = innerValue as? String ?? ""
  576. let color = UserDefaults.colorWithHexString(string)
  577. userDefaults.setPDFListViewColor(color, forKey: CListBoxInteriorColorKey)
  578. } else if innerKey == "borderColor" {
  579. let string = innerValue as? String ?? ""
  580. let color = UserDefaults.colorWithHexString(string)
  581. userDefaults.setPDFListViewColor(color, forKey: CListBoxColorKey)
  582. } else if innerKey == "borderWidth" {
  583. let borderWidth = innerValue as? CGFloat ?? 1
  584. userDefaults.set(borderWidth, forKey: CListBoxLineWidthKey)
  585. } else if innerKey == "fontColor" {
  586. let string = innerValue as? String ?? ""
  587. let color = UserDefaults.colorWithHexString(string)
  588. userDefaults.setPDFListViewColor(color, forKey: CListBoxFontColorKey)
  589. } else if innerKey == "fontSize" {
  590. let fontSize = innerValue as? CGFloat ?? 10
  591. userDefaults.set(fontSize, forKey: CListBoxFontSizeKey)
  592. } else if innerKey == "isBold" {
  593. isBold = innerValue as? Bool ?? false
  594. } else if innerKey == "isItalic" {
  595. isItalic = innerValue as? Bool ?? false
  596. } else if innerKey == "typeface" {
  597. baseName = innerValue as? String ?? ""
  598. }
  599. }
  600. let constructName = CPDFJSONDataParse.constructionFontName(BaseName: baseName, isBold: isBold, isItalic: isItalic)
  601. userDefaults.set(baseName, forKey: CListBoxFontFamilyNameKey)
  602. userDefaults.set(constructName, forKey: CListBoxFontStyleNameKey)
  603. }
  604. } else if key == "comboBox" {
  605. if let innerDict = value as? [String: Any] {
  606. var isBold = false
  607. var isItalic = false
  608. var baseName = ""
  609. for (innerKey, innerValue) in innerDict {
  610. if innerKey == "fillColor" {
  611. let string = innerValue as? String ?? ""
  612. let color = UserDefaults.colorWithHexString(string)
  613. userDefaults.setPDFListViewColor(color, forKey: CComboBoxInteriorColorKey)
  614. } else if innerKey == "borderColor" {
  615. let string = innerValue as? String ?? ""
  616. let color = UserDefaults.colorWithHexString(string)
  617. userDefaults.setPDFListViewColor(color, forKey: CComboBoxColorKey)
  618. } else if innerKey == "borderWidth" {
  619. let borderWidth = innerValue as? CGFloat ?? 1
  620. userDefaults.set(borderWidth, forKey: CComboBoxLineWidthKey)
  621. } else if innerKey == "fontColor" {
  622. let string = innerValue as? String ?? ""
  623. let color = UserDefaults.colorWithHexString(string)
  624. userDefaults.setPDFListViewColor(color, forKey: CComboBoxFontColorKey)
  625. } else if innerKey == "fontSize" {
  626. let fontSize = innerValue as? CGFloat ?? 10
  627. userDefaults.set(fontSize, forKey: CComboBoxFontSizeKey)
  628. } else if innerKey == "isBold" {
  629. isBold = innerValue as? Bool ?? false
  630. } else if innerKey == "isItalic" {
  631. isItalic = innerValue as? Bool ?? false
  632. } else if innerKey == "typeface" {
  633. baseName = innerValue as? String ?? ""
  634. }
  635. }
  636. let constructName = CPDFJSONDataParse.constructionFontName(BaseName: baseName, isBold: isBold, isItalic: isItalic)
  637. userDefaults.set(baseName, forKey: CComboBoxFontFamilyNameKey)
  638. userDefaults.set(constructName, forKey: CComboBoxFontStyleNameKey)
  639. }
  640. } else if key == "pushButton" {
  641. if let innerDict = value as? [String: Any] {
  642. var isBold = false
  643. var isItalic = false
  644. var baseName = ""
  645. for (innerKey, innerValue) in innerDict {
  646. if innerKey == "fillColor" {
  647. let string = innerValue as? String ?? ""
  648. let color = UserDefaults.colorWithHexString(string)
  649. userDefaults.setPDFListViewColor(color, forKey: CPushButtonInteriorColorKey)
  650. } else if innerKey == "borderColor" {
  651. let string = innerValue as? String ?? ""
  652. let color = UserDefaults.colorWithHexString(string)
  653. userDefaults.setPDFListViewColor(color, forKey: CPushButtonColorKey)
  654. } else if innerKey == "borderWidth" {
  655. let borderWidth = innerValue as? CGFloat ?? 1
  656. userDefaults.set(borderWidth, forKey: CPushButtonLineWidthKey)
  657. } else if innerKey == "fontColor" {
  658. let string = innerValue as? String ?? ""
  659. let color = UserDefaults.colorWithHexString(string)
  660. userDefaults.setPDFListViewColor(color, forKey: CPushButtonFontColorKey)
  661. } else if innerKey == "fontSize" {
  662. let fontSize = innerValue as? CGFloat ?? 10
  663. userDefaults.set(fontSize, forKey: CPushButtonFontSizeKey)
  664. } else if innerKey == "isBold" {
  665. isBold = innerValue as? Bool ?? false
  666. } else if innerKey == "isItalic" {
  667. isItalic = innerValue as? Bool ?? false
  668. } else if innerKey == "typeface" {
  669. baseName = innerValue as? String ?? ""
  670. } else if innerKey == "title" {
  671. let string = innerValue as? String ?? ""
  672. userDefaults.set(string, forKey: CPushButtonTitleKey)
  673. }
  674. }
  675. let constructName = CPDFJSONDataParse.constructionFontName(BaseName: baseName, isBold: isBold, isItalic: isItalic)
  676. userDefaults.set(baseName, forKey: CPushButtonFontFamilyNameKey)
  677. userDefaults.set(constructName, forKey: CPushButtonFontStyleNameKey)
  678. }
  679. } else if key == "signaturesFields" {
  680. if let innerDict = value as? [String: Any] {
  681. for (innerKey, innerValue) in innerDict {
  682. if innerKey == "fillColor" {
  683. let string = innerValue as? String ?? ""
  684. let color = UserDefaults.colorWithHexString(string)
  685. userDefaults.setPDFListViewColor(color, forKey: CSignaturesFieldsInteriorColorKey)
  686. } else if innerKey == "borderColor" {
  687. let string = innerValue as? String ?? ""
  688. let color = UserDefaults.colorWithHexString(string)
  689. userDefaults.setPDFListViewColor(color, forKey: CSignaturesFieldsColorKey)
  690. } else if innerKey == "borderWidth" {
  691. let borderWidth = innerValue as? CGFloat ?? 1
  692. userDefaults.set(borderWidth, forKey: CSignaturesFieldsLineWidthKey)
  693. } else if innerKey == "borderStyle" {
  694. let string = innerValue as? String ?? ""
  695. if string == "solid" {
  696. userDefaults.set(0, forKey: CSignaturesFieldsLineStyleKey)
  697. } else if string == "dashed" {
  698. userDefaults.set(1, forKey: CSignaturesFieldsLineStyleKey)
  699. } else if string == "beveled" {
  700. userDefaults.set(2, forKey: CSignaturesFieldsLineStyleKey)
  701. } else if string == "inset" {
  702. userDefaults.set(3, forKey: CSignaturesFieldsLineStyleKey)
  703. } else if string == "underline" {
  704. userDefaults.set(4, forKey: CSignaturesFieldsLineStyleKey)
  705. }
  706. }
  707. }
  708. }
  709. }
  710. }
  711. userDefaults.synchronize()
  712. }
  713. class func initializeContentEditorAttribute(Configuration configuration: CPDFConfiguration) {
  714. let userDefaults = UserDefaults.standard
  715. for (key, value) in configuration.contentEditorAttribute {
  716. if key == "text" {
  717. if let innerDict = value as? [String: Any] {
  718. var isBold = false
  719. var isItalic = false
  720. var baseName = ""
  721. for (innerKey, innerValue) in innerDict {
  722. if innerKey == "fontColor" {
  723. let string = innerValue as? String ?? ""
  724. let color = UserDefaults.colorWithHexString(string)
  725. userDefaults.setPDFListViewColor(color, forKey: CPDFContentEditTextCreateFontColorKey)
  726. } else if innerKey == "fontColorAlpha" {
  727. let opacity = innerValue as? CGFloat ?? 10
  728. userDefaults.set(opacity / 255.0, forKey: CPDFContentEditTextCreateFontOpacityKey)
  729. } else if innerKey == "fontSize" {
  730. let fontSize = innerValue as? CGFloat ?? 10
  731. userDefaults.set(fontSize, forKey: CPDFContentEditTextCreateFontSizeKey)
  732. } else if innerKey == "isBold" {
  733. isBold = innerValue as? Bool ?? false
  734. } else if innerKey == "isItalic" {
  735. isItalic = innerValue as? Bool ?? false
  736. } else if innerKey == "alignment" {
  737. let string = innerValue as? String ?? ""
  738. if string == "left" {
  739. userDefaults.set(0, forKey: CPDFContentEditTextCreateFontAlignmentKey)
  740. } else if string == "center" {
  741. userDefaults.set(1, forKey: CPDFContentEditTextCreateFontAlignmentKey)
  742. } else if string == "right" {
  743. userDefaults.set(2, forKey: CPDFContentEditTextCreateFontAlignmentKey)
  744. }
  745. } else if innerKey == "typeface" {
  746. baseName = innerValue as? String ?? ""
  747. userDefaults.set(baseName, forKey: CPDFContentEditTextCreateFontNewNameKey)
  748. }
  749. let constructName = CPDFJSONDataParse.constructionFontName(BaseName: baseName, isBold: isBold, isItalic: isItalic)
  750. userDefaults.set(constructName, forKey: CPDFContentEditTextCreateFontNewStyleKey)
  751. }
  752. }
  753. }
  754. }
  755. userDefaults.synchronize()
  756. }
  757. class func initializeAnnotationAttribute(Configuration configuration: CPDFConfiguration) {
  758. let userDefaults = UserDefaults.standard
  759. for (key, value) in configuration.annotationAttribute {
  760. if key == "note" {
  761. if let innerDict = value as? [String: Any] {
  762. for (innerKey, innerValue) in innerDict {
  763. if innerKey == "color" {
  764. let string = innerValue as? String ?? ""
  765. let color = UserDefaults.colorWithHexString(string)
  766. userDefaults.setPDFListViewColor(color, forKey: CAnchoredNoteColorKey)
  767. } else if innerKey == "alpha" {
  768. let opacity = innerValue as? CGFloat ?? 10
  769. userDefaults.set(opacity / 255.0, forKey: CAnchoredNoteOpacityKey)
  770. }
  771. }
  772. }
  773. } else if key == "highlight" {
  774. if let innerDict = value as? [String: Any] {
  775. for (innerKey, innerValue) in innerDict {
  776. if innerKey == "color" {
  777. let string = innerValue as? String ?? ""
  778. let color = UserDefaults.colorWithHexString(string)
  779. userDefaults.setPDFListViewColor(color, forKey: CHighlightNoteColorKey)
  780. } else if innerKey == "alpha" {
  781. let opacity = innerValue as? CGFloat ?? 10
  782. userDefaults.set(opacity / 255.0, forKey: CHighlightNoteOpacityKey)
  783. }
  784. }
  785. }
  786. } else if key == "underline" {
  787. if let innerDict = value as? [String: Any] {
  788. for (innerKey, innerValue) in innerDict {
  789. if innerKey == "color" {
  790. let string = innerValue as? String ?? ""
  791. let color = UserDefaults.colorWithHexString(string)
  792. userDefaults.setPDFListViewColor(color, forKey: CUnderlineNoteColorKey)
  793. } else if innerKey == "alpha" {
  794. let opacity = innerValue as? CGFloat ?? 10
  795. userDefaults.set(opacity / 255.0, forKey: CUnderlineNoteOpacityKey)
  796. }
  797. }
  798. }
  799. } else if key == "squiggly" {
  800. if let innerDict = value as? [String: Any] {
  801. for (innerKey, innerValue) in innerDict {
  802. if innerKey == "color" {
  803. let string = innerValue as? String ?? ""
  804. let color = UserDefaults.colorWithHexString(string)
  805. userDefaults.setPDFListViewColor(color, forKey: CSquigglyNoteColorKey)
  806. } else if innerKey == "alpha" {
  807. let opacity = innerValue as? CGFloat ?? 10
  808. userDefaults.set(opacity / 255.0, forKey: CSquigglyNoteOpacityKey)
  809. }
  810. }
  811. }
  812. } else if key == "strikeout" {
  813. if let innerDict = value as? [String: Any] {
  814. for (innerKey, innerValue) in innerDict {
  815. if innerKey == "color" {
  816. let string = innerValue as? String ?? ""
  817. let color = UserDefaults.colorWithHexString(string)
  818. userDefaults.setPDFListViewColor(color, forKey: CStrikeOutNoteColorKey)
  819. } else if innerKey == "alpha" {
  820. let opacity = innerValue as? CGFloat ?? 10
  821. userDefaults.set(opacity / 255.0, forKey: CStrikeOutNoteOpacityKey)
  822. }
  823. }
  824. }
  825. } else if key == "ink" {
  826. if let innerDict = value as? [String: Any] {
  827. for (innerKey, innerValue) in innerDict {
  828. if innerKey == "color" {
  829. let string = innerValue as? String ?? ""
  830. let color = UserDefaults.colorWithHexString(string)
  831. CPDFKitConfig.sharedInstance().setFreehandAnnotationColor(color)
  832. } else if innerKey == "alpha" {
  833. let opacity = innerValue as? CGFloat ?? 10
  834. CPDFKitConfig.sharedInstance().setFreehandAnnotationOpacity((opacity / 255.0) * 100)
  835. } else if innerKey == "borderWidth" {
  836. let borderWidth = innerValue as? CGFloat ?? 1
  837. CPDFKitConfig.sharedInstance().setFreehandAnnotationBorderWidth(borderWidth)
  838. }
  839. }
  840. }
  841. } else if key == "square" {
  842. if let innerDict = value as? [String: Any] {
  843. for (innerKey, innerValue) in innerDict {
  844. if innerKey == "fillColor" {
  845. let string = innerValue as? String ?? ""
  846. let color = UserDefaults.colorWithHexString(string)
  847. userDefaults.setPDFListViewColor(color, forKey: CSquareNoteInteriorColorKey)
  848. } else if innerKey == "borderColor" {
  849. let string = innerValue as? String ?? ""
  850. let color = UserDefaults.colorWithHexString(string)
  851. userDefaults.setPDFListViewColor(color, forKey: CSquareNoteColorKey)
  852. } else if innerKey == "colorAlpha" {
  853. let opacity = innerValue as? CGFloat ?? 10
  854. userDefaults.set(opacity / 255.0, forKey: CSquareNoteOpacityKey)
  855. userDefaults.set(opacity / 255.0, forKey: CSquareNoteInteriorOpacityKey)
  856. } else if innerKey == "borderWidth" {
  857. let borderWidth = innerValue as? CGFloat ?? 1
  858. userDefaults.set(borderWidth, forKey: CSquareNoteLineWidthKey)
  859. } else if innerKey == "borderStyle" {
  860. if let innerDict = innerValue as? [String: Any] {
  861. for (innerSubKey, innerSubValue) in innerDict {
  862. if innerSubKey == "style" {
  863. let innerValueString = innerSubValue as? String ?? ""
  864. if innerValueString == "solid" {
  865. userDefaults.set(0, forKey: CSquareNoteLineStyleKey)
  866. } else if innerValueString == "dashed" {
  867. userDefaults.set(1, forKey: CSquareNoteLineStyleKey)
  868. }
  869. } else if innerSubKey == "dashGap" {
  870. let dashPattern = innerSubValue as? Int ?? 0
  871. userDefaults.set(dashPattern, forKey: CSquareNoteDashPatternKey )
  872. }
  873. }
  874. }
  875. }
  876. }
  877. }
  878. } else if key == "circle" {
  879. if let innerDict = value as? [String: Any] {
  880. for (innerKey, innerValue) in innerDict {
  881. if innerKey == "fillColor" {
  882. let string = innerValue as? String ?? ""
  883. let color = UserDefaults.colorWithHexString(string)
  884. userDefaults.setPDFListViewColor(color, forKey: CCircleNoteInteriorColorKey)
  885. } else if innerKey == "borderColor" {
  886. let string = innerValue as? String ?? ""
  887. let color = UserDefaults.colorWithHexString(string)
  888. userDefaults.setPDFListViewColor(color, forKey: CCircleNoteColorKey)
  889. } else if innerKey == "colorAlpha" {
  890. let opacity = innerValue as? CGFloat ?? 10
  891. userDefaults.set(opacity / 255.0, forKey: CCircleNoteOpacityKey)
  892. userDefaults.set(opacity / 255.0, forKey: CCircleNoteInteriorOpacityKey)
  893. } else if innerKey == "borderWidth" {
  894. let borderWidth = innerValue as? CGFloat ?? 1
  895. userDefaults.set(borderWidth, forKey: CCircleNoteLineWidthKey)
  896. } else if innerKey == "borderStyle" {
  897. if let innerDict = innerValue as? [String: Any] {
  898. for (innerSubKey, innerSubValue) in innerDict {
  899. if innerSubKey == "style" {
  900. let innerValueString = innerSubValue as? String ?? ""
  901. if innerValueString == "solid" {
  902. userDefaults.set(0, forKey: CCircleNoteLineStyleKey)
  903. } else if innerValueString == "dashed" {
  904. userDefaults.set(1, forKey: CCircleNoteLineStyleKey)
  905. }
  906. } else if innerSubKey == "dashGap" {
  907. let dashPattern = innerSubValue as? Int ?? 0
  908. userDefaults.set(dashPattern, forKey: CCircleNoteDashPatternKey )
  909. }
  910. }
  911. }
  912. }
  913. }
  914. }
  915. } else if key == "line" {
  916. if let innerDict = value as? [String: Any] {
  917. for (innerKey, innerValue) in innerDict {
  918. if innerKey == "borderColor" {
  919. let string = innerValue as? String ?? ""
  920. let color = UserDefaults.colorWithHexString(string)
  921. userDefaults.setPDFListViewColor(color, forKey: CLineNoteColorKey)
  922. } else if innerKey == "borderAlpha" {
  923. let opacity = innerValue as? CGFloat ?? 10
  924. userDefaults.set(opacity / 255.0, forKey: CLineNoteOpacityKey)
  925. } else if innerKey == "borderWidth" {
  926. let borderWidth = innerValue as? CGFloat ?? 1
  927. userDefaults.set(borderWidth, forKey: CLineNoteLineWidthKey)
  928. } else if innerKey == "borderStyle" {
  929. if let innerDict = innerValue as? [String: Any] {
  930. for (innerSubKey, innerSubValue) in innerDict {
  931. if innerSubKey == "style" {
  932. let innerValueString = innerSubValue as? String ?? ""
  933. if innerValueString == "solid" {
  934. userDefaults.set(0, forKey: CLineNoteLineStyleKey)
  935. } else if innerValueString == "dashed" {
  936. userDefaults.set(1, forKey: CLineNoteLineStyleKey)
  937. }
  938. } else if innerSubKey == "dashGap" {
  939. let dashPattern = innerSubValue as? Int ?? 0
  940. userDefaults.set(dashPattern, forKey: CLineNoteDashPatternKey )
  941. }
  942. }
  943. }
  944. }
  945. }
  946. userDefaults.set(0, forKey: CLineNoteStartStyleKey)
  947. userDefaults.set(0, forKey: CLineNoteEndStyleKey)
  948. }
  949. } else if key == "arrow" {
  950. if let innerDict = value as? [String: Any] {
  951. for (innerKey, innerValue) in innerDict {
  952. if innerKey == "borderColor" {
  953. let string = innerValue as? String ?? ""
  954. let color = UserDefaults.colorWithHexString(string)
  955. userDefaults.setPDFListViewColor(color, forKey: CArrowNoteColorKey)
  956. } else if innerKey == "borderAlpha" {
  957. let opacity = innerValue as? CGFloat ?? 10
  958. userDefaults.set(opacity / 255.0, forKey: CArrowNoteOpacityKey)
  959. } else if innerKey == "borderWidth" {
  960. let borderWidth = innerValue as? CGFloat ?? 1
  961. userDefaults.set(borderWidth, forKey: CArrowNoteLineWidthKey)
  962. } else if innerKey == "borderStyle" {
  963. if let innerDict = innerValue as? [String: Any] {
  964. for (innerSubKey, innerSubValue) in innerDict {
  965. if innerSubKey == "style" {
  966. let innerValueString = innerSubValue as? String ?? ""
  967. if innerValueString == "solid" {
  968. userDefaults.set(0, forKey: CArrowNoteLineStyleKey)
  969. } else if innerValueString == "dashed" {
  970. userDefaults.set(1, forKey: CArrowNoteLineStyleKey)
  971. }
  972. } else if innerSubKey == "dashGap" {
  973. let dashPattern = innerSubValue as? Int ?? 0
  974. userDefaults.set(dashPattern, forKey: CArrowNoteDashPatternKey )
  975. }
  976. }
  977. }
  978. } else if innerKey == "startLineType" {
  979. let innerValueString = innerValue as? String ?? ""
  980. if innerValueString == "none" {
  981. userDefaults.set(0, forKey: CArrowNoteStartStyleKey)
  982. } else if innerValueString == "openArrow" {
  983. userDefaults.set(1, forKey: CArrowNoteStartStyleKey)
  984. } else if innerValueString == "closedArrow" {
  985. userDefaults.set(2, forKey: CArrowNoteStartStyleKey)
  986. } else if innerValueString == "square" {
  987. userDefaults.set(3, forKey: CArrowNoteStartStyleKey)
  988. } else if innerValueString == "circle" {
  989. userDefaults.set(4, forKey: CArrowNoteStartStyleKey)
  990. } else if innerValueString == "diamond" {
  991. userDefaults.set(5, forKey: CArrowNoteStartStyleKey)
  992. }
  993. } else if innerKey == "tailLineType" {
  994. let innerValueString = innerValue as? String ?? ""
  995. if innerValueString == "none" {
  996. userDefaults.set(0, forKey: CArrowNoteEndStyleKey)
  997. } else if innerValueString == "openArrow" {
  998. userDefaults.set(1, forKey: CArrowNoteEndStyleKey)
  999. } else if innerValueString == "closedArrow" {
  1000. userDefaults.set(2, forKey: CArrowNoteEndStyleKey)
  1001. } else if innerValueString == "square" {
  1002. userDefaults.set(3, forKey: CArrowNoteEndStyleKey)
  1003. } else if innerValueString == "circle" {
  1004. userDefaults.set(4, forKey: CArrowNoteEndStyleKey)
  1005. } else if innerValueString == "diamond" {
  1006. userDefaults.set(5, forKey: CArrowNoteEndStyleKey)
  1007. }
  1008. }
  1009. }
  1010. }
  1011. } else if key == "freeText" {
  1012. if let innerDict = value as? [String: Any] {
  1013. var isBold = false
  1014. var isItalic = false
  1015. var baseName = ""
  1016. for (innerKey, innerValue) in innerDict {
  1017. if innerKey == "fontColor" {
  1018. let string = innerValue as? String ?? ""
  1019. let color = UserDefaults.colorWithHexString(string)
  1020. userDefaults.setPDFListViewColor(color, forKey: CFreeTextNoteFontColorKey)
  1021. } else if innerKey == "fontColorAlpha" {
  1022. let opacity = innerValue as? CGFloat ?? 10
  1023. userDefaults.set(opacity / 255.0, forKey: CFreeTextNoteOpacityKey)
  1024. } else if innerKey == "fontSize" {
  1025. let fontSize = innerValue as? CGFloat ?? 10
  1026. userDefaults.set(fontSize, forKey: CFreeTextNoteFontSizeKey)
  1027. } else if innerKey == "isBold" {
  1028. isBold = innerValue as? Bool ?? false
  1029. } else if innerKey == "isItalic" {
  1030. isItalic = innerValue as? Bool ?? false
  1031. } else if innerKey == "alignment" {
  1032. let string = innerValue as? String ?? ""
  1033. if string == "left" {
  1034. userDefaults.set(0, forKey: CFreeTextNoteAlignmentKey)
  1035. } else if string == "center" {
  1036. userDefaults.set(1, forKey: CFreeTextNoteAlignmentKey)
  1037. } else if string == "right" {
  1038. userDefaults.set(2, forKey: CFreeTextNoteAlignmentKey)
  1039. }
  1040. } else if innerKey == "typeface" {
  1041. baseName = innerValue as? String ?? "Helvetica"
  1042. }
  1043. }
  1044. let constructName = CPDFJSONDataParse.constructionFontName(BaseName: baseName, isBold: isBold, isItalic: isItalic)
  1045. userDefaults.set(baseName, forKey: CFreeTextNoteFontFamilyNameKey)
  1046. userDefaults.set(constructName, forKey: CFreeTextNoteFontNewStyleKey)
  1047. }
  1048. }
  1049. }
  1050. userDefaults.synchronize()
  1051. }
  1052. class func constructionFontName(BaseName baseName: String, isBold: Bool, isItalic: Bool) -> String {
  1053. var result: String = ""
  1054. if baseName.range(of: "Times") != nil {
  1055. if isBold || isItalic {
  1056. if isBold && isItalic {
  1057. return "BoldItalic"
  1058. }
  1059. if isBold {
  1060. return "Bold"
  1061. }
  1062. if isItalic {
  1063. return "Italic"
  1064. }
  1065. } else {
  1066. return "Roman"
  1067. }
  1068. }
  1069. if isBold || isItalic {
  1070. if isBold {
  1071. result = "Bold"
  1072. }
  1073. if isItalic {
  1074. result = "Oblique"
  1075. }
  1076. } else {
  1077. return ""
  1078. }
  1079. return result
  1080. }
  1081. }