KMNConvertTool.swift 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. //
  2. // KMNConvertPDFManager.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by 丁林圭 on 2024/10/23.
  6. //
  7. import Cocoa
  8. class KMNConvertTool: NSObject {
  9. static let imageExtensions = ["jpg","cur","bmp","jpeg","gif","png","tiff","tif",/*@"pic",*/"ico","icns","tga","psd","eps","hdr","jp2","jpc","pict","sgi","heic"]
  10. static let pdfExtensions = ["pdf"]
  11. static let officeExtensions = ["doc", "docx", "xls", "xlsx", "ppt", "pptx"]
  12. class func supportImageFileType() -> [String] {
  13. return imageExtensions
  14. }
  15. class func supportPDFFileType() -> [String] {
  16. return pdfExtensions
  17. }
  18. class func convertOffice(filePath: String, completionBlock:@escaping (String?)->Void) -> Void {
  19. let today = Date()
  20. let dateFormatter = DateFormatter()
  21. dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
  22. let dateString = dateFormatter.string(from: today)
  23. let folderPath = "convertToPDF_office_" + dateString + "." + "pdf"
  24. let savePath: String? = folderPath.kUrlToPDFFolderPath() as String
  25. KMConvertPDFManager.convertFile(filePath, savePath: savePath!) { success, errorDic in
  26. if errorDic != nil || !success || !FileManager.default.fileExists(atPath: savePath!) {
  27. if FileManager.default.fileExists(atPath: savePath!) {
  28. try?FileManager.default.removeItem(atPath: savePath!)
  29. }
  30. let alert = NSAlert.init()
  31. alert.alertStyle = .critical
  32. var infoString = ""
  33. if errorDic != nil {
  34. for key in (errorDic! as Dictionary).keys {
  35. infoString = infoString.appendingFormat("%@\n", errorDic![key] as! CVarArg)
  36. }
  37. }
  38. alert.informativeText = NSLocalizedString("Please install Microsoft Office to create PDFs from Office files", comment: "")
  39. alert.messageText = NSLocalizedString("Failed to Create PDF", comment: "")
  40. alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
  41. alert.runModal()
  42. completionBlock(nil)
  43. return
  44. }
  45. if !savePath!.isPDFValid() {
  46. let alert = NSAlert()
  47. alert.alertStyle = .critical
  48. alert.messageText = NSLocalizedString("An error occurred while opening this document. The file is damaged and could not be repaired.", comment: "")
  49. alert.runModal()
  50. completionBlock(nil)
  51. return
  52. }
  53. completionBlock(savePath)
  54. }
  55. }
  56. class func openDocumentWithImageFromPasteboard(_ pboard: NSPasteboard, error outError: AutoreleasingUnsafeMutablePointer<NSError?>?) -> CPDFDocument? {
  57. var document: CPDFDocument? = nil
  58. var data: Data? = nil
  59. if pboard.canReadItem(withDataConformingToTypes: [NSPasteboard.PasteboardType.pdf.rawValue]) {
  60. data = pboard.data(forType: NSPasteboard.PasteboardType.pdf)
  61. } else if pboard.canReadItem(withDataConformingToTypes: [NSPasteboard.PasteboardType.postScript.rawValue]) {
  62. data = pboard.data(forType: NSPasteboard.PasteboardType.postScript)
  63. } else if pboard.canReadItem(withDataConformingToTypes: [NSPasteboard.PasteboardType.tiff.rawValue]) {
  64. data = KMNConvertTool.convertTIFFDataToPDF(pboard.data(forType: NSPasteboard.PasteboardType.tiff) ?? Data())
  65. } else {
  66. let images = pboard.readObjects(forClasses: [NSImage.self], options: [:])
  67. let strings = pboard.readObjects(forClasses: [NSAttributedString.self], options: [:])
  68. if images?.count ?? 0 > 0 {
  69. data = KMNConvertTool.convertTIFFDataToPDF((images![0] as AnyObject).tiffRepresentation!)
  70. } else if strings?.count ?? 0 > 0 {
  71. data = KMOCTool.convertStringsToPDF(withString: strings ?? [""]) // convertStringsToPDF(strings!)
  72. }
  73. }
  74. if let data = data {
  75. document = CPDFDocument(data: data)
  76. } else if let outError = outError {
  77. outError.pointee = NSError(domain: "SKDocumentErrorDomain", code: 3, userInfo: [NSLocalizedDescriptionKey: NSLocalizedString("Unable to load data from clipboard", comment: "Error description")])
  78. }
  79. return document
  80. }
  81. class func convertTIFFDataToPDF(_ tiffData: Data) -> Data? {
  82. guard let imsrc = CGImageSourceCreateWithData(tiffData as CFData, [kCGImageSourceTypeIdentifierHint: kUTTypeTIFF] as CFDictionary), CGImageSourceGetCount(imsrc) > 0, let cgImage = CGImageSourceCreateImageAtIndex(imsrc, 0, nil) else { return nil }
  83. let pdfData = NSMutableData(capacity: tiffData.count)
  84. let consumer = CGDataConsumer(data: pdfData! as CFMutableData)!
  85. var rect = CGRect(x: 0, y: 0, width: CGFloat(cgImage.width), height: CGFloat(cgImage.height))
  86. let ctxt = CGContext(consumer: consumer, mediaBox: &rect, nil)
  87. ctxt!.beginPDFPage(nil)
  88. ctxt!.draw(cgImage, in: rect)
  89. ctxt!.endPDFPage()
  90. ctxt!.closePDF()
  91. return pdfData as? Data
  92. }
  93. }