// Copyright © 2014-2025 PDF Technologies, Inc. All Rights Reserved.
//
// THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
// AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
// UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
// This notice may not be removed from this file.
//
import UIKit
import Foundation
import ComPDFKit
import ComPDFKit_Tools
/**
* RN and iOS native ComPDFKit SDK interaction class
*
*/
@objc(ComPDFKit)
class ComPDFKit: NSObject, CPDFViewBaseControllerDelete, UIDocumentPickerDelegate{
private var pdfViewController: CPDFViewController?
private var _resolve: RCTPromiseResolveBlock?
/**
* Get the version number of the ComPDFKit SDK.
* For example: "2.0.0".
*
* ComPDFKit.getVersionCode().then((versionCode : string) => { * console.log('ComPDFKit SDK Version:', versionCode) * }) ** */ @objc(getVersionCode:withRejecter:) func getVersionCode(resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) -> Void { resolve(String(CPDFKit.sharedInstance().versionNumber)) } /** * Get the build tag of the ComPDFKit PDF SDK.
* ComPDFKit.getSDKBuildTag().then((buildTag : string) => { * console.log('ComPDFKit Build Tag:', buildTag) * }) ** */ @objc(getSDKBuildTag:withRejecter:) func getSDKBuildTag(resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) -> Void { let sdkBuildTag = CPDFKit.sharedInstance().versionString resolve(sdkBuildTag) } /** * Initialize the ComPDFKit PDF SDK using offline authentication.
* ComPDFKit.init_('license') ** * @param license The offline license. */ @objc(init_: withResolver: withRejecter:) func init_(license : String,resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){ DispatchQueue.main.async { let code = CPDFKit.verify(withKey: license) print("ComPDFKitRN-iOS init_:\(code)") resolve(code == CPDFKitLicenseCode.success) } } /** * Initialize the ComPDFKit PDF SDK using online authentication.
* ComPDFKit.initialize(androidLicense, iosLicense) ** * @param androidOnlineLicense The online license for the ComPDFKit SDK on Android platform. * @param iosOnlineLicense The online license for the ComPDFKit SDK on iOS platform. */ @objc(initialize: iosOnlineLicense: withResolver: withRejecter:) func initialize(_ androidOnlineLicense: String, iosOnlineLicense: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) { DispatchQueue.main.async { CPDFKit.verify(withOnlineLicense: iosOnlineLicense) { code, message in print("ComPDFKitRN-iOS initialize: \(code), Message:\(String(describing: message))") resolve(code == CPDFKitOnlineLicenseCode.success) } } } /** * Display a PDF.
* ComPDFKit.openDocument(document, password, configurationJson) ** * (iOS) For local storage file path:
* document = "file:///storage/emulated/0/Download/sample.pdf";* * (iOS) For content Uri:
*
* document = "content://..."; ** * (iOS) For assets path:
* document = "file:///android_asset/..." ** * @param document The document URI or file path. * @param password The document password. * @param configurationJson Configuration data in JSON format. */ @objc(openDocument: password: configurationJson:) func openDocument(document : URL, password: String, configurationJson : String) -> Void { DispatchQueue.main.async { var documentPath = document.path var success = false let homeDiectory = NSHomeDirectory() let bundlePath = Bundle.main.bundlePath if (documentPath.hasPrefix(homeDiectory) || documentPath.hasPrefix(bundlePath)) { let fileManager = FileManager.default let samplesFilePath = NSHomeDirectory().appending("/Documents/Files") let fileName = document.lastPathComponent let docsFilePath = samplesFilePath + "/" + fileName if !fileManager.fileExists(atPath: samplesFilePath) { try? FileManager.default.createDirectory(atPath: samplesFilePath, withIntermediateDirectories: true, attributes: nil) } try? FileManager.default.copyItem(atPath: document.path, toPath: docsFilePath) documentPath = docsFilePath } else { success = document.startAccessingSecurityScopedResource() } let rootNav = ComPDFKit.presentedViewController() let jsonDataParse = CPDFJSONDataParse(String: configurationJson) guard let configuration = jsonDataParse.configuration else { return } self.pdfViewController = CPDFViewController(filePath: documentPath, password: password, configuration: configuration) self.pdfViewController?.delegate = self let nav = CNavigationController(rootViewController: self.pdfViewController!) nav.modalPresentationStyle = .fullScreen rootNav?.present(nav, animated: true) if success { document.stopAccessingSecurityScopedResource() } } } @objc(removeSignFileList:withRejecter:) func removeSignFileList(resolve: @escaping RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) { DispatchQueue.main.async { CSignatureManager.sharedManager.removeAllSignatures() resolve(true) } } @objc(pickFile:withRejecter:) func pickFile(resolve: @escaping RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) { DispatchQueue.main.async { let documentTypes = ["com.adobe.pdf"] let documentPickerViewController = UIDocumentPickerViewController(documentTypes: documentTypes, in: .open) documentPickerViewController.delegate = self UIApplication.presentedViewController()?.present(documentPickerViewController, animated: true, completion: nil) self._resolve = resolve } } @objc(setImportFontDir:addSysFont:withResolver: withRejecter:) func setImportFontDir(fontDir : String, addSysFont : Bool, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) { let fileManager = FileManager.default let documentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first! let destinationPath = documentDirectory.appendingPathComponent("Font") do { if fileManager.fileExists(atPath: destinationPath.path) { try fileManager.removeItem(at: destinationPath) } try fileManager.copyItem(atPath: fontDir, toPath: destinationPath.path) CPDFFont.setImportDir(destinationPath.path, isContainSysFont: addSysFont) } catch { print("Error copying Font directory: \(error)") } resolve(true) } //MARK: - ViewController Method /** * CPDFViewBaseControllerDelete delegate to dismiss ViewController.