ソースを参照

ComPDFKit(rn) - iOS端新增getDocuemntPath接口

yangliuhua 1 週間 前
コミット
81ef7c1848
4 ファイル変更657 行追加626 行削除
  1. 90 79
      ios/RCTCPDFView.swift
  2. 73 66
      ios/RCTCPDFViewManager.swift
  3. 4 0
      ios/RCTDocumentManager.m
  4. 490 481
      ios/RCTDocumentManager.swift

+ 90 - 79
ios/RCTCPDFView.swift

@@ -21,73 +21,73 @@ protocol RCTCPDFViewDelegate: AnyObject {
 }
 
 class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
-
+    
     weak var delegate: RCTCPDFViewDelegate?
-
+    
     public var pdfViewController : CPDFViewController?
-
+    
     private var navigationController : CNavigationController?
-
+    
     init() {
         super.init(frame: CGRect(x: 0, y: 0, width: 500, height: 400))
     }
-
+    
     required init?(coder: NSCoder) {
         fatalError("init(coder:) has not been implemented")
     }
-
+    
     // MARK: - Private Methods
-
+    
     private func createCPDFView() {
         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 jsonData = CPDFJSONDataParse(String: configuration)
         let configurations = jsonData.configuration ?? CPDFConfiguration()
-
+        
         pdfViewController = CPDFViewController(filePath: documentPath, password: password, configuration: configurations)
         pdfViewController?.delegate = self
         navigationController = CNavigationController(rootViewController: pdfViewController!)
         navigationController?.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
         navigationController?.view.frame = self.frame
-
+        
         navigationController?.setViewControllers([pdfViewController!], animated: true)
-
+        
         addSubview(navigationController?.view ?? UIView())
-
+        
         self.delegate?.cpdfViewAttached(self)
-
+        
         if success {
             document.stopAccessingSecurityScopedResource()
         }
     }
-
+    
     // MARK: - Public Methods
-
+    
     func saveDocument(completionHandler: @escaping (Bool) -> Void) {
         if (self.pdfViewController?.pdfListView?.isEditing() == true && self.pdfViewController?.pdfListView?.isEdited() == true) {
             self.pdfViewController?.pdfListView?.commitEditing()
-
+            
             if self.pdfViewController?.pdfListView?.document.isModified() == true {
                 let document = self.pdfViewController?.pdfListView?.document
                 let success = document?.write(to: document?.documentURL ?? URL(fileURLWithPath: ""), isSaveFontSubset: true) ?? false
@@ -95,7 +95,7 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             } else {
                 completionHandler(true)
             }
-
+            
         } else {
             if self.pdfViewController?.pdfListView?.document.isModified() == true {
                 let document = self.pdfViewController?.pdfListView?.document
@@ -106,14 +106,14 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             }
         }
     }
-
+    
     func setMargins(left : Int, top : Int, right : Int, bottom : Int) {
         if let pdfListView = self.pdfViewController?.pdfListView {
             pdfListView.pageBreakMargins = .init(top: CGFloat(top), left: CGFloat(left), bottom: CGFloat(bottom), right: CGFloat(right))
             pdfListView.layoutDocumentView()
         }
     }
-
+    
     func removeAllAnnotations(completionHandler: @escaping (Bool) -> Void) {
         if let pdfListView = self.pdfViewController?.pdfListView {
             let pageCount = pdfListView.document?.pageCount ?? 0
@@ -128,22 +128,22 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             completionHandler(false)
         }
     }
-
+    
     func importAnnotations(xfdfFile : URL, completionHandler: @escaping (Bool) -> Void) {
         if let pdfListView = self.pdfViewController?.pdfListView {
-
+            
             let documentFolder = NSHomeDirectory().appending("/Documents/Files")
             if !FileManager.default.fileExists(atPath: documentFolder) {
                 try? FileManager.default.createDirectory(at: URL(fileURLWithPath: documentFolder), withIntermediateDirectories: true, attributes: nil)
             }
-
+            
             let documentPath = documentFolder + "/\(xfdfFile.lastPathComponent)"
             try? FileManager.default.copyItem(atPath: xfdfFile.path, toPath: documentPath)
-
+            
             if !FileManager.default.fileExists(atPath: documentPath) {
                 print("fail")
             }
-
+            
             let success = pdfListView.document?.importAnnotation(fromXFDFPath: documentPath) ?? false
             if success {
                 self.pdfViewController?.pdfListView?.setNeedsDisplayForVisiblePages()
@@ -153,14 +153,14 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             completionHandler(false)
         }
     }
-
+    
     func exportAnnotations(completionHandler: @escaping (String) -> Void) {
         if let pdfListView = self.pdfViewController?.pdfListView {
             let fileNameWithExtension = pdfListView.document?.documentURL.lastPathComponent ?? ""
             let fileName = (fileNameWithExtension as NSString).deletingPathExtension
             let documentFolder = NSHomeDirectory().appending("/Documents/\(fileName)_xfdf.xfdf")
             let succes = pdfListView.document?.exportAnnotation(toXFDFPath: documentFolder) ?? false
-
+            
             if succes {
                 completionHandler(documentFolder)
             } else {
@@ -170,13 +170,13 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             completionHandler("")
         }
     }
-
+    
     func setDisplayPageIndex(pageIndex : Int) {
         if let pdfListView = self.pdfViewController?.pdfListView {
             pdfListView.go(toPageIndex: pageIndex, animated: false)
         }
     }
-
+    
     func getCurrentPageIndex(completionHandler: @escaping (Int) -> Void) {
         if let pdfListView = self.pdfViewController?.pdfListView {
             completionHandler(pdfListView.currentPageIndex)
@@ -184,7 +184,7 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             completionHandler(0)
         }
     }
-
+    
     func hasChange(completionHandler: @escaping (Bool) -> Void) {
         if let pdfListView = self.pdfViewController?.pdfListView {
             let success = pdfListView.document?.isModified() ?? false
@@ -193,13 +193,13 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             completionHandler(false)
         }
     }
-
+    
     func setScale(scale : NSNumber){
         if let pdfListView = self.pdfViewController?.pdfListView {
             pdfListView.setScaleFactor(CGFloat(truncating: scale), animated: true)
         }
     }
-
+    
     func getScale(completionHandler: @escaping (NSNumber) -> Void) {
         if let pdfListView = self.pdfViewController?.pdfListView {
             completionHandler(NSNumber(value: pdfListView.scaleFactor))
@@ -207,7 +207,7 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             completionHandler(1.0)
         }
     }
-
+    
     func setReadBackgroundColor(displayMode : NSString) {
         if let pdfListView = self.pdfViewController?.pdfListView {
             switch displayMode {
@@ -225,7 +225,7 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             pdfListView.layoutDocumentView()
         }
     }
-
+    
     func getReadbackgroundColor(completionHandler: @escaping (NSString) -> Void) {
         if let pdfListView = self.pdfViewController?.pdfListView {
             let dispalyMode = pdfListView.displayMode
@@ -247,36 +247,36 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             completionHandler("#FFFFFF")
         }
     }
-
+    
     func setFormFieldHighlight(formFieldHighlight : Bool){
         if let pdfListView = self.pdfViewController?.pdfListView {
             CPDFKitConfig.sharedInstance().setEnableFormFieldHighlight(formFieldHighlight)
             pdfListView.layoutDocumentView()
         }
     }
-
+    
     func isFormFieldHighlight(completionHandler: @escaping (Bool) -> Void){
         completionHandler(CPDFKitConfig.sharedInstance().enableFormFieldHighlight())
     }
-
+    
     func setLinkHighlight(linkHighlight : Bool) {
         if let pdfListView = self.pdfViewController?.pdfListView {
             CPDFKitConfig.sharedInstance().setEnableLinkFieldHighlight(linkHighlight)
             pdfListView.layoutDocumentView()
         }
     }
-
+    
     func isLinkHighlight(completionHandler: @escaping (Bool) -> Void){
         completionHandler(CPDFKitConfig.sharedInstance().enableLinkFieldHighlight())
     }
-
+    
     func setVerticalMode(isVerticalMode : Bool) {
         if let pdfListView = self.pdfViewController?.pdfListView {
             pdfListView.displayDirection = isVerticalMode ? .vertical : .horizontal
             pdfListView.layoutDocumentView()
         }
     }
-
+    
     func isVerticalMode(completionHandler: @escaping (Bool) -> Void){
         if let pdfListView = self.pdfViewController?.pdfListView {
             completionHandler(pdfListView.displayDirection == .vertical)
@@ -284,14 +284,14 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             completionHandler(true)
         }
     }
-
+    
     func setContinueMode(isContinueMode : Bool) {
         if let pdfListView = self.pdfViewController?.pdfListView {
             pdfListView.displaysPageBreaks = isContinueMode
             pdfListView.layoutDocumentView()
         }
     }
-
+    
     func isContinueMode(completionHandler: @escaping (Bool) -> Void){
         if let pdfListView = self.pdfViewController?.pdfListView {
             completionHandler(pdfListView.displaysPageBreaks)
@@ -299,7 +299,7 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             completionHandler(true)
         }
     }
-
+    
     func setDoublePageMode(isDoublePageMode : Bool) {
         if let pdfListView = self.pdfViewController?.pdfListView {
             pdfListView.displayTwoUp = isDoublePageMode
@@ -307,7 +307,7 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             pdfListView.layoutDocumentView()
         }
     }
-
+    
     func isDoublePageMode(completionHandler: @escaping (Bool) -> Void){
         if let pdfListView = self.pdfViewController?.pdfListView {
             completionHandler(pdfListView.displayTwoUp)
@@ -315,7 +315,7 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             completionHandler(true)
         }
     }
-
+    
     func setCoverPageMode(isCoverPageMode : Bool) {
         if let pdfListView = self.pdfViewController?.pdfListView {
             pdfListView.displayTwoUp = isCoverPageMode
@@ -323,7 +323,7 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             pdfListView.layoutDocumentView()
         }
     }
-
+    
     func isCoverPageMode(completionHandler: @escaping (Bool) -> Void){
         if let pdfListView = self.pdfViewController?.pdfListView {
             completionHandler(pdfListView.displaysAsBook)
@@ -331,14 +331,14 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             completionHandler(true)
         }
     }
-
+    
     func setCropMode(isCropMode : Bool) {
         if let pdfListView = self.pdfViewController?.pdfListView {
             pdfListView.displayCrop = isCropMode
             pdfListView.layoutDocumentView()
         }
     }
-
+    
     func isCropMode(completionHandler: @escaping (Bool) -> Void){
         if let pdfListView = self.pdfViewController?.pdfListView {
             completionHandler(pdfListView.displayCrop)
@@ -359,7 +359,7 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             self.pdfViewController?.enterFormMode()
         case "signatures":
             self.pdfViewController?.enterSignatureMode()
-            default:
+        default:
             self.pdfViewController?.enterViewerMode()
         }
     }
@@ -394,8 +394,8 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
         self.pdfViewController?.buttonItemClicked_Bota(UIButton(frame: .zero))
     }
     
-  func showAddWatermarkView(saveAsNewFile : Bool) {
-    self.pdfViewController?.enterPDFWatermark(isSaveAs: saveAsNewFile)
+    func showAddWatermarkView(saveAsNewFile : Bool) {
+        self.pdfViewController?.enterPDFWatermark(isSaveAs: saveAsNewFile)
     }
     
     func showSecurityView() {
@@ -427,7 +427,7 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             completionHandler(false)
         }
     }
-
+    
     func getFileName(completionHandler: @escaping (String) -> Void){
         if let pdfListView = self.pdfViewController?.pdfListView {
             completionHandler(pdfListView.document.documentURL.lastPathComponent)
@@ -435,7 +435,7 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             completionHandler("")
         }
     }
-
+    
     func isEncrypted(completionHandler: @escaping (Bool) -> Void){
         if let pdfListView = self.pdfViewController?.pdfListView {
             completionHandler(pdfListView.document.isEncrypted)
@@ -443,7 +443,7 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             completionHandler(false)
         }
     }
-
+    
     func isImageDoc(completionHandler: @escaping (Bool) -> Void){
         if let pdfListView = self.pdfViewController?.pdfListView {
             completionHandler(pdfListView.document.isImageDocument())
@@ -451,7 +451,7 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             completionHandler(false)
         }
     }
-
+    
     func getPermissions(completionHandler: @escaping (NSNumber) -> Void) {
         if let pdfListView = self.pdfViewController?.pdfListView {
             let permissions = pdfListView.document?.permissionsStatus ?? .none
@@ -469,7 +469,7 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             completionHandler(0)
         }
     }
-
+    
     func getPageCount(completionHandler: @escaping (NSNumber) -> Void) {
         if let pdfListView = self.pdfViewController?.pdfListView {
             completionHandler(pdfListView.document.pageCount as NSNumber)
@@ -477,7 +477,7 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             completionHandler(0)
         }
     }
-
+    
     func checkOwnerUnlocked(completionHandler: @escaping (Bool) -> Void) {
         if let pdfListView = self.pdfViewController?.pdfListView {
             completionHandler(pdfListView.document.isCheckOwnerUnlocked())
@@ -485,7 +485,7 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             completionHandler(false)
         }
     }
-
+    
     func checkOwnerPassword(password : String, completionHandler: @escaping (Bool) -> Void) {
         if let pdfListView = self.pdfViewController?.pdfListView {
             completionHandler(pdfListView.document.checkOwnerPassword(password))
@@ -553,7 +553,7 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             completionHandler(false)
         }
     }
-
+    
     func getEncryptAlgo(completionHandler: @escaping (String) -> Void) {
         if let pdfListView = self.pdfViewController?.pdfListView {
             let encryptAlgo = pdfListView.document.encryptionLevel
@@ -574,21 +574,25 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
         }
     }
     
+    func printDocument() {
+        self.pdfViewController?.enterPrintState();
+    }
+    
     func importWidgets(xfdfFile : URL, completionHandler: @escaping (Bool) -> Void) {
         if let pdfListView = self.pdfViewController?.pdfListView {
-
+            
             let documentFolder = NSHomeDirectory().appending("/Documents/Files")
             if !FileManager.default.fileExists(atPath: documentFolder) {
                 try? FileManager.default.createDirectory(at: URL(fileURLWithPath: documentFolder), withIntermediateDirectories: true, attributes: nil)
             }
-
+            
             let documentPath = documentFolder + "/\(xfdfFile.lastPathComponent)"
             try? FileManager.default.copyItem(atPath: xfdfFile.path, toPath: documentPath)
-
+            
             if !FileManager.default.fileExists(atPath: documentPath) {
                 print("fail")
             }
-
+            
             let success = pdfListView.document?.importForm(fromXFDFPath: documentPath) ?? false
             if success {
                 self.pdfViewController?.pdfListView?.setNeedsDisplayForVisiblePages()
@@ -598,14 +602,21 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
             completionHandler(false)
         }
     }
-
+    
+    func getDocumentPath(completionHandler: @escaping (String) -> Void) {
+        if let pdfListView = self.pdfViewController?.pdfListView {
+            let documentPath = pdfListView.document.documentURL.path
+            completionHandler(documentPath)
+        }
+    }
+    
     func exportWidgets(completionHandler: @escaping (String) -> Void) {
         if let pdfListView = self.pdfViewController?.pdfListView {
             let fileNameWithExtension = pdfListView.document?.documentURL.lastPathComponent ?? ""
             let fileName = (fileNameWithExtension as NSString).deletingPathExtension
             let documentFolder = NSHomeDirectory().appending("/Documents/\(fileName)_xfdf.xfdf")
             let succes = pdfListView.document?.exportForm(toXFDFPath: documentFolder) ?? false
-
+            
             if succes {
                 completionHandler(documentFolder)
             } else {
@@ -622,42 +633,42 @@ class RCTCPDFView: UIView, CPDFViewBaseControllerDelete {
         }
         return value
     }
-
+    
     // MARK: - CPDFViewBaseControllerDelete
-
+    
     func PDFViewBaseController(_ baseController: CPDFViewBaseController, SaveState success: Bool) {
         self.delegate?.saveDocumentChange(self)
     }
-
+    
     func PDFViewBaseController(_ baseController: CPDFViewBaseController, currentPageIndex index: Int) {
         self.delegate?.onPageChanged(self, pageIndex: index)
     }
-
+    
     // MARK: - RCT Methods
-
+    
     private var configuration: String = ""
     @objc func setConfiguration(_ newSection: String) {
         configuration = newSection
-
+        
         if (document.path.count > 1) && (configuration.count > 1) {
             createCPDFView()
         }
     }
-
+    
     private var document: URL = URL(fileURLWithPath: "")
     @objc func setDocument(_ newSection: URL) {
         document = newSection
-
+        
         if (document.path.count > 1) && (configuration.count > 1) {
             createCPDFView()
         }
     }
-
+    
     private var password: String = ""
     @objc func setPassword(_ newSection: String) {
         password = newSection
     }
-
+    
     public var onChange: RCTBubblingEventBlock?
     @objc func setOnChange(_ newSection: @escaping RCTBubblingEventBlock) {
         onChange = newSection

+ 73 - 66
ios/RCTCPDFViewManager.swift

@@ -15,24 +15,24 @@ import ComPDFKit
 
 @objc(RCTCPDFReaderView)
 class RCTCPDFReaderView: RCTViewManager, RCTCPDFViewDelegate {
-
+    
     @objc override static func requiresMainQueueSetup() -> Bool {
         return true
     }
-
+    
     var cpdfViews: Dictionary<Int, RCTCPDFView> = [:]
-
+    
     @objc override func view() -> UIView! {
         let rtcCPDFView = RCTCPDFView()
         rtcCPDFView.delegate = self
         return rtcCPDFView
     }
-
+    
     func saveDocument(forCPDFViewTag tag: Int, completionHandler: @escaping (Bool) -> Void) {
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.saveDocument(completionHandler: { success in
             completionHandler(success)
-
+            
             if (success) {
                 if let onChange = rtcCPDFView?.onChange {
                     onChange(["saveDocument": "saveDocument"])
@@ -40,153 +40,153 @@ class RCTCPDFReaderView: RCTViewManager, RCTCPDFViewDelegate {
             }
         })
     }
-
+    
     func setMargins(forCPDFViewTag tag: Int, left : Int, top : Int, right : Int, bottom : Int) {
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.setMargins(left: left, top: top, right: right, bottom: bottom)
     }
-
+    
     func removeAllAnnotations(forCPDFViewTag tag: Int, completionHandler: @escaping (Bool) -> Void) {
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.removeAllAnnotations(completionHandler: { success in
             completionHandler(success)
         })
     }
-
+    
     func importAnnotations(forCPDFViewTag tag: Int, xfdfFile : URL, completionHandler: @escaping (Bool) -> Void) {
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.importAnnotations(xfdfFile: xfdfFile, completionHandler: { success in
             completionHandler(success)
         })
     }
-
+    
     func exportAnnotations(forCPDFViewTag tag: Int, completionHandler: @escaping (String) -> Void) {
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.exportAnnotations(completionHandler: { success in
             completionHandler(success)
         })
     }
-
+    
     func setDisplayPageIndex(forCPDFViewTag tag : Int, pageIndex : Int) {
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.setDisplayPageIndex(pageIndex: pageIndex)
     }
-
+    
     func getCurrentPageIndex(forCPDFViewTag tag: Int, completionHandler: @escaping (Int) -> Void) {
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.getCurrentPageIndex(completionHandler: { pageIndex in
             completionHandler(pageIndex)
         })
     }
-
+    
     func hasChange(forCPDFViewTag tag: Int, completionHandler: @escaping (Bool) -> Void) {
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.hasChange(completionHandler: { success in
             completionHandler(success)
         })
     }
-
+    
     func setScale(forCPDFViewTag tag : Int, scale : NSNumber) {
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.setScale(scale: scale)
     }
-
+    
     func getScale(forCPDFViewTag tag : Int, completionHandler: @escaping (NSNumber) -> Void) {
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.getScale(completionHandler: { success in
             completionHandler(success)
         })
     }
-
+    
     func setReadBackgroundColor(forCPDFViewTag tag : Int, displayMode : NSString) {
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.setReadBackgroundColor(displayMode: displayMode)
     }
-
+    
     func getReadBackgroundColor(forCPDFViewTag tag : Int, completionHandler: @escaping (NSString) -> Void){
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.getReadbackgroundColor(completionHandler: {color in
             completionHandler(color)
         })
     }
-
+    
     func setFormFieldHighlight(forCPDFViewTag tag : Int, formFieldHighlight : Bool) {
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.setFormFieldHighlight(formFieldHighlight: formFieldHighlight)
     }
-
+    
     func isFormFieldHighlight(forCPDFViewTag tag : Int, completionHandler: @escaping (Bool) -> Void){
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.isFormFieldHighlight(completionHandler: {highlight in
             completionHandler(highlight)
         })
     }
-
+    
     func setLinkHighlight(forCPDFViewTag tag : Int, linkHighlight : Bool) {
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.setLinkHighlight(linkHighlight: linkHighlight)
     }
-
+    
     func isLinkHighlight(forCPDFViewTag tag : Int, completionHandler: @escaping (Bool) -> Void){
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.isLinkHighlight(completionHandler: {highlight in
             completionHandler(highlight)
         })
     }
-
+    
     func setVerticalMode(forCPDFViewTag tag : Int, isVerticalMode : Bool) {
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.setVerticalMode(isVerticalMode: isVerticalMode)
     }
-
+    
     func isVerticalMode(forCPDFViewTag tag : Int, completionHandler: @escaping (Bool) -> Void){
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.isVerticalMode(completionHandler: {isVertical in
             completionHandler(isVertical)
         })
     }
-
+    
     func setContinueMode(forCPDFViewTag tag : Int, isContinueMode : Bool) {
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.setContinueMode(isContinueMode: isContinueMode)
     }
-
+    
     func isContinueMode(forCPDFViewTag tag : Int, completionHandler: @escaping (Bool) -> Void){
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.isContinueMode(completionHandler: {isContinue in
             completionHandler(isContinue)
         })
     }
-
+    
     func setDoublePageMode(forCPDFViewTag tag : Int, isDoublePageMode : Bool) {
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.setDoublePageMode(isDoublePageMode: isDoublePageMode)
     }
-
+    
     func isDoublePageMode(forCPDFViewTag tag : Int, completionHandler: @escaping (Bool) -> Void){
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.isDoublePageMode(completionHandler: {isDoublePage in
             completionHandler(isDoublePage)
         })
     }
-
+    
     func setCoverPageMode(forCPDFViewTag tag : Int, isCoverPageMode : Bool) {
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.setCoverPageMode(isCoverPageMode: isCoverPageMode)
     }
-
+    
     func isCoverPageMode(forCPDFViewTag tag : Int, completionHandler: @escaping (Bool) -> Void){
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.isCoverPageMode(completionHandler: { isCoverPageMode in
             completionHandler(isCoverPageMode)
         })
     }
-
+    
     func setCropMode(forCPDFViewTag tag : Int, isCropMode : Bool) {
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.setCropMode(isCropMode: isCropMode)
     }
-
+    
     func isCropMode(forCPDFViewTag tag : Int, completionHandler: @escaping (Bool) -> Void){
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.isCropMode(completionHandler: completionHandler)
@@ -214,9 +214,9 @@ class RCTCPDFReaderView: RCTViewManager, RCTCPDFViewDelegate {
         rtcCPDFView?.showBotaView()
     }
     
-  func showAddWatermarkView(forCPDFViewTag tag : Int, saveAsNewFile : Bool) {
+    func showAddWatermarkView(forCPDFViewTag tag : Int, saveAsNewFile : Bool) {
         let rtcCPDFView = cpdfViews[tag]
-    rtcCPDFView?.showAddWatermarkView(saveAsNewFile: saveAsNewFile)
+        rtcCPDFView?.showAddWatermarkView(saveAsNewFile: saveAsNewFile)
     }
     
     func showSecurityView(forCPDFViewTag tag : Int) {
@@ -245,37 +245,37 @@ class RCTCPDFReaderView: RCTViewManager, RCTCPDFViewDelegate {
             completionHandler(success)
         })
     }
-
+    
     func getFileName(forCPDFViewTag tag : Int, completionHandler: @escaping (String) -> Void){
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.getFileName(completionHandler: completionHandler)
     }
-
+    
     func isEncrypted(forCPDFViewTag tag : Int, completionHandler: @escaping (Bool) -> Void){
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.isEncrypted(completionHandler: completionHandler)
     }
-
+    
     func isImageDoc(forCPDFViewTag tag : Int, completionHandler: @escaping (Bool) -> Void){
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.isImageDoc(completionHandler: completionHandler)
     }
-
+    
     func getPermissions(forCPDFViewTag tag : Int, completionHandler: @escaping (NSNumber) -> Void) {
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.getPermissions(completionHandler: completionHandler)
     }
-
+    
     func getPageCount(forCPDFViewTag tag : Int, completionHandler: @escaping (NSNumber) -> Void) {
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.getPageCount(completionHandler: completionHandler)
     }
-
+    
     func checkOwnerUnlocked(forCPDFViewTag tag : Int, completionHandler: @escaping (Bool) -> Void) {
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.checkOwnerUnlocked(completionHandler: completionHandler)
     }
-
+    
     func checkOwnerPassword(forCPDFViewTag tag : Int, password : String, completionHandler: @escaping (Bool) -> Void) {
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.checkOwnerPassword(password: password, completionHandler: completionHandler)
@@ -294,49 +294,56 @@ class RCTCPDFReaderView: RCTViewManager, RCTCPDFViewDelegate {
             completionHandler(success)
         })
     }
-
+    
     func getEncryptAlgo(forCPDFViewTag tag : Int, completionHandler: @escaping (String) -> Void) {
         let rtcCPDFView = cpdfViews[tag]
         rtcCPDFView?.getEncryptAlgo(completionHandler: completionHandler)
     }
-  
-  func printDocument(forCPDFViewTag tag : Int){
-    let rtcCPDFView = cpdfViews[tag]
-    rtcCPDFView?.pdfViewController?.enterPrintState();
-  }
-  
-  func importWidgets(forCPDFViewTag tag: Int, xfdfFile : URL, completionHandler: @escaping (Bool) -> Void) {
-      let rtcCPDFView = cpdfViews[tag]
-      rtcCPDFView?.importWidgets(xfdfFile: xfdfFile, completionHandler: { success in
-          completionHandler(success)
-      })
-  }
-
-  func exportWidgets(forCPDFViewTag tag: Int, completionHandler: @escaping (String) -> Void) {
-      let rtcCPDFView = cpdfViews[tag]
-      rtcCPDFView?.exportWidgets(completionHandler: { success in
-          completionHandler(success)
-      })
-  }
-
+    
+    func printDocument(forCPDFViewTag tag : Int){
+        let rtcCPDFView = cpdfViews[tag]
+        rtcCPDFView?.printDocument()
+    }
+    
+    func importWidgets(forCPDFViewTag tag: Int, xfdfFile : URL, completionHandler: @escaping (Bool) -> Void) {
+        let rtcCPDFView = cpdfViews[tag]
+        rtcCPDFView?.importWidgets(xfdfFile: xfdfFile, completionHandler: { success in
+            completionHandler(success)
+        })
+    }
+    
+    func getDocumentPath(forCPDFViewTag tag : Int, completionHandler: @escaping (String) -> Void){
+        let rtcCPDFView = cpdfViews[tag]
+        rtcCPDFView?.getDocumentPath(completionHandler: { path in
+            completionHandler(path)
+        })
+    }
+    
+    func exportWidgets(forCPDFViewTag tag: Int, completionHandler: @escaping (String) -> Void) {
+        let rtcCPDFView = cpdfViews[tag]
+        rtcCPDFView?.exportWidgets(completionHandler: { success in
+            completionHandler(success)
+        })
+    }
+    
     // MARK: - RCTCPDFViewDelegate
-
+    
     func cpdfViewAttached(_ cpdfView: RCTCPDFView) {
         cpdfViews[cpdfView.reactTag.intValue] = cpdfView
     }
-
+    
     func saveDocumentChange(_ cpdfView: RCTCPDFView) {
         if let onChange = cpdfView.onChange {
             onChange(["saveDocument": "saveDocument"])
         }
     }
-
+    
     func onPageChanged(_ cpdfView: RCTCPDFView, pageIndex: Int) {
         if let onChange = cpdfView.onChange {
             onChange(["onPageChanged": pageIndex])
         }
     }
-  
-
-
+    
+    
+    
 }

+ 4 - 0
ios/RCTDocumentManager.m

@@ -188,6 +188,10 @@ RCT_EXTERN_METHOD(importWidgets:(NSInteger)tag
 RCT_EXTERN_METHOD(exportWidgets:(NSInteger)tag
                   withResolver:(RCTPromiseResolveBlock)resolve
                   withRejecter:(RCTPromiseRejectBlock)reject)
+
+RCT_EXTERN_METHOD(getDocumentPath:(NSInteger *)tag
+                  withResolver:(RCTPromiseResolveBlock)resolve
+                    withRejecter:(RCTPromiseRejectBlock)reject)
 //------------------------
 // v2.3.0 release
 // 扁平化文档

+ 490 - 481
ios/RCTDocumentManager.swift

@@ -15,485 +15,494 @@ import ComPDFKit
 
 @objc(CPDFViewManager)
 class RCTDocumentManager: NSObject, RCTBridgeModule {
-  static func moduleName() -> String! {
-    return "RCTDocumentManager"
-  }
-  
-  internal var bridge: RCTBridge!
-  
-  @objc func readerView() -> RCTCPDFReaderView {
-    self.bridge.module(for: RCTCPDFReaderView.self) as! RCTCPDFReaderView
-  }
-  
-  @objc(save: withResolver: withRejecter:)
-  func save(tag: Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.saveDocument(forCPDFViewTag: tag) { success in
-        if success {
-          resolve(success)
-        } else {
-          reject("save_failed", "Failed to save document", nil);
-        }
-      }
-    }
-  }
-  
-  @objc(setMargins: withEdges:)
-  func setMargins(tag : Int, edges: [Int]) -> Void {
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      if edges.count == 4 {
-        reader.setMargins(forCPDFViewTag: tag, left: edges[0], top: edges[1], right: edges[2], bottom: edges[3])
-      }
-    }
-  }
-  
-  @objc(removeAllAnnotations: withResolver: withRejecter:)
-  func removeAllAnnotations(tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.removeAllAnnotations(forCPDFViewTag: tag) { success in
-        if success {
-          resolve(success)
-        } else {
-          reject("remove_all_annotation_failed", "Failed to remove all annotation", nil);
-        }
-      }
-    }
-  }
-  
-  @objc(importAnnotations: withXfdfFile: withResolver: withRejecter:)
-  func importAnnotations(tag : Int, xfdfFile : URL, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.importAnnotations(forCPDFViewTag: tag, xfdfFile: xfdfFile) { success in
-        if success {
-          resolve(success)
-        } else {
-          reject("import_annotation_failed", "Failed to import annotation", nil);
-        }
-      }
-    }
-  }
-  
-  @objc(exportAnnotations: withResolver: withRejecter:)
-  func exportAnnotations(tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.exportAnnotations(forCPDFViewTag: tag) { xfdfFilePath in
-        resolve(xfdfFilePath)
-      }
-    }
-  }
-  
-  @objc(setDisplayPageIndex: withPageIndex:)
-  func setDisplayPageIndex(tag : Int, pageIndex : Int) -> Void {
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.setDisplayPageIndex(forCPDFViewTag: tag, pageIndex: pageIndex)
-    }
-  }
-  
-  @objc(getCurrentPageIndex: withResolver: withRejecter:)
-  func getCurrentPageIndex(tag : Int,resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.getCurrentPageIndex(forCPDFViewTag: tag) { pageIndex in
-        resolve(pageIndex)
-      }
-    }
-  }
-  
-  @objc(hasChange: withResolver: withRejecter:)
-  func hasChange(tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.hasChange(forCPDFViewTag: tag) { success in
-        resolve(success)
-      }
-    }
-  }
-  
-  @objc(setScale: withScaleValue:)
-  func setScale(tag : Int, scale : NSNumber) -> Void {
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.setScale(forCPDFViewTag: tag, scale: scale)
-    }
-  }
-  
-  @objc(getScale: withResolver: withRejecter:)
-  func getScale(tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.getScale(forCPDFViewTag: tag) { scale in
-        resolve(scale)
-      }
-    }
-  }
-  
-  @objc(setReadBackgroundColor: withThemes:)
-  func setReadBackgroundColor(tag : Int, themes : NSDictionary) -> Void{
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      let displayMode = themes["displayMode"] as? NSString ?? "light"
-      reader.setReadBackgroundColor(forCPDFViewTag: tag, displayMode: displayMode)
-    }
-  }
-  
-  @objc(getReadBackgroundColor: withResolver: withRejecter:)
-  func getReadBackgroundColor(tag: Int,  resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.getReadBackgroundColor(forCPDFViewTag: tag, completionHandler: {color in
-        resolve(color)
-      })
-    }
-  }
-  
-  @objc(setFormFieldHighlight: withFormFieldHighlight:)
-  func setFormFieldHighlight(tag: Int, formFieldHighlight : Bool) {
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.setFormFieldHighlight(forCPDFViewTag: tag, formFieldHighlight: formFieldHighlight)
-    }
-  }
-  
-  @objc(isFormFieldHighlight: withResolver: withRejecter:)
-  func isFormFieldHighlight(tag: Int,  resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.isFormFieldHighlight(forCPDFViewTag: tag, completionHandler: {highlight in
-        resolve(highlight)
-      })
-    }
-  }
-  
-  @objc(setLinkHighlight: withLinkHighlight:)
-  func setLinkHighlight(tag: Int, linkHighlight : Bool) {
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.setLinkHighlight(forCPDFViewTag: tag, linkHighlight: linkHighlight)
-    }
-  }
-  
-  @objc(isLinkHighlight: withResolver: withRejecter:)
-  func isLinkHighlight(tag: Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.isLinkHighlight(forCPDFViewTag: tag, completionHandler: {highlight in
-        resolve(highlight)
-      })
-    }
-  }
-  
-  @objc(setVerticalMode: withVerticalMode:)
-  func setVerticalMode(tag : Int, isVerticalMode : Bool){
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.setVerticalMode(forCPDFViewTag: tag, isVerticalMode: isVerticalMode)
-    }
-  }
-  
-  @objc(isVerticalMode: withResolver: withRejecter:)
-  func isVerticalMode(tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.isVerticalMode(forCPDFViewTag: tag, completionHandler: {isVertical in
-        resolve(isVertical)
-      })
-    }
-  }
-  
-  @objc(setContinueMode: withContiueMode:)
-  func setContinueMode(forCPDFViewTag tag : Int, isContinueMode : Bool) {
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.setContinueMode(forCPDFViewTag: tag, isContinueMode: isContinueMode)
-    }
-  }
-  
-  @objc(isContinueMode: withResolver: withRejecter:)
-  func isContinueMode(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.isContinueMode(forCPDFViewTag: tag, completionHandler: {isContinue in
-        resolve(isContinue)
-      })
-    }
-  }
-  
-  @objc(setDoublePageMode: withDoublePageMode:)
-  func setDoublePageMode(forCPDFViewTag tag : Int, isDoublePageMode : Bool) {
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.setDoublePageMode(forCPDFViewTag: tag, isDoublePageMode: isDoublePageMode)
-    }
-  }
-  
-  @objc(isDoublePageMode: withResolver: withRejecter:)
-  func isDoublePageMode(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.isDoublePageMode(forCPDFViewTag: tag, completionHandler: {isDoublePageMode in
-        resolve(isDoublePageMode)
-      })
-    }
-  }
-  
-  @objc(setCoverPageMode: withCoverPageMode:)
-  func setCoverPageMode(forCPDFViewTag tag : Int, isCoverPageMode : Bool) {
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.setCoverPageMode(forCPDFViewTag: tag, isCoverPageMode: isCoverPageMode)
-    }
-  }
-  
-  @objc(isCoverPageMode: withResolver: withRejecter:)
-  func isCoverPageMode(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.isCoverPageMode(forCPDFViewTag: tag, completionHandler: {isCoverPageMode in
-        resolve(isCoverPageMode)
-      })
-    }
-  }
-  
-  @objc(setCropMode: withCropMode:)
-  func setCropMode(forCPDFViewTag tag : Int, isCropMode : Bool) {
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.setCropMode(forCPDFViewTag: tag, isCropMode: isCropMode)
-    }
-  }
-  
-  @objc(isCropMode: withResolver: withRejecter:)
-  func isCropMode(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.isCropMode(forCPDFViewTag: tag, completionHandler: {isCropMode in
-        resolve(isCropMode)
-      })
-    }
-  }
-  
-  @objc(setPreviewMode: withViewMode:)
-  func setPreviewMode(forCPDFViewTag tag : Int, viewMode : String) {
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.setPreviewMode(forCPDFViewTag: tag, viewMode: viewMode)
-    }
-  }
-  
-  @objc(getPreviewMode: withResolver: withRejecter:)
-  func getPreviewMode(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.getPreviewMode(forCPDFViewTag: tag) { mode in
-        resolve(mode)
-      }
-    }
-  }
-  
-  @objc(showThumbnailView: withEditMode:)
-  func showThumbnailView(forCPDFViewTag tag : Int, isEditMode : Bool) {
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.showThumbnailView(forCPDFViewTag: tag, isEditMode: isEditMode)
-    }
-  }
-  
-  @objc(showBotaView:)
-  func showBotaView(forCPDFViewTag tag : Int) {
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.showBotaView(forCPDFViewTag: tag)
-    }
-  }
-  
-  @objc(showAddWatermarkView:withSaveAsNewFile:)
-  func showAddWatermarkView(forCPDFViewTag tag : Int, saveAsNewFile : Bool) {
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.showAddWatermarkView(forCPDFViewTag: tag, saveAsNewFile: saveAsNewFile)
-    }
-  }
-  
-  @objc(showSecurityView:)
-  func showSecurityView(forCPDFViewTag tag : Int) {
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.showSecurityView(forCPDFViewTag: tag)
-    }
-  }
-  
-  @objc(showDisplaySettingView:)
-  func showDisplaySettingView(forCPDFViewTag tag : Int) {
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.showDisplaySettingView(forCPDFViewTag: tag)
-    }
-  }
-  
-  @objc(enterSnipMode:)
-  func enterSnipMode(forCPDFViewTag tag : Int) {
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.enterSnipMode(forCPDFViewTag: tag)
-    }
-  }
-  
-  @objc(exitSnipMode:)
-  func exitSnipMode(forCPDFViewTag tag : Int) {
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.exitSnipMode(forCPDFViewTag: tag)
-    }
-  }
-  
-  @objc(open: withDocument: withPassword: withResolver: withRejecter:)
-  func open(forCPDFViewTag tag: Int, document : URL, password : String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.open(forCPDFViewTag: tag, document: document, password: password) { success in
-        resolve(success)
-      }
-    }
-  }
-  
-  @objc(getFileName: withResolver: withRejecter:)
-  func getFileName(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.getFileName(forCPDFViewTag: tag, completionHandler: {fileName in
-        resolve(fileName)
-      })
-    }
-  }
-  
-  @objc(isEncrypted: withResolver: withRejecter:)
-  func isEncrypted(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.isEncrypted(forCPDFViewTag: tag, completionHandler: {isEncrypted in
-        resolve(isEncrypted)
-      })
-    }
-  }
-  
-  @objc(isImageDoc: withResolver: withRejecter:)
-  func isImageDoc(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.isImageDoc(forCPDFViewTag: tag, completionHandler: {isImageDoc in
-        resolve(isImageDoc)
-      })
-    }
-  }
-  
-  @objc(getPermissions: withResolver: withRejecter:)
-  func getPermissions(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.getPermissions(forCPDFViewTag: tag, completionHandler: {permissions in
-        resolve(permissions)
-      })
-    }
-  }
-  
-  @objc(getPageCount: withResolver: withRejecter:)
-  func getPageCount(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.getPageCount(forCPDFViewTag: tag, completionHandler: {pageCount in
-        resolve(pageCount)
-      })
-    }
-  }
-  
-  @objc(checkOwnerUnlocked: withResolver: withRejecter:)
-  func checkOwnerUnlocked(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.checkOwnerUnlocked(forCPDFViewTag: tag, completionHandler: {unlocked in
-        resolve(unlocked)
-      })
-    }
-  }
-  
-  
-  @objc(checkOwnerPassword: withPassword: withResolver: withRejecter:)
-  func checkOwnerPassword(forCPDFViewTag tag : Int, password : String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.checkOwnerPassword(forCPDFViewTag: tag, password: password, completionHandler: {correct in
-        resolve(correct)
-      })
-    }
-  }
-  
-  @objc(removePassword: withResolver: withRejecter:)
-  func removePassword(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.removePassword(forCPDFViewTag: tag) { success in
-        resolve(success)
-      }
-    }
-  }
-  
-  @objc(setPassword: withInfo: withResolver: withRejecter:)
-  func setPassword(forCPDFViewTag tag : Int, info : NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.setPassword(forCPDFViewTag: tag, info: info) { success in
-        resolve(success)
-      }
-    }
-  }
-  
-  @objc(getEncryptAlgo: withResolver: withRejecter:)
-  func getEncryptAlgo(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.getEncryptAlgo(forCPDFViewTag: tag, completionHandler: {encryptAlgo in
-        resolve(encryptAlgo)
-      })
-    }
-  }
-  
-  @objc(printDocument:)
-  func printDocument(forCPDFViewTag tag : Int){
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.printDocument(forCPDFViewTag: tag)
-    }
-  }
-  
-  @objc(importWidgets: withXfdfFile: withResolver: withRejecter:)
-  func importWidgets(tag : Int, xfdfFile : URL, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.importWidgets(forCPDFViewTag: tag, xfdfFile: xfdfFile) { success in
-        if success {
-          resolve(success)
-        } else {
-          reject("import_widgets_failed", "Failed to import widgets", nil);
-        }
-      }
-    }
-  }
-  
-  @objc(exportWidgets: withResolver: withRejecter:)
-  func exportWidgets(tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
-    DispatchQueue.main.async {
-      let reader = self.readerView()
-      reader.exportWidgets(forCPDFViewTag: tag) { xfdfFilePath in
-        resolve(xfdfFilePath)
-      }
-    }
-  }
-  
-  
+    static func moduleName() -> String! {
+        return "RCTDocumentManager"
+    }
+    
+    internal var bridge: RCTBridge!
+    
+    @objc func readerView() -> RCTCPDFReaderView {
+        self.bridge.module(for: RCTCPDFReaderView.self) as! RCTCPDFReaderView
+    }
+    
+    @objc(save: withResolver: withRejecter:)
+    func save(tag: Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.saveDocument(forCPDFViewTag: tag) { success in
+                if success {
+                    resolve(success)
+                } else {
+                    reject("save_failed", "Failed to save document", nil);
+                }
+            }
+        }
+    }
+    
+    @objc(setMargins: withEdges:)
+    func setMargins(tag : Int, edges: [Int]) -> Void {
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            if edges.count == 4 {
+                reader.setMargins(forCPDFViewTag: tag, left: edges[0], top: edges[1], right: edges[2], bottom: edges[3])
+            }
+        }
+    }
+    
+    @objc(removeAllAnnotations: withResolver: withRejecter:)
+    func removeAllAnnotations(tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.removeAllAnnotations(forCPDFViewTag: tag) { success in
+                if success {
+                    resolve(success)
+                } else {
+                    reject("remove_all_annotation_failed", "Failed to remove all annotation", nil);
+                }
+            }
+        }
+    }
+    
+    @objc(importAnnotations: withXfdfFile: withResolver: withRejecter:)
+    func importAnnotations(tag : Int, xfdfFile : URL, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.importAnnotations(forCPDFViewTag: tag, xfdfFile: xfdfFile) { success in
+                if success {
+                    resolve(success)
+                } else {
+                    reject("import_annotation_failed", "Failed to import annotation", nil);
+                }
+            }
+        }
+    }
+    
+    @objc(exportAnnotations: withResolver: withRejecter:)
+    func exportAnnotations(tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.exportAnnotations(forCPDFViewTag: tag) { xfdfFilePath in
+                resolve(xfdfFilePath)
+            }
+        }
+    }
+    
+    @objc(setDisplayPageIndex: withPageIndex:)
+    func setDisplayPageIndex(tag : Int, pageIndex : Int) -> Void {
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.setDisplayPageIndex(forCPDFViewTag: tag, pageIndex: pageIndex)
+        }
+    }
+    
+    @objc(getCurrentPageIndex: withResolver: withRejecter:)
+    func getCurrentPageIndex(tag : Int,resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.getCurrentPageIndex(forCPDFViewTag: tag) { pageIndex in
+                resolve(pageIndex)
+            }
+        }
+    }
+    
+    @objc(hasChange: withResolver: withRejecter:)
+    func hasChange(tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.hasChange(forCPDFViewTag: tag) { success in
+                resolve(success)
+            }
+        }
+    }
+    
+    @objc(setScale: withScaleValue:)
+    func setScale(tag : Int, scale : NSNumber) -> Void {
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.setScale(forCPDFViewTag: tag, scale: scale)
+        }
+    }
+    
+    @objc(getScale: withResolver: withRejecter:)
+    func getScale(tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.getScale(forCPDFViewTag: tag) { scale in
+                resolve(scale)
+            }
+        }
+    }
+    
+    @objc(setReadBackgroundColor: withThemes:)
+    func setReadBackgroundColor(tag : Int, themes : NSDictionary) -> Void{
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            let displayMode = themes["displayMode"] as? NSString ?? "light"
+            reader.setReadBackgroundColor(forCPDFViewTag: tag, displayMode: displayMode)
+        }
+    }
+    
+    @objc(getReadBackgroundColor: withResolver: withRejecter:)
+    func getReadBackgroundColor(tag: Int,  resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.getReadBackgroundColor(forCPDFViewTag: tag, completionHandler: {color in
+                resolve(color)
+            })
+        }
+    }
+    
+    @objc(setFormFieldHighlight: withFormFieldHighlight:)
+    func setFormFieldHighlight(tag: Int, formFieldHighlight : Bool) {
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.setFormFieldHighlight(forCPDFViewTag: tag, formFieldHighlight: formFieldHighlight)
+        }
+    }
+    
+    @objc(isFormFieldHighlight: withResolver: withRejecter:)
+    func isFormFieldHighlight(tag: Int,  resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.isFormFieldHighlight(forCPDFViewTag: tag, completionHandler: {highlight in
+                resolve(highlight)
+            })
+        }
+    }
+    
+    @objc(setLinkHighlight: withLinkHighlight:)
+    func setLinkHighlight(tag: Int, linkHighlight : Bool) {
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.setLinkHighlight(forCPDFViewTag: tag, linkHighlight: linkHighlight)
+        }
+    }
+    
+    @objc(isLinkHighlight: withResolver: withRejecter:)
+    func isLinkHighlight(tag: Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.isLinkHighlight(forCPDFViewTag: tag, completionHandler: {highlight in
+                resolve(highlight)
+            })
+        }
+    }
+    
+    @objc(setVerticalMode: withVerticalMode:)
+    func setVerticalMode(tag : Int, isVerticalMode : Bool){
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.setVerticalMode(forCPDFViewTag: tag, isVerticalMode: isVerticalMode)
+        }
+    }
+    
+    @objc(isVerticalMode: withResolver: withRejecter:)
+    func isVerticalMode(tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.isVerticalMode(forCPDFViewTag: tag, completionHandler: {isVertical in
+                resolve(isVertical)
+            })
+        }
+    }
+    
+    @objc(setContinueMode: withContiueMode:)
+    func setContinueMode(forCPDFViewTag tag : Int, isContinueMode : Bool) {
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.setContinueMode(forCPDFViewTag: tag, isContinueMode: isContinueMode)
+        }
+    }
+    
+    @objc(isContinueMode: withResolver: withRejecter:)
+    func isContinueMode(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.isContinueMode(forCPDFViewTag: tag, completionHandler: {isContinue in
+                resolve(isContinue)
+            })
+        }
+    }
+    
+    @objc(setDoublePageMode: withDoublePageMode:)
+    func setDoublePageMode(forCPDFViewTag tag : Int, isDoublePageMode : Bool) {
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.setDoublePageMode(forCPDFViewTag: tag, isDoublePageMode: isDoublePageMode)
+        }
+    }
+    
+    @objc(isDoublePageMode: withResolver: withRejecter:)
+    func isDoublePageMode(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.isDoublePageMode(forCPDFViewTag: tag, completionHandler: {isDoublePageMode in
+                resolve(isDoublePageMode)
+            })
+        }
+    }
+    
+    @objc(setCoverPageMode: withCoverPageMode:)
+    func setCoverPageMode(forCPDFViewTag tag : Int, isCoverPageMode : Bool) {
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.setCoverPageMode(forCPDFViewTag: tag, isCoverPageMode: isCoverPageMode)
+        }
+    }
+    
+    @objc(isCoverPageMode: withResolver: withRejecter:)
+    func isCoverPageMode(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.isCoverPageMode(forCPDFViewTag: tag, completionHandler: {isCoverPageMode in
+                resolve(isCoverPageMode)
+            })
+        }
+    }
+    
+    @objc(setCropMode: withCropMode:)
+    func setCropMode(forCPDFViewTag tag : Int, isCropMode : Bool) {
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.setCropMode(forCPDFViewTag: tag, isCropMode: isCropMode)
+        }
+    }
+    
+    @objc(isCropMode: withResolver: withRejecter:)
+    func isCropMode(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.isCropMode(forCPDFViewTag: tag, completionHandler: {isCropMode in
+                resolve(isCropMode)
+            })
+        }
+    }
+    
+    @objc(setPreviewMode: withViewMode:)
+    func setPreviewMode(forCPDFViewTag tag : Int, viewMode : String) {
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.setPreviewMode(forCPDFViewTag: tag, viewMode: viewMode)
+        }
+    }
+    
+    @objc(getPreviewMode: withResolver: withRejecter:)
+    func getPreviewMode(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.getPreviewMode(forCPDFViewTag: tag) { mode in
+                resolve(mode)
+            }
+        }
+    }
+    
+    @objc(showThumbnailView: withEditMode:)
+    func showThumbnailView(forCPDFViewTag tag : Int, isEditMode : Bool) {
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.showThumbnailView(forCPDFViewTag: tag, isEditMode: isEditMode)
+        }
+    }
+    
+    @objc(showBotaView:)
+    func showBotaView(forCPDFViewTag tag : Int) {
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.showBotaView(forCPDFViewTag: tag)
+        }
+    }
+    
+    @objc(showAddWatermarkView:withSaveAsNewFile:)
+    func showAddWatermarkView(forCPDFViewTag tag : Int, saveAsNewFile : Bool) {
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.showAddWatermarkView(forCPDFViewTag: tag, saveAsNewFile: saveAsNewFile)
+        }
+    }
+    
+    @objc(showSecurityView:)
+    func showSecurityView(forCPDFViewTag tag : Int) {
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.showSecurityView(forCPDFViewTag: tag)
+        }
+    }
+    
+    @objc(showDisplaySettingView:)
+    func showDisplaySettingView(forCPDFViewTag tag : Int) {
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.showDisplaySettingView(forCPDFViewTag: tag)
+        }
+    }
+    
+    @objc(enterSnipMode:)
+    func enterSnipMode(forCPDFViewTag tag : Int) {
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.enterSnipMode(forCPDFViewTag: tag)
+        }
+    }
+    
+    @objc(exitSnipMode:)
+    func exitSnipMode(forCPDFViewTag tag : Int) {
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.exitSnipMode(forCPDFViewTag: tag)
+        }
+    }
+    
+    @objc(open: withDocument: withPassword: withResolver: withRejecter:)
+    func open(forCPDFViewTag tag: Int, document : URL, password : String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.open(forCPDFViewTag: tag, document: document, password: password) { success in
+                resolve(success)
+            }
+        }
+    }
+    
+    @objc(getFileName: withResolver: withRejecter:)
+    func getFileName(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.getFileName(forCPDFViewTag: tag, completionHandler: {fileName in
+                resolve(fileName)
+            })
+        }
+    }
+    
+    @objc(isEncrypted: withResolver: withRejecter:)
+    func isEncrypted(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.isEncrypted(forCPDFViewTag: tag, completionHandler: {isEncrypted in
+                resolve(isEncrypted)
+            })
+        }
+    }
+    
+    @objc(isImageDoc: withResolver: withRejecter:)
+    func isImageDoc(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.isImageDoc(forCPDFViewTag: tag, completionHandler: {isImageDoc in
+                resolve(isImageDoc)
+            })
+        }
+    }
+    
+    @objc(getPermissions: withResolver: withRejecter:)
+    func getPermissions(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.getPermissions(forCPDFViewTag: tag, completionHandler: {permissions in
+                resolve(permissions)
+            })
+        }
+    }
+    
+    @objc(getPageCount: withResolver: withRejecter:)
+    func getPageCount(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.getPageCount(forCPDFViewTag: tag, completionHandler: {pageCount in
+                resolve(pageCount)
+            })
+        }
+    }
+    
+    @objc(checkOwnerUnlocked: withResolver: withRejecter:)
+    func checkOwnerUnlocked(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.checkOwnerUnlocked(forCPDFViewTag: tag, completionHandler: {unlocked in
+                resolve(unlocked)
+            })
+        }
+    }
+    
+    
+    @objc(checkOwnerPassword: withPassword: withResolver: withRejecter:)
+    func checkOwnerPassword(forCPDFViewTag tag : Int, password : String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.checkOwnerPassword(forCPDFViewTag: tag, password: password, completionHandler: {correct in
+                resolve(correct)
+            })
+        }
+    }
+    
+    @objc(removePassword: withResolver: withRejecter:)
+    func removePassword(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.removePassword(forCPDFViewTag: tag) { success in
+                resolve(success)
+            }
+        }
+    }
+    
+    @objc(setPassword: withInfo: withResolver: withRejecter:)
+    func setPassword(forCPDFViewTag tag : Int, info : NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.setPassword(forCPDFViewTag: tag, info: info) { success in
+                resolve(success)
+            }
+        }
+    }
+    
+    @objc(getEncryptAlgo: withResolver: withRejecter:)
+    func getEncryptAlgo(forCPDFViewTag tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.getEncryptAlgo(forCPDFViewTag: tag, completionHandler: {encryptAlgo in
+                resolve(encryptAlgo)
+            })
+        }
+    }
+    
+    @objc(printDocument:)
+    func printDocument(forCPDFViewTag tag : Int){
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.printDocument(forCPDFViewTag: tag)
+        }
+    }
+    
+    @objc(importWidgets: withXfdfFile: withResolver: withRejecter:)
+    func importWidgets(tag : Int, xfdfFile : URL, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.importWidgets(forCPDFViewTag: tag, xfdfFile: xfdfFile) { success in
+                if success {
+                    resolve(success)
+                } else {
+                    reject("import_widgets_failed", "Failed to import widgets", nil);
+                }
+            }
+        }
+    }
+    
+    @objc(exportWidgets: withResolver: withRejecter:)
+    func exportWidgets(tag : Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.exportWidgets(forCPDFViewTag: tag) { xfdfFilePath in
+                resolve(xfdfFilePath)
+            }
+        }
+    }
+    
+    @objc(getDocumentPath: withResolver: withRejecter:)
+    func getDocumentPath(forCPDFViewTag tag : Int , resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock){
+        DispatchQueue.main.async {
+            let reader = self.readerView()
+            reader.getDocumentPath(forCPDFViewTag: tag) { path in
+                resolve(path)
+            }
+        }
+    }
+    
 }