KMPrintPresenter.swift 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165
  1. //
  2. // KMPrintPresenter.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by lizhe on 2022/12/21.
  6. //
  7. import Cocoa
  8. import PDFKit
  9. //MARK: CPDFKit page 方法无法使用 暂时使用系统方法
  10. class KMPrintPresenter: NSObject {
  11. lazy var printData: KMPrintModel = KMPrintModel() {
  12. didSet {
  13. self.reloadData()
  14. }
  15. }
  16. var password: String = ""
  17. var document: CPDFDocument?
  18. fileprivate weak var delegate: KMPrintPresenterDeleage?
  19. /**
  20. 初始化presenter 绑定数据
  21. */
  22. func initPresenter(delegate: KMPrintPresenterDeleage, data: KMPrintModel, document: CPDFDocument) {
  23. self.delegate = delegate
  24. self.document = document
  25. self.printData = data
  26. // DispatchQueue.main.async {
  27. // let pdfDocument = self.updatePrintDocument(documentURL: document.documentURL, data: self.printData)
  28. // self.printData.url = pdfDocument.documentURL
  29. // }
  30. }
  31. /**
  32. 刷新数据
  33. */
  34. func reloadData() {
  35. guard let document = document else { return }
  36. let pdfDocument = self.updatePrintDocument(documentURL: document.documentURL, data: self.printData)
  37. self.printData.url = pdfDocument.documentURL
  38. }
  39. /**
  40. @abstract 解除绑定
  41. */
  42. func free() {
  43. delegate = nil
  44. }
  45. }
  46. protocol KMPrintPresenterDeleage: NSObject {
  47. func showData(presenter: KMPrintPresenter, document: CPDFDocument)
  48. }
  49. protocol KMPrintPresenterDocument: NSObject {}
  50. extension KMPrintPresenter: KMPrintPresenterDocument {
  51. /**
  52. @abstract 获取打印document
  53. @param url 源文件url
  54. @param data 数据
  55. @retrun document
  56. */
  57. func updatePrintDocument(documentURL: URL, data: KMPrintModel) -> CPDFDocument {
  58. // 获取基本参数
  59. let printModel: KMPrintModel = data
  60. //获取总page
  61. let pages = self.fetchPages(documentURL, printModel.page)
  62. //绘制PDF
  63. let filePath = self.drawPages(nil, printModel, pages)
  64. let result = CPDFDocument(url: URL(fileURLWithPath: filePath))!
  65. if self.delegate != nil {
  66. self.delegate?.showData(presenter: self, document: result)
  67. }
  68. KMPrint("保存地址" + filePath)
  69. return result
  70. }
  71. /**
  72. @abstract 插入page
  73. @param paperSet 纸张设置
  74. @param pageSet page设置
  75. @param pages page数组
  76. */
  77. func drawPages(_ toFilePath: String?,
  78. _ printModel: KMPrintModel,
  79. _ pages: [KMPrintDrawPage]) -> String {
  80. /**
  81. 参数
  82. */
  83. //纸张大小
  84. let paperSize: CGSize = self.fetchPaperSize(printModel.paper)
  85. //总页数
  86. let paperCount: Int = self.fetchTotalPaperCount(paperSize, pages, printModel.page)
  87. //每页page数
  88. let pageOfPaperCount: Int = self.fetchPageOfPaper(printModel.page)
  89. //获取每张纸的page
  90. let drawPages: [[KMPrintDrawPage]] = self.fetchDrawPages(paperSize, printModel.page, paperCount, pageOfPaperCount, pages)
  91. //导出地址
  92. let filePath = KMPrintPresenter.fetchSaveFilePath(toFilePath)
  93. /**
  94. 绘制每张纸的内容
  95. */
  96. //创建画布
  97. let context: CGContext = self.createContext(filePath, paperSize)
  98. for drawPage in drawPages {
  99. context.beginPDFPage(nil)
  100. self.drawPageToContext(context, drawPage, printModel)
  101. context.endPDFPage()
  102. }
  103. context.closePDF()
  104. return filePath
  105. }
  106. /**
  107. 获取绘制的pages
  108. @pageModel page参数
  109. @param paperCount 纸张数量
  110. @param pageOfPaperCount 每张纸的page数量
  111. @param pages 所有page数量
  112. */
  113. func fetchDrawPages(_ paperSize: CGSize, _ pageModel: KMPrintPageModel,_ paperCount: Int, _ pageOfPaperCount: Int, _ pages: [KMPrintDrawPage]) -> [[KMPrintDrawPage]] {
  114. guard pages.count != 0 else {
  115. return []
  116. }
  117. //一个page重复获取次数
  118. var pageRepetitionCount = 1
  119. if (pageModel.operation.type == .poster) {
  120. if (pageModel.operation.poster.type == .tile) {
  121. pageRepetitionCount = Int(pageModel.operation.poster.tilePoint.x * pageModel.operation.poster.tilePoint.y)
  122. } else if (pageModel.operation.poster.type == .breakUp) {
  123. pageRepetitionCount = Int(pageModel.operation.pageOfPaper.point.x * pageModel.operation.pageOfPaper.point.y)
  124. }
  125. }
  126. var drawPages:[[KMPrintDrawPage]] = []
  127. for i in 0..<paperCount {
  128. //获取多页page
  129. var tempPags: [KMPrintDrawPage] = []
  130. if pageModel.operation.type == .pamphlet {
  131. var currentPage = i
  132. var pageCount = paperCount
  133. if pageModel.operation.pamphlet.type == .onlyBack {
  134. currentPage = currentPage * 2 + 1
  135. pageCount = pageCount * 2
  136. } else if pageModel.operation.pamphlet.type == .onlyPositive {
  137. currentPage = currentPage * 2
  138. pageCount = pageCount * 2
  139. }
  140. let count = pageCount * pageOfPaperCount
  141. let pagesCount = pages.count
  142. var page = KMPrintDrawPage()
  143. var page2 = KMPrintDrawPage()
  144. //第一页
  145. let index = count - (currentPage + 1)
  146. if index < pagesCount {
  147. page = pages[index]
  148. }
  149. //第二页
  150. let index2 = currentPage
  151. if index2 < pagesCount && index2 >= 0 {
  152. page2 = pages[index2]
  153. }
  154. if currentPage % 2 != 0 {
  155. let temp = page2
  156. page2 = page
  157. page = temp
  158. }
  159. if pageModel.operation.pamphlet.bookbindingType == .left ||
  160. pageModel.operation.pamphlet.bookbindingType == .leftHigh {
  161. } else {
  162. let temp = page2
  163. page2 = page
  164. page = temp
  165. }
  166. let pageCropRect = self.fetchPageCropRect(paperSize,i % pageRepetitionCount, pageModel, page)
  167. let pageShowRect = pageCropRect
  168. page.cropRect = pageCropRect
  169. page.showRect = pageShowRect
  170. tempPags.append(page)
  171. let pageCropRect2 = self.fetchPageCropRect(paperSize,i % pageRepetitionCount, pageModel, page2)
  172. let pageShowRect2 = pageCropRect
  173. page2.cropRect = pageCropRect2
  174. page2.showRect = pageShowRect2
  175. tempPags.append(page2)
  176. drawPages.append(tempPags)
  177. } else {
  178. for j in 0..<pageOfPaperCount {
  179. let pageIndex = i / pageRepetitionCount
  180. if (pageIndex * pageOfPaperCount + j < pages.count) {
  181. let originDrawPage = (pages[pageIndex * pageOfPaperCount + j])
  182. let drawPage = KMPrintDrawPage()
  183. drawPage.page = originDrawPage.page
  184. var pageCropRect = self.fetchPageCropRect(paperSize,i % pageRepetitionCount, pageModel, drawPage)
  185. var pageShowRect = pageCropRect
  186. if (pageModel.operation.type == .poster) {
  187. if (pageModel.operation.poster.type == .tile) {
  188. pageShowRect = self.fetchPageShowRect(paperSize, i % pageRepetitionCount, pageModel, drawPage)
  189. } else if (pageModel.operation.poster.type == .breakUp) {
  190. pageShowRect = pageCropRect
  191. }
  192. }
  193. drawPage.cropRect = pageCropRect
  194. drawPage.showRect = pageShowRect
  195. tempPags.append(drawPage)
  196. }
  197. }
  198. drawPages.append(tempPags)
  199. }
  200. }
  201. return drawPages
  202. }
  203. /**
  204. 获取pages
  205. @param type 页面类型
  206. @param contentType annoation类型
  207. @param selectPages 当type 为custom时 传入选中page的下标
  208. */
  209. static func fetchSaveFilePath(_ filePath: String?) -> String {
  210. var saveFilePath = filePath ?? ""
  211. if saveFilePath.count == 0 {
  212. saveFilePath = NSTemporaryDirectory() + "/PDFReaderProTest/test2.pdf"
  213. }
  214. if !FileManager.default.fileExists(atPath: NSTemporaryDirectory() + "/PDFReaderProTest") {
  215. try?FileManager.default.createDirectory(atPath: NSTemporaryDirectory() + "/PDFReaderProTest", withIntermediateDirectories: true)
  216. }
  217. if FileManager.default.fileExists(atPath: saveFilePath) {
  218. try?FileManager.default.removeItem(atPath: saveFilePath)
  219. }
  220. return saveFilePath
  221. }
  222. /**
  223. 获取pages
  224. @param type 页面类型
  225. @param contentType annoation类型
  226. @param selectPages 当type 为custom时 传入选中page的下标
  227. */
  228. static func creatDocument(_ url: URL) -> CPDFDocument {
  229. if FileManager.default.fileExists(atPath: NSTemporaryDirectory() + "/PDFReaderProTest") {
  230. try?FileManager.default.createDirectory(atPath: NSTemporaryDirectory() + "/PDFReaderProTest", withIntermediateDirectories: true)
  231. }
  232. let document = CPDFDocument(url: url)!
  233. // document.importPages(IndexSet(integer: 0), from: document, at: 0)
  234. let count = document.pageCount
  235. for _ in 0...(count - 1) {
  236. document.removePage(at: 0)
  237. }
  238. return document
  239. }
  240. /**
  241. 获取pages
  242. @param type 页面类型
  243. @param contentType annoation类型
  244. @param selectPages 当type 为custom时 传入选中page的下标
  245. */
  246. func fetchPages(_ documentURL: URL, _ pageModel: KMPrintPageModel) -> [KMPrintDrawPage] {
  247. let document = PDFDocument.init(url: documentURL)!
  248. document.unlock(withPassword: password)
  249. var pageIndexs: [Int] = []
  250. let range = pageModel.range
  251. let contentType = pageModel.contentType
  252. let reversePrintOrder = range.reversePrintOrder
  253. switch range.type {
  254. case .allPage:
  255. for index in 0...document.pageCount - 1 {
  256. pageIndexs.append(index)
  257. }
  258. case .evenPage:
  259. for index in 0...document.pageCount - 1 {
  260. if index % 2 == 0 {
  261. pageIndexs.append(index)
  262. }
  263. }
  264. case .oddPage:
  265. for index in 0...document.pageCount - 1 {
  266. if index % 2 != 0 {
  267. pageIndexs.append(index)
  268. }
  269. }
  270. case .currentPage:
  271. pageIndexs.append(0)
  272. case .custom:
  273. pageIndexs.append(0)
  274. default:
  275. pageIndexs.append(0)
  276. }
  277. var pagesArray: [KMPrintDrawPage] = []
  278. for index in pageIndexs {
  279. let page = document.page(at: index)!
  280. let drawPage = KMPrintDrawPage()
  281. drawPage.page = page
  282. self.dealPageContent(contentType, [drawPage])
  283. if reversePrintOrder {
  284. pagesArray.insert(drawPage, at: 0)
  285. } else {
  286. pagesArray.append(drawPage)
  287. }
  288. }
  289. return pagesArray
  290. }
  291. /**
  292. 处理page annoation 内容
  293. @param contentType annoation类型
  294. @param pages page
  295. */
  296. func dealPageContent (_ contentType: KMPrintContentType, _ pages: [KMPrintDrawPage]) -> Void {
  297. for page in pages {
  298. let annoations: [PDFAnnotation] = page.page.annotations
  299. //内容处理
  300. switch contentType {
  301. case .document:
  302. for annoation in annoations {
  303. annoation.page!.removeAnnotation(annoation)
  304. }
  305. case .documentAndStamp:
  306. for annoation in annoations {
  307. if !self.isAnnoationStamp(type: annoation.type!) {
  308. annoation.page!.removeAnnotation(annoation)
  309. }
  310. }
  311. case .documentAndMarkup:
  312. for annoation in annoations {
  313. if !self.isAnnoationMarkup(type: annoation.type!) {
  314. annoation.page!.removeAnnotation(annoation)
  315. }
  316. }
  317. case .documentAndForm:
  318. for annoation in annoations {
  319. if !self.isAnnoationForm(type: annoation.type!) {
  320. annoation.page!.removeAnnotation(annoation)
  321. }
  322. }
  323. default:
  324. KMPrint("未找到")
  325. break
  326. }
  327. }
  328. }
  329. /**
  330. @abstract 获取context
  331. @param size纸张大小
  332. */
  333. func createContext(_ saveFilePath: String, _ size: CGSize) -> CGContext {
  334. var mediaBox: CGRect = NSMakeRect(0, 0, size.width, size.height)
  335. let url = CFURLCreateWithFileSystemPath(nil, saveFilePath as CFString, .cfurlposixPathStyle, false)
  336. let content: CGContext = CGContext.init(url!, mediaBox: &mediaBox, nil)!
  337. return content
  338. }
  339. /**
  340. @abstract 绘制page
  341. @param context
  342. @pages page数组 [CPDFPage]
  343. */
  344. func drawPageToContext(_ context: CGContext, _ pages: [KMPrintDrawPage], _ data: KMPrintModel, _ drawPageRect: CGRect = NSZeroRect) {
  345. //左下角有坐标系原点
  346. /**
  347. paper
  348. */
  349. let paperSize: CGSize = self.fetchPaperSize(data.paper)//纸张大小
  350. let paperItemSize: CGSize = self.fetchPaperItemSize(data.paper) //页面paper大小(去除边框)
  351. let paperInset: NSEdgeInsets = data.paper.info.inset //绘制paper大小
  352. let border: Bool = data.page.operation.multipage.isBorder //是否存在边框
  353. /**
  354. page
  355. */
  356. let pageOrder: KMPrintPageOperation.Multipage.Order = .horizontal //页面顺序
  357. let pageSize: CGSize = self.fetchPageItemSize(data.page, paperItemSize) //page大小
  358. let showModel: KMPrintPageOperation.Size = self.fetchShowModel(data.page)
  359. let autoRotate = self.fetchAutoRotate(data.page)
  360. let autoSize: Bool = self.fetchAutoSize(data.page)
  361. //行列
  362. let columnAndRow = self.fetchPageColumnAndRow(data.page) //行 列数量
  363. let columnAndRowSpace = CGPoint(x: data.page.operation.multipage.lineSpacing, y: data.page.operation.multipage.columnsSpacing) //行 列之间的空间
  364. for i in 0..<Int(columnAndRow.x) {
  365. for j in 0..<(Int(columnAndRow.y)) {
  366. let index = j + i * Int(columnAndRow.y)
  367. if index < pages.count {
  368. //参数
  369. let page: KMPrintDrawPage = pages[index]
  370. let rect = page.showRect
  371. //裁剪当前Page
  372. page.page.setBounds(page.cropRect, for: .cropBox)
  373. let pageItemSize = rect.size
  374. let rotate = page.page.rotation
  375. var scale = self.fetchPageScale(page, pageSize, autoRotate, autoSize)
  376. if data.page.operation.type == .size {
  377. if showModel.model == .custom {
  378. scale *= showModel.scale
  379. } else if showModel.model == .full {
  380. scale = 1
  381. }
  382. } else if (data.page.operation.type == .poster) {
  383. if (data.page.operation.poster.type == .tile) {
  384. scale = data.page.operation.poster.scale
  385. }
  386. } else if (data.page.operation.type == .pamphlet) {
  387. let margin = data.page.operation.pamphlet.margin
  388. let tempSize = CGSizeMake((pageSize.width - margin) / 2, pageSize.height)
  389. scale = min(tempSize.width / pageSize.width, tempSize.height / pageSize.height)
  390. }
  391. //当前item的自身中心点
  392. let center = CGPoint(x: (pageSize.width - pageItemSize.width * scale) / 2.0 ,
  393. y: (pageSize.height - pageItemSize.height * scale) / 2.0)
  394. var origin = rect.origin
  395. //多页Page自动旋转
  396. // if autoSize {
  397. switch pageOrder {
  398. case .horizontal:
  399. origin.x = (pageSize.width + columnAndRowSpace.x) * CGFloat(i) + paperInset.left + center.x
  400. //页面内容高度 + 下边的行间距 - 第几个cell的高度 +居中
  401. origin.y = paperSize.height - (pageSize.height + columnAndRowSpace.y) * (CGFloat(j) + 1) + center.y + columnAndRowSpace.y
  402. case .horizontalReverseSequence:
  403. origin.x = paperSize.width - (pageSize.width + columnAndRowSpace.x) * (CGFloat(i) + 1) + center.x + columnAndRowSpace.x
  404. origin.y = paperSize.height - (pageSize.height + columnAndRowSpace.y) * (CGFloat(j) + 1) + center.y + paperInset.bottom + columnAndRowSpace.y
  405. case .vertical:
  406. origin.x = (pageSize.width + columnAndRowSpace.x) * CGFloat(i) + paperInset.left + center.x
  407. origin.y = paperSize.height - (pageSize.height + columnAndRowSpace.y) * (CGFloat(j) + 1) + center.y + paperInset.bottom + columnAndRowSpace.y
  408. case .verticalReverseSequence:
  409. origin.x = paperSize.width - (pageSize.width + columnAndRowSpace.x) * (CGFloat(i) + 1) + center.x + columnAndRowSpace.x
  410. origin.y = paperSize.height - (pageSize.height + columnAndRowSpace.y) * (CGFloat(j) + 1) + center.y + paperInset.bottom + columnAndRowSpace.y
  411. default:
  412. KMPrint("未找到")
  413. break
  414. }
  415. // }
  416. NSGraphicsContext.current = NSGraphicsContext(cgContext: context, flipped: false)
  417. NSGraphicsContext.saveGraphicsState()
  418. //平移
  419. context.translateBy(x: origin.x, y: origin.y)
  420. //缩放
  421. context.scaleBy(x: CGFloat(scale), y: CGFloat(scale))
  422. page.page.draw(with: PDFDisplayBox.cropBox, to: context)
  423. page.page.transform(context, for: PDFDisplayBox.cropBox)
  424. if border {
  425. var dirtyRect = rect
  426. //CGRectMake(origin.x, origin.y, 100, 100)
  427. if rotate == 90 ||
  428. rotate == 270 {
  429. dirtyRect = NSMakeRect(dirtyRect.origin.x, dirtyRect.origin.y, dirtyRect.size.height, dirtyRect.size.width)
  430. }
  431. context.addRect(dirtyRect)
  432. context.setStrokeColor(red: 0, green: 0, blue: 0, alpha: 1.0)
  433. context.strokePath()
  434. }
  435. NSGraphicsContext.restoreGraphicsState()
  436. // page.setBounds(NSRect(x: 0, y: 0, width: pageRect.size.width, height: pageRect.size.height), for: .cropBox)
  437. }
  438. }
  439. }
  440. }
  441. func drawLabelTextContextSize(context: CGContext) {
  442. let pageSize = CGSize(width: 0, height: 0)
  443. let KBlankA4W = pageSize.width
  444. let KBlankA4H = pageSize.height
  445. var contextString: String
  446. // if let labelString = PDFPrint.labelString, !labelString.isEmpty {
  447. // contextString = labelString
  448. // } else {
  449. let date = Date()
  450. let formatter = DateFormatter()
  451. formatter.dateFormat = "YYYY-MM-dd hh:mm:ss"
  452. contextString = "(\("1"),\("1")) \("filePath.lastPathComponent") \(formatter.string(from: date))"
  453. // }
  454. let fontSize = 12.0 * (max(KBlankA4W, KBlankA4H) / 842)
  455. let font = NSFont.systemFont(ofSize: fontSize)
  456. let color = NSColor.black
  457. var size = NSSize.zero
  458. var style = NSMutableParagraphStyle()
  459. style.alignment = .center
  460. style.lineBreakMode = .byCharWrapping
  461. var attributes = [NSAttributedString.Key: Any]()
  462. attributes[.paragraphStyle] = style
  463. attributes[.foregroundColor] = color
  464. attributes[.font] = font
  465. size = contextString.boundingRect(with: CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude),
  466. options: [.usesLineFragmentOrigin, .usesFontLeading],
  467. attributes: attributes).size
  468. // if PDFPrint.splitType == .pageNumber {
  469. contextString.draw(in: CGRect(x: 10 + 10,
  470. y: KBlankA4H - 10 + size.height,
  471. width: size.width, height: size.height),
  472. withAttributes: attributes)
  473. // } else {
  474. // contextString.draw(in: CGRect(x: PDFPrint.edgeInsets.left + 10,
  475. // y: KBlankA4H - PDFPrint.edgeInsets.top + size.height,
  476. // width: size.width, height: size.height),
  477. // withAttributes: attributes)
  478. // }
  479. }
  480. }
  481. protocol KMPrintPresenterPage {}
  482. extension KMPrintPresenter: KMPrintPresenterPage {
  483. /**
  484. 获取pages
  485. @param type 页面类型
  486. @param contentType annoation类型
  487. @param selectPages 当type 为custom时 传入选中page的下标
  488. */
  489. func fetchPageCropRect(_ paperSize: CGSize, _ index: Int, _ pageModel: KMPrintPageModel, _ page: KMPrintDrawPage) -> CGRect {
  490. var newRect = page.page.bounds(for: .cropBox)
  491. if (pageModel.operation.type == .poster) {
  492. let originSize = newRect.size
  493. var cropPoint = CGPoint(x: 1, y: 1)
  494. var scale = 1.0
  495. if (pageModel.operation.poster.type == .tile) {
  496. cropPoint = pageModel.operation.poster.tilePoint
  497. // scale = pageModel.operation.poster.scale
  498. } else if (pageModel.operation.poster.type == .breakUp) {
  499. cropPoint = pageModel.operation.pageOfPaper.point
  500. }
  501. let width = originSize.width / cropPoint.x
  502. let height = originSize.height / cropPoint.y
  503. let column: Int = Int(cropPoint.x) //行
  504. let row: Int = Int(cropPoint.y) //列
  505. for i in 0...column - 1 {
  506. for j in 0...row - 1 {
  507. if i + j + i * (row - 1) == index {
  508. newRect.origin.x = CGFloat(i) * width * scale
  509. newRect.origin.y = ((originSize.height - CGFloat(j) * height - height)) * scale
  510. newRect.size.width = width * scale
  511. newRect.size.height = height * scale
  512. return newRect
  513. }
  514. }
  515. }
  516. }
  517. return newRect
  518. }
  519. func fetchPageShowRect(_ paperSize: CGSize, _ index: Int, _ pageModel: KMPrintPageModel, _ page: KMPrintDrawPage) -> CGRect {
  520. var newRect = NSZeroRect
  521. var pageRect = CGRect(x: 0, y: 0, width: paperSize.width, height: paperSize.height)
  522. if (pageModel.operation.type == .poster) {
  523. let pageSize = page.page.bounds(for: .cropBox)
  524. var cropPoint = CGPoint(x: 1, y: 1)
  525. var scale = 1.0
  526. if (pageModel.operation.poster.type == .tile) {
  527. cropPoint = pageModel.operation.poster.tilePoint
  528. scale = pageModel.operation.poster.scale
  529. } else if (pageModel.operation.poster.type == .breakUp) {
  530. cropPoint = pageModel.operation.pageOfPaper.point
  531. }
  532. if (cropPoint.x == 1 && cropPoint.y == 1) {
  533. } else {
  534. let originPaperSize = CGSize(width: paperSize.width * cropPoint.x, height: paperSize.height * cropPoint.y)
  535. let pageWidth = pageSize.width * scale
  536. let pageHeight = pageSize.height * scale
  537. let pageOrigin = CGPoint(x: (originPaperSize.width - pageWidth) / 2, y: (originPaperSize.height - pageHeight) / 2)
  538. let width = originPaperSize.width / cropPoint.x
  539. let height = originPaperSize.height / cropPoint.y
  540. let column: Int = Int(cropPoint.x) //行
  541. let row: Int = Int(cropPoint.y) //列
  542. for i in 0...column - 1 {
  543. for j in 0...row - 1 {
  544. if i + j + i * (row - 1) == index {
  545. newRect.origin.x = CGFloat(i) * width
  546. newRect.origin.y = ((originPaperSize.height - CGFloat(j) * height - height))
  547. newRect.size.width = width
  548. newRect.size.height = height
  549. if (pageOrigin.x > newRect.origin.x) {
  550. pageRect.origin.x = pageOrigin.x
  551. pageRect.size.width = newRect.size.width - pageOrigin.x
  552. } else if (originPaperSize.width - pageOrigin.x > newRect.origin.x) {
  553. pageRect.origin.x = 0
  554. pageRect.size.width = newRect.size.width - pageOrigin.x
  555. } else {
  556. pageRect.origin.x = 0
  557. pageRect.size.width = newRect.size.width
  558. }
  559. if (originPaperSize.height - pageOrigin.y < newRect.origin.y + newRect.size.height) {
  560. pageRect.origin.y = 0
  561. pageRect.size.height = newRect.size.height - pageOrigin.y
  562. } else if (pageOrigin.y > newRect.origin.y) {
  563. pageRect.origin.y = pageOrigin.y
  564. pageRect.size.height = newRect.size.height - pageOrigin.y
  565. } else {
  566. pageRect.origin.y = newRect.origin.y - pageOrigin.y
  567. pageRect.size.height = newRect.size.height
  568. }
  569. return pageRect
  570. }
  571. }
  572. }
  573. }
  574. }
  575. return pageRect
  576. }
  577. func fetchPageColumnAndRow(_ pageModel: KMPrintPageModel) -> CGPoint {
  578. var point = NSZeroPoint
  579. let pageOrder: KMPrintPageOperation.Multipage.Order = pageModel.operation.multipage.orderType //页面顺序
  580. switch pageModel.operation.type {
  581. case .multipage:
  582. point.x = pageModel.operation.pageOfPaper.point.x
  583. point.y = pageModel.operation.pageOfPaper.point.y
  584. case .pamphlet:
  585. point.x = 1
  586. point.y = 2
  587. default:
  588. point.x = 1
  589. point.y = 1
  590. }
  591. //如果是横向参数需切换
  592. if pageOrder == .horizontal ||
  593. pageOrder == .horizontalReverseSequence {
  594. let temp = point.x
  595. point.x = point.y
  596. point.y = temp
  597. }
  598. return point
  599. }
  600. func fetchAutoRotate(_ pageModel: KMPrintPageModel) -> Bool {
  601. var autoRotate = false
  602. switch pageModel.operation.type {
  603. case .multipage:
  604. autoRotate = pageModel.operation.isAutoRotate
  605. case .pamphlet:
  606. autoRotate = pageModel.operation.isAutoRotate
  607. default:
  608. autoRotate = false
  609. }
  610. return autoRotate
  611. }
  612. func fetchAutoSize(_ pageModel: KMPrintPageModel) -> Bool {
  613. var autoSize = false
  614. switch pageModel.operation.type {
  615. case .size:
  616. autoSize = true
  617. default:
  618. autoSize = false
  619. }
  620. return autoSize
  621. }
  622. func fetchShowModel(_ pageModel: KMPrintPageModel) -> KMPrintPageOperation.Size {
  623. var model = KMPrintPageOperation.Size()
  624. switch pageModel.operation.type {
  625. case .size:
  626. model = pageModel.operation.size
  627. default:
  628. model = KMPrintPageOperation.Size()
  629. }
  630. return model
  631. }
  632. func fetchPageItemSize(_ pageModel: KMPrintPageModel, _ paperSize: CGSize) -> CGSize {
  633. var size = NSZeroSize
  634. let columnAndRow = self.fetchPageColumnAndRow(pageModel) //行 列数量
  635. let lineSpacing = pageModel.operation.multipage.lineSpacing
  636. let columnsSpacing = pageModel.operation.multipage.columnsSpacing
  637. let columnAndRowSpace = CGPoint(x: lineSpacing, y: columnsSpacing) //行 列之间的空间
  638. //page大小
  639. if pageModel.operation.type == .multipage {
  640. size = CGSize(width: (paperSize.width - CGFloat((columnAndRow.x - 1)) * CGFloat(columnAndRowSpace.x)) / columnAndRow.x,
  641. height: (paperSize.height - CGFloat((columnAndRow.y - 1)) * CGFloat(columnAndRowSpace.y)) / columnAndRow.y)
  642. } else {
  643. size = CGSize(width: (paperSize.width - CGFloat((columnAndRow.x - 1)) * CGFloat(columnAndRowSpace.x)) / columnAndRow.x,
  644. height: (paperSize.height - CGFloat((columnAndRow.y - 1)) * CGFloat(columnAndRowSpace.y)) / columnAndRow.y)
  645. }
  646. return size
  647. }
  648. func fetchPageScale(_ page: KMPrintDrawPage, _ pageItemSize: CGSize, _ autoRotate: Bool, _ autoSize: Bool) -> CGFloat {
  649. var scale = 1.0
  650. let originSize = page.page.bounds(for: .cropBox)
  651. var rotate = page.page.rotation
  652. //取出page横竖时能显示的最大Rect
  653. if autoRotate {
  654. //page旋转度数为0度或者180度时,在指定的大小内,能显示的比例
  655. let scale1 = min(pageItemSize.width / originSize.width, pageItemSize.height / originSize.height)
  656. //page旋转度数为90度或者270度时,在指定的大小内,能显示的比例
  657. let scale2 = min(pageItemSize.width / originSize.height, pageItemSize.height / originSize.width)
  658. scale = max(scale1, scale2)
  659. if scale1 > scale2 {
  660. //高为竖直排列时,显示最大,则需将page时90度或者270度需要进行旋转
  661. if rotate == 90 || rotate == 270 {
  662. rotate = rotate - 90
  663. }
  664. } else {
  665. //宽为竖直排列时,显示最大,则需将page时0度或者180度需要进行旋转
  666. if rotate == 0 || rotate == 180 {
  667. rotate = rotate - 90
  668. }
  669. }
  670. } else {
  671. scale = min(pageItemSize.width / originSize.width, pageItemSize.height / originSize.height)
  672. }
  673. if (autoSize) {
  674. } else {
  675. scale = min(scale, 1)
  676. }
  677. return scale
  678. }
  679. func fetchPageRotate(_ page: KMPrintDrawPage, _ pageItemSize: CGSize, _ autoRotate: Bool) -> CGFloat {
  680. var scale = 1.0
  681. let originSize = page.page.bounds(for: .cropBox)
  682. var rotate = page.page.rotation
  683. //取出page横竖时能显示的最大Rect
  684. if autoRotate {
  685. //page旋转度数为0度或者180度时,在指定的大小内,能显示的比例
  686. let scale1 = min(pageItemSize.width / originSize.width, pageItemSize.height / originSize.height)
  687. //page旋转度数为90度或者270度时,在指定的大小内,能显示的比例
  688. let scale2 = min(pageItemSize.width / originSize.height, pageItemSize.height / originSize.width)
  689. scale = max(scale1, scale2)
  690. if scale1 > scale2 {
  691. //高为竖直排列时,显示最大,则需将page时90度或者270度需要进行旋转
  692. if rotate == 90 || rotate == 270 {
  693. rotate = rotate - 90
  694. }
  695. } else {
  696. //宽为竖直排列时,显示最大,则需将page时0度或者180度需要进行旋转
  697. if rotate == 0 || rotate == 180 {
  698. rotate = rotate - 90
  699. }
  700. }
  701. } else {
  702. scale = min(pageItemSize.width / originSize.width, pageItemSize.height / originSize.height)
  703. }
  704. return scale
  705. }
  706. func fetchPageLite(pageModel: KMPrintPageModel) {
  707. }
  708. }
  709. protocol KMPrintPresenterPaper {}
  710. extension KMPrintPresenter: KMPrintPresenterPaper {
  711. /**
  712. 获取每张纸的page
  713. @param type 页面类型
  714. @param contentType annoation类型
  715. @param selectPages 当type 为custom时 传入选中page的下标
  716. */
  717. func fetchPageOfPaper(_ pageModel: KMPrintPageModel) -> Int {
  718. var count = 1
  719. switch pageModel.operation.type {
  720. case .multipage:
  721. count = Int(pageModel.operation.pageOfPaper.point.x * pageModel.operation.pageOfPaper.point.y)
  722. case .poster:
  723. count = Int(pageModel.operation.pageOfPaper.point.x * pageModel.operation.pageOfPaper.point.y)
  724. case .pamphlet:
  725. count = 2
  726. default:
  727. count = 1
  728. }
  729. return count
  730. }
  731. /**
  732. 获取总纸张数
  733. @param pages page总数
  734. @param contentType annoation类型
  735. @param selectPages 当type 为custom时 传入选中page的下标
  736. */
  737. func fetchTotalPaperCount (_ paperSize: CGSize, _ pages: [KMPrintDrawPage], _ pageModel: KMPrintPageModel) -> Int {
  738. var count = 1
  739. let pageOfPaper = self.fetchPageOfPaper(pageModel)
  740. switch pageModel.operation.type {
  741. case .multipage:
  742. count = Int(ceilf(Float(pages.count / pageOfPaper)))
  743. case .poster:
  744. if (pageModel.operation.poster.type == .tile) {
  745. //1 2 4 9 16
  746. let scale = pageModel.operation.poster.scale
  747. let pageSize = pages.first?.page.bounds(for: .cropBox).size ?? paperSize
  748. let point = self.fetchPosterPageCount(paperSize: paperSize, pageSize: pageSize, scale: scale)
  749. pageModel.operation.poster.tilePoint = point
  750. count = Int((point.x * point.y)) * pages.count
  751. } else if (pageModel.operation.poster.type == .breakUp) {
  752. count = Int((pageModel.operation.pageOfPaper.point.x * pageModel.operation.pageOfPaper.point.y)) * pages.count
  753. } else {
  754. count = Int(ceilf(Float(pages.count / pageOfPaper)))
  755. }
  756. case .pamphlet: do {
  757. let temp = pages.count%4
  758. if temp == 0 {
  759. count = pages.count / 4
  760. } else {
  761. count = pages.count / 4 + 1
  762. }
  763. if pageModel.operation.pamphlet.type == .doubleSided {
  764. count = count * 2
  765. }
  766. }
  767. default:
  768. count = Int(ceilf(Float(pages.count / pageOfPaper)))
  769. }
  770. return count
  771. }
  772. func fetchPosterPageCount(paperSize: CGSize, pageSize: CGSize, scale: CGFloat) -> CGPoint {
  773. var xCount: Int = 1
  774. var yCount: Int = 1
  775. var contain: Bool = true
  776. while (contain) {
  777. if (pageSize.width * scale < CGFloat(xCount) * paperSize.width &&
  778. pageSize.height * scale < CGFloat(yCount) * paperSize.height) {
  779. contain = false
  780. break
  781. }
  782. //增加行数 和 列数
  783. if xCount == yCount {
  784. xCount += 1
  785. } else {
  786. yCount += 1
  787. }
  788. }
  789. return CGPoint(x: xCount, y: yCount)
  790. }
  791. /**
  792. 获取pages
  793. @param type 页面类型
  794. @param contentType annoation类型
  795. @param selectPages 当type 为custom时 传入选中page的下标
  796. */
  797. func fetchPaperSize(_ paperModel: KMPrintPaperModel) -> CGSize {
  798. var paperSize = KMPrintPaperInfo.KMPaperType.paperSize(type: paperModel.info.type, unit: .px)
  799. let direction = paperModel.direction
  800. if direction == .vertical {
  801. paperSize = CGSize(width: paperSize.width, height: paperSize.height)
  802. } else if direction == .horizontal {
  803. paperSize = CGSize(width: paperSize.height, height: paperSize.width)
  804. }
  805. return paperSize
  806. }
  807. func fetchPaperItemSize(_ paperModel: KMPrintPaperModel) -> CGSize {
  808. var paperSize = self.fetchPaperSize(paperModel)
  809. let paperInset = paperModel.info.inset
  810. paperSize = CGSize(width: paperSize.width - paperInset.left - paperInset.right,
  811. height: paperSize.height - paperInset.bottom - paperInset.top)
  812. return paperSize
  813. }
  814. }
  815. protocol KMPrintPresenterDraw {}
  816. extension KMPrintPresenter: KMPrintPresenterDraw {
  817. // -(void)drawCutMarkContext:(CGContextRef)context contextSize:(CGSize)size
  818. // {
  819. // CGContextSetStrokeColorWithColor(context, [NSColor blackColor].CGColor);
  820. // CGContextSetLineWidth(context, 1.0);
  821. // CGContextSetLineCap(context, kCGLineCapSquare);
  822. //
  823. // if(self.columnIndex == 1 && self.lineIndex == 1) {
  824. // [self drawLeftBottomCutMarks:context size:size];
  825. // [self drawRightTopCutMarks:context size:size];
  826. // [self drawRightBottomCutMarks:context size:size];
  827. // } else if (self.lineIndex == 1 && self.columnIndex == self.vertArray.count) {
  828. // [self drawLeftTopCutMarks:context size:size];
  829. // [self drawRightTopCutMarks:context size:size];
  830. // [self drawRightBottomCutMarks:context size:size];
  831. // } else if (self.columnIndex == 1 && self.lineIndex == self.hourArray.count) {
  832. // [self drawLeftTopCutMarks:context size:size];
  833. // [self drawLeftBottomCutMarks:context size:size];
  834. // [self drawRightBottomCutMarks:context size:size];
  835. // } else if (self.columnIndex == self.vertArray.count && self.hourArray.count == self.lineIndex) {
  836. // [self drawLeftTopCutMarks:context size:size];
  837. // [self drawLeftBottomCutMarks:context size:size];
  838. // [self drawRightTopCutMarks:context size:size];
  839. // } else {
  840. // [self drawLeftTopCutMarks:context size:size];
  841. // [self drawLeftBottomCutMarks:context size:size];
  842. // [self drawRightTopCutMarks:context size:size];
  843. // [self drawRightBottomCutMarks:context size:size];
  844. // }
  845. // //绘制完成
  846. // CGContextStrokePath(context);
  847. // }
  848. //
  849. // //左上角切割标记
  850. // -(void)drawLeftTopCutMarks:(CGContextRef)context size:(CGSize)size
  851. // {
  852. // CGFloat KBlankA4H =size.height;
  853. // CGPoint point_LeftTop = CGPointZero;
  854. //
  855. // if (self.PDFPrint.splitType == kKMPDFPosterSplitType_PageNumber) {
  856. // point_LeftTop.x = self.PDFPrint.fullPageEdgeInsets.left;
  857. // } else {
  858. // point_LeftTop.x = self.PDFPrint.edgeInsets.left;
  859. // }
  860. //
  861. // point_LeftTop.y = KBlankA4H - self.PDFPrint.edgeInsets.top;
  862. //
  863. // CGContextMoveToPoint(context, 10,point_LeftTop.y);
  864. // CGContextAddLineToPoint(context,point_LeftTop.x, point_LeftTop.y);
  865. //
  866. // CGContextMoveToPoint(context, point_LeftTop.x - 10,KBlankA4H -10);
  867. // CGContextAddLineToPoint(context,point_LeftTop.x - 10,point_LeftTop.y);
  868. // }
  869. //
  870. // //右上角切割标记
  871. // -(void)drawRightTopCutMarks:(CGContextRef)context size:(CGSize)size
  872. // {
  873. // CGFloat KBlankA4W =size.width;
  874. // CGFloat KBlankA4H =size.height;
  875. //
  876. // CGPoint point_RightTop = CGPointZero;//右上角
  877. //
  878. // if (self.PDFPrint.splitType == kKMPDFPosterSplitType_PageNumber) {
  879. // point_RightTop.x = KBlankA4W - self.PDFPrint.fullPageEdgeInsets.right;
  880. // point_RightTop.y = KBlankA4H - self.PDFPrint.fullPageEdgeInsets.top;
  881. // } else {
  882. // point_RightTop.x = KBlankA4W - self.PDFPrint.edgeInsets.right;
  883. // point_RightTop.y = KBlankA4H - self.PDFPrint.edgeInsets.top;
  884. // }
  885. //
  886. // CGContextMoveToPoint(context,point_RightTop.x,point_RightTop.y);
  887. // CGContextAddLineToPoint(context,KBlankA4W - 10,point_RightTop.y);
  888. //
  889. // CGContextMoveToPoint(context,point_RightTop.x + 10,KBlankA4H - 10);
  890. // CGContextAddLineToPoint(context,point_RightTop.x + 10,point_RightTop.y);
  891. // }
  892. //
  893. // //左下角切割标记
  894. // -(void)drawLeftBottomCutMarks:(CGContextRef)context size:(CGSize)size
  895. // {
  896. // CGPoint point_LeftBottom = CGPointZero;//左下角
  897. // if (self.PDFPrint.splitType == kKMPDFPosterSplitType_PageNumber) {
  898. // point_LeftBottom.x = self.PDFPrint.fullPageEdgeInsets.left;
  899. // point_LeftBottom.y = self.PDFPrint.fullPageEdgeInsets.bottom;
  900. // } else {
  901. // point_LeftBottom.x = self.PDFPrint.edgeInsets.left;
  902. // point_LeftBottom.y = self.PDFPrint.edgeInsets.bottom;
  903. // }
  904. //
  905. // //左下角
  906. // CGContextMoveToPoint(context, 10,point_LeftBottom.y);
  907. // CGContextAddLineToPoint(context,point_LeftBottom.x, point_LeftBottom.y);
  908. //
  909. // CGContextMoveToPoint(context, point_LeftBottom.x- 10,10);
  910. // CGContextAddLineToPoint(context,point_LeftBottom.x - 10,point_LeftBottom.y);
  911. // }
  912. //
  913. // //右下角切割标记
  914. // -(void)drawRightBottomCutMarks:(CGContextRef)context size:(CGSize)size
  915. // {
  916. // CGFloat KBlankA4W =size.width;
  917. //
  918. // CGPoint point_RightBottom = CGPointZero;//右下角
  919. // if (self.PDFPrint.splitType == kKMPDFPosterSplitType_PageNumber) {
  920. // point_RightBottom.x = KBlankA4W - self.PDFPrint.fullPageEdgeInsets.right;
  921. // point_RightBottom.y = self.PDFPrint.fullPageEdgeInsets.bottom;
  922. // } else {
  923. // point_RightBottom.x = KBlankA4W - self.PDFPrint.edgeInsets.right;
  924. // point_RightBottom.y = self.PDFPrint.edgeInsets.bottom;
  925. // }
  926. //
  927. // CGContextMoveToPoint(context,KBlankA4W - 10,point_RightBottom.y);
  928. // CGContextAddLineToPoint(context,point_RightBottom.x,point_RightBottom.y);
  929. //
  930. // CGContextMoveToPoint(context,point_RightBottom.x+ 10,10);
  931. // CGContextAddLineToPoint(context,point_RightBottom.x+ 10,point_RightBottom.y);
  932. // }
  933. func drawString(_ pageModel: KMPrintPageModel, _ contextSize: CGSize) {
  934. var string = pageModel.operation.poster.tags.first ?? ""
  935. // if string.isEmpty {
  936. // string =
  937. // }
  938. }
  939. //
  940. // - (void)drawLabelTextContextSize:(CGSize)contextSize
  941. // {
  942. // CGFloat KBlankA4W =contextSize.width;
  943. // CGFloat KBlankA4H =contextSize.height;
  944. //
  945. // NSString *contextString = nil;
  946. // if (self.PDFPrint.labelString && self.PDFPrint.labelString.length > 0) {
  947. // contextString = self.PDFPrint.labelString;
  948. // } else {
  949. // NSDate *date = [NSDate date];
  950. // NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
  951. // [formatter setDateFormat:@"YYYY-MM-dd hh:mm:ss"];
  952. // contextString = [NSString stringWithFormat:@"(%ld,%ld) %@ %@",self.columnIndex,self.lineIndex,[self.filePath lastPathComponent],[formatter stringFromDate:date]];
  953. // }
  954. //
  955. // CGFloat fontSize = 12.0 * (MAX(KBlankA4W, KBlankA4H)/842);
  956. // NSFont *font = [NSFont systemFontOfSize:fontSize];
  957. // NSColor *color = [NSColor blackColor];
  958. //
  959. // NSSize size = NSZeroSize;
  960. // NSMutableParagraphStyle *style = [[[NSMutableParagraphStyle alloc] init] autorelease];
  961. // [style setAlignment:NSCenterTextAlignment];
  962. // [style setLineBreakMode:NSLineBreakByCharWrapping];
  963. // NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
  964. // [dictionary setObject:style forKey:NSParagraphStyleAttributeName];
  965. // [dictionary setObject:color forKey:NSForegroundColorAttributeName];
  966. // [dictionary setObject:font forKey:NSFontAttributeName];
  967. // size = [contextString boundingRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT)
  968. // options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
  969. // attributes:dictionary].size;
  970. //
  971. // if (self.PDFPrint.splitType == kKMPDFPosterSplitType_PageNumber) {
  972. // [contextString drawInRect:CGRectMake(self.PDFPrint.fullPageEdgeInsets.left +10,
  973. // KBlankA4H - self.PDFPrint.fullPageEdgeInsets.top + size.height,
  974. // size.width, size.height)
  975. // withAttributes:dictionary];
  976. // } else {
  977. // [contextString drawInRect:CGRectMake(self.PDFPrint.edgeInsets.left +10,
  978. // KBlankA4H - self.PDFPrint.edgeInsets.top + size.height,
  979. // size.width, size.height)
  980. // withAttributes:dictionary];
  981. // }
  982. //
  983. // }
  984. }
  985. protocol KMPrintPresenterPrivate {}
  986. extension KMPrintPresenter: KMPrintPresenterPrivate {
  987. func isAnnoationStamp(type: String) -> Bool {
  988. let annotationStamp: [String] = ["Square", "Stamp"]
  989. return annotationStamp.contains(type)
  990. }
  991. func isAnnoationMarkup(type: String) -> Bool {
  992. let annotationStamp: [String] = ["Widget", "Freehand", "Highlight", "Underline", "Squiggly", "Circle", "StrikeOut", "Ink"]
  993. return annotationStamp.contains(type)
  994. }
  995. func isAnnoationForm(type: String) -> Bool {
  996. let annotationStamp: [String] = ["FreeText"]
  997. return annotationStamp.contains(type)
  998. }
  999. }
  1000. protocol KMPrintPresenterProtocol: NSObject {
  1001. }
  1002. ///**
  1003. // @abstract 获取context
  1004. // @param size纸张大小
  1005. // */
  1006. //func createContext(_ saveFilePath: String, size: CGSize) -> CGContext {
  1007. // let s = CGSize(width: nearbyint(size.width), height: nearbyint(size.height))
  1008. // let rep = NSBitmapImageRep.init(bitmapDataPlanes: nil,
  1009. // pixelsWide: Int(s.width),
  1010. // pixelsHigh: Int(s.height),
  1011. // bitsPerSample: 8,
  1012. // samplesPerPixel: 4,
  1013. // hasAlpha: true,
  1014. // isPlanar: false,
  1015. // colorSpaceName: NSColorSpaceName.calibratedRGB,
  1016. // bytesPerRow: 0,
  1017. // bitsPerPixel: 0)!
  1018. // let context: CGContext = NSGraphicsContext.init(bitmapImageRep: rep)!.cgContext
  1019. // return context
  1020. //}
  1021. //MARK: 渲染单页
  1022. extension KMPrintPresenter {
  1023. static func drawPage(context: CGContext, page: PDFPage, model: KMPrintModel) {
  1024. let drawPage = KMPrintDrawPage()
  1025. drawPage.page = page
  1026. drawPage.cropRect = page.bounds(for: .cropBox)
  1027. drawPage.showRect = page.bounds(for: .cropBox)
  1028. let prinsenter = KMPrintPresenter()
  1029. prinsenter.printData = model
  1030. prinsenter.drawTestPage(context, model, [drawPage])
  1031. }
  1032. func drawTestPage(_ context: CGContext,
  1033. _ printModel: KMPrintModel,
  1034. _ pages: [KMPrintDrawPage]) {
  1035. /**
  1036. 参数
  1037. */
  1038. //纸张大小
  1039. let paperSize: CGSize = self.fetchPaperSize(printModel.paper)
  1040. //总页数
  1041. let paperCount: Int = self.fetchTotalPaperCount(paperSize, pages, printModel.page)
  1042. //每页page数
  1043. let pageOfPaperCount: Int = self.fetchPageOfPaper(printModel.page)
  1044. //获取每张纸的page
  1045. let drawPages: [[KMPrintDrawPage]] = self.fetchDrawPages(paperSize, printModel.page, paperCount, pageOfPaperCount, pages)
  1046. self.drawPageToContext(context, drawPages.first!, printModel)
  1047. }
  1048. }