Browse Source

compdfkit(rn) - 新增获取表单json数据

liuxiaolong 1 week ago
parent
commit
5f1462438f
25 changed files with 521 additions and 65 deletions
  1. 12 3
      android/src/main/java/com/compdfkitpdf/reactnative/modules/CPDFViewModule.java
  2. 10 2
      android/src/main/java/com/compdfkitpdf/reactnative/util/CPDFPageUtil.java
  3. 62 34
      android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/RCPDFAnnotFactory.java
  4. 0 1
      android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/RCPDFAnnotation.java
  5. 47 0
      android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/RCPDFBaseAnnotation.java
  6. 18 0
      android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/RCPDFCircleAnnotation.java
  7. 27 0
      android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/RCPDFInkAnnotation.java
  8. 18 0
      android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/RCPDFLineAnnotation.java
  9. 4 21
      android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/RCPDFMarkupAnnotation.java
  10. 25 0
      android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/RCPDFNoteAnnotation.java
  11. 18 0
      android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/RCPDFSquareAnnotation.java
  12. 58 0
      android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/forms/RCPDFBaseForms.java
  13. 22 0
      android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/forms/RCPDFCheckBoxForms.java
  14. 30 0
      android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/forms/RCPDFComboBoxForms.java
  15. 20 0
      android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/forms/RCPDFForms.java
  16. 31 0
      android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/forms/RCPDFListBoxForms.java
  17. 22 0
      android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/forms/RCPDFRadioButtonForms.java
  18. 21 0
      android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/forms/RCPDFSignatureFieldsForms.java
  19. 21 0
      android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/forms/RCPDFTextFieldForms.java
  20. 6 0
      android/src/main/java/com/compdfkitpdf/reactnative/viewmanager/CPDFViewManager.java
  21. BIN
      example/android/app/src/main/assets/annot_test.pdf
  22. 7 1
      example/src/CPDFAnnotationsExample.tsx
  23. 27 1
      src/annotation/CPDFAnnotation.tsx
  24. 7 0
      src/annotation/CPDFMarkupAnnotation.tsx
  25. 8 2
      src/page/CPDFPage.tsx

+ 12 - 3
android/src/main/java/com/compdfkitpdf/reactnative/modules/CPDFViewModule.java

@@ -11,6 +11,7 @@ package com.compdfkitpdf.reactnative.modules;
 import android.text.TextUtils;
 import android.util.Log;
 import androidx.annotation.NonNull;
+import com.compdfkit.tools.common.utils.threadpools.CThreadPoolUtils;
 import com.compdfkitpdf.reactnative.viewmanager.CPDFViewManager;
 import com.facebook.react.bridge.Promise;
 import com.facebook.react.bridge.ReactApplicationContext;
@@ -455,12 +456,20 @@ public class CPDFViewModule extends ReactContextBaseJavaModule {
   @ReactMethod
   public void getAnnotations(int tag, int pageIndex, Promise promise){
     uiBlock(nativeViewHierarchyManager -> {
-      promise.resolve(mPDFViewInstance.getAnnotations(tag, pageIndex));
+      CThreadPoolUtils.getInstance().executeIO(()->{
+        promise.resolve(mPDFViewInstance.getAnnotations(tag, pageIndex));
+      });
     });
   }
 
-
-
+  @ReactMethod
+  public void getForms(int tag, int pageIndex, Promise promise){
+    uiBlock(nativeViewHierarchyManager -> {
+      CThreadPoolUtils.getInstance().executeIO(()->{
+        promise.resolve(mPDFViewInstance.getForms(tag, pageIndex));
+      });
+    });
+  }
 
   private void uiBlock(UIBlock uiBlock) {
     UIManagerModule uiManager = getReactApplicationContext().getNativeModule(UIManagerModule.class);

+ 10 - 2
android/src/main/java/com/compdfkitpdf/reactnative/util/CPDFPageUtil.java

@@ -39,8 +39,16 @@ public class CPDFPageUtil {
     }
     CPDFPage page = document.pageAtIndex(pageIndex);
     RCPDFAnnotFactory annotFactory = new RCPDFAnnotFactory(page);
-    WritableArray array = annotFactory.getAnnotations();
-    return array;
+    return annotFactory.getAnnotations();
+  }
+
+  public WritableArray getForms(int pageIndex){
+    if (document == null) {
+      return null;
+    }
+    CPDFPage page = document.pageAtIndex(pageIndex);
+    RCPDFAnnotFactory annotFactory = new RCPDFAnnotFactory(page);
+    return annotFactory.getForms();
   }
 
 

+ 62 - 34
android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/RCPDFAnnotFactory.java

@@ -1,67 +1,95 @@
 package com.compdfkitpdf.reactnative.util.annotation;
 
-import android.hardware.lights.LightState;
-import com.compdfkit.core.annotation.CPDFAnnotation;
 import com.compdfkit.core.annotation.CPDFAnnotation.Type;
+import com.compdfkit.core.annotation.form.CPDFWidget.WidgetType;
 import com.compdfkit.core.page.CPDFPage;
+import com.compdfkitpdf.reactnative.util.annotation.forms.RCPDFBaseForms;
+import com.compdfkitpdf.reactnative.util.annotation.forms.RCPDFCheckBoxForms;
+import com.compdfkitpdf.reactnative.util.annotation.forms.RCPDFComboBoxForms;
+import com.compdfkitpdf.reactnative.util.annotation.forms.RCPDFForms;
+import com.compdfkitpdf.reactnative.util.annotation.forms.RCPDFListBoxForms;
+import com.compdfkitpdf.reactnative.util.annotation.forms.RCPDFRadioButtonForms;
+import com.compdfkitpdf.reactnative.util.annotation.forms.RCPDFSignatureFieldsForms;
+import com.compdfkitpdf.reactnative.util.annotation.forms.RCPDFTextFieldForms;
 import com.facebook.react.bridge.Arguments;
 import com.facebook.react.bridge.WritableArray;
-import com.facebook.react.bridge.WritableMap;
-import java.util.Arrays;
 import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 
-/**
- * @classname:
- * @author: LiuXiaoLong
- * @date: 2025/3/3 description:
- */
 public class RCPDFAnnotFactory {
 
-
   private CPDFPage cpdfPage;
 
   HashMap<Type, RCPDFAnnotation> annotImpls = new HashMap<>();
+  HashMap<WidgetType, RCPDFForms> formImpls = new HashMap<>();
 
   public RCPDFAnnotFactory(CPDFPage cpdfPage) {
     this.cpdfPage = cpdfPage;
     annotImpls = getAnnotImpls();
+    formImpls = getFormImpls();
   }
 
-  public WritableArray getAnnotations(CPDFAnnotation.Type type){
-    RCPDFAnnotation annotImpl = annotImpls.get(type);
-    if (annotImpl != null){
-      return annotImpl.getAnnotation(type);
-    }
-      return Arguments.createArray();
+  private HashMap<Type, RCPDFAnnotation> getAnnotImpls(){
+    HashMap<Type, RCPDFAnnotation> map = new HashMap<>();
+    RCPDFMarkupAnnotation markupAnnotation = new RCPDFMarkupAnnotation(cpdfPage);
+    map.put(Type.TEXT, new RCPDFNoteAnnotation(cpdfPage));
+    map.put(Type.HIGHLIGHT, markupAnnotation);
+    map.put(Type.UNDERLINE, markupAnnotation);
+    map.put(Type.SQUIGGLY, markupAnnotation);
+    map.put(Type.STRIKEOUT, markupAnnotation);
+    map.put(Type.INK, new RCPDFInkAnnotation(cpdfPage));
+    map.put(Type.CIRCLE, markupAnnotation);
+    map.put(Type.SQUARE, markupAnnotation);
+    map.put(Type.LINE, markupAnnotation);
+    map.put(Type.STAMP, markupAnnotation);
+    map.put(Type.FREETEXT, markupAnnotation);
+    map.put(Type.SOUND, markupAnnotation);
+    return map;
+  }
+
+  private HashMap<WidgetType, RCPDFForms> getFormImpls(){
+    HashMap<WidgetType, RCPDFForms> map = new HashMap<>();
+    map.put(WidgetType.Widget_TextField, new RCPDFTextFieldForms(cpdfPage));
+    map.put(WidgetType.Widget_ListBox, new RCPDFListBoxForms(cpdfPage));
+    map.put(WidgetType.Widget_ComboBox,  new RCPDFComboBoxForms(cpdfPage));
+    map.put(WidgetType.Widget_RadioButton,  new RCPDFRadioButtonForms(cpdfPage));
+    map.put(WidgetType.Widget_CheckBox,  new RCPDFCheckBoxForms(cpdfPage));
+    map.put(WidgetType.Widget_SignatureFields,  new RCPDFSignatureFieldsForms(cpdfPage));
+    return map;
   }
 
   public WritableArray getAnnotations(){
     WritableArray array = Arguments.createArray();
-    RCPDFMarkupAnnotation markupAnnotation = new RCPDFMarkupAnnotation(cpdfPage);
     for (Type type : annotImpls.keySet()) {
-      
+      RCPDFAnnotation rcpdfAnnotation = annotImpls.get(type);
+      if (rcpdfAnnotation != null){
+        WritableArray writableArray = rcpdfAnnotation.getAnnotation(type);
+        if (writableArray != null && writableArray.size() > 0){
+          for (int i = 0; i < writableArray.size(); i++) {
+            array.pushMap(writableArray.getMap(i));
+          }
+        }
+      }
     }
     return array;
   }
 
-  private List<RCPDFAnnotation> getAnnotImpl(Type type){
-    return Arrays.asList(
-      new RCPDFMarkupAnnotation(cpdfPage)
-    );
-  }
-
 
-  private HashMap<Type, RCPDFAnnotation> getAnnotImpls(){
-    HashMap<Type, RCPDFAnnotation> map = new HashMap<>();
-    RCPDFMarkupAnnotation markupAnnotation = new RCPDFMarkupAnnotation(cpdfPage);
-    map.put(Type.HIGHLIGHT, markupAnnotation);
-    map.put(Type.UNDERLINE, markupAnnotation);
-    map.put(Type.SQUIGGLY, markupAnnotation);
-    map.put(Type.STRIKEOUT, markupAnnotation);
-    return map;
+  public WritableArray getForms(){
+    WritableArray array = Arguments.createArray();
+    for (WidgetType widgetType : formImpls.keySet()) {
+      RCPDFForms rcpdfForms = formImpls.get(widgetType);
+      if (rcpdfForms != null){
+        WritableArray writableArray = rcpdfForms.getForm(widgetType);
+        if (writableArray != null && writableArray.size() > 0){
+          for (int i = 0; i < writableArray.size(); i++) {
+            array.pushMap(writableArray.getMap(i));
+          }
+        }
+      }
+    }
+    return array;
   }
 
 
+
 }

+ 0 - 1
android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/RCPDFAnnotation.java

@@ -12,7 +12,6 @@ package com.compdfkitpdf.reactnative.util.annotation;
 
 import com.compdfkit.core.annotation.CPDFAnnotation;
 import com.facebook.react.bridge.WritableArray;
-import com.facebook.react.bridge.WritableMap;
 
 public interface RCPDFAnnotation {
 

+ 47 - 0
android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/RCPDFBaseAnnotation.java

@@ -0,0 +1,47 @@
+package com.compdfkitpdf.reactnative.util.annotation;
+
+
+import com.compdfkit.core.annotation.CPDFAnnotation;
+import com.compdfkit.core.annotation.CPDFAnnotation.Type;
+import com.compdfkit.core.annotation.CPDFMarkupAnnotation;
+import com.compdfkit.core.page.CPDFPage;
+import com.facebook.react.bridge.Arguments;
+import com.facebook.react.bridge.WritableArray;
+import com.facebook.react.bridge.WritableMap;
+import java.util.List;
+
+public abstract class RCPDFBaseAnnotation implements RCPDFAnnotation{
+
+  protected CPDFPage page;
+
+  private List<CPDFAnnotation> cachedAnnotations;
+
+  public RCPDFBaseAnnotation(CPDFPage page) {
+    this.page = page;
+    cachedAnnotations = page.getAnnotations();
+
+  }
+
+
+  @Override
+  public WritableArray getAnnotation(Type type) {
+    if (cachedAnnotations == null || !page.isValid()){
+      return null;
+    }
+    WritableArray array = Arguments.createArray();
+    for (CPDFAnnotation annotation : cachedAnnotations) {
+      if (annotation.getType() == type) {
+        WritableMap map = Arguments.createMap();
+        map.putString("type", type.name().toLowerCase());
+        map.putInt("page", annotation.pdfPage.getPageNum());
+        map.putString("title", annotation.getTitle());
+        map.putString("content", annotation.getContent());
+        covert(annotation, map);
+        array.pushMap(map);
+      }
+    }
+    return array;
+  }
+
+  public abstract void covert(CPDFAnnotation annotation, WritableMap map);
+}

+ 18 - 0
android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/RCPDFCircleAnnotation.java

@@ -0,0 +1,18 @@
+package com.compdfkitpdf.reactnative.util.annotation;
+
+
+import com.compdfkit.core.annotation.CPDFAnnotation;
+import com.compdfkit.core.page.CPDFPage;
+import com.facebook.react.bridge.WritableMap;
+
+public class RCPDFCircleAnnotation extends RCPDFBaseAnnotation{
+
+
+  public RCPDFCircleAnnotation(CPDFPage page) {
+    super(page);
+  }
+
+  @Override
+  public void covert(CPDFAnnotation annotation, WritableMap map) {
+  }
+}

+ 27 - 0
android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/RCPDFInkAnnotation.java

@@ -0,0 +1,27 @@
+package com.compdfkitpdf.reactnative.util.annotation;
+
+
+import com.compdfkit.core.annotation.CPDFAnnotation;
+import com.compdfkit.core.annotation.CPDFAnnotation.Type;
+import com.compdfkit.core.annotation.CPDFInkAnnotation;
+import com.compdfkit.core.annotation.CPDFTextAnnotation;
+import com.compdfkit.core.page.CPDFPage;
+import com.facebook.react.bridge.Arguments;
+import com.facebook.react.bridge.WritableArray;
+import com.facebook.react.bridge.WritableMap;
+import java.util.List;
+
+public class RCPDFInkAnnotation extends RCPDFBaseAnnotation{
+
+
+  public RCPDFInkAnnotation(CPDFPage page) {
+    super(page);
+  }
+
+  @Override
+  public void covert(CPDFAnnotation annotation, WritableMap map) {
+
+  }
+
+
+}

+ 18 - 0
android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/RCPDFLineAnnotation.java

@@ -0,0 +1,18 @@
+package com.compdfkitpdf.reactnative.util.annotation;
+
+
+import com.compdfkit.core.annotation.CPDFAnnotation;
+import com.compdfkit.core.page.CPDFPage;
+import com.facebook.react.bridge.WritableMap;
+
+public class RCPDFLineAnnotation extends RCPDFBaseAnnotation{
+
+
+  public RCPDFLineAnnotation(CPDFPage page) {
+    super(page);
+  }
+
+  @Override
+  public void covert(CPDFAnnotation annotation, WritableMap map) {
+  }
+}

+ 4 - 21
android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/RCPDFMarkupAnnotation.java

@@ -11,32 +11,15 @@ import com.facebook.react.bridge.WritableArray;
 import com.facebook.react.bridge.WritableMap;
 import java.util.List;
 
-public class RCPDFMarkupAnnotation implements RCPDFAnnotation{
+public class RCPDFMarkupAnnotation extends RCPDFBaseAnnotation{
 
-  CPDFPage page;
 
   public RCPDFMarkupAnnotation(CPDFPage page) {
-    this.page = page;
+    super(page);
   }
 
   @Override
-  public WritableArray getAnnotation(Type type) {
-    List<CPDFAnnotation> annotations = page.getAnnotations();
-    if (annotations == null || !page.isValid()){
-      return null;
-    }
-    WritableArray array = Arguments.createArray();
-    for (CPDFAnnotation annotation : annotations) {
-      if (annotation.getType() == type) {
-        WritableMap map = Arguments.createMap();
-        CPDFMarkupAnnotation markupAnnotation = (CPDFMarkupAnnotation) annotation;
-        map.putString("type", type.name().toLowerCase());
-        map.putInt("page", markupAnnotation.pdfPage.getPageNum());
-        map.putString("title", markupAnnotation.getTitle());
-        map.putString("content", markupAnnotation.getContent());
-        array.pushMap(map);
-      }
-    }
-    return array;
+  public void covert(CPDFAnnotation annotation, WritableMap map) {
+
   }
 }

+ 25 - 0
android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/RCPDFNoteAnnotation.java

@@ -0,0 +1,25 @@
+package com.compdfkitpdf.reactnative.util.annotation;
+
+
+import com.compdfkit.core.annotation.CPDFAnnotation;
+import com.compdfkit.core.annotation.CPDFAnnotation.Type;
+import com.compdfkit.core.annotation.CPDFMarkupAnnotation;
+import com.compdfkit.core.annotation.CPDFTextAnnotation;
+import com.compdfkit.core.page.CPDFPage;
+import com.facebook.react.bridge.Arguments;
+import com.facebook.react.bridge.WritableArray;
+import com.facebook.react.bridge.WritableMap;
+import java.util.List;
+
+public class RCPDFNoteAnnotation extends RCPDFBaseAnnotation{
+
+
+  public RCPDFNoteAnnotation(CPDFPage page) {
+    super(page);
+  }
+
+  @Override
+  public void covert(CPDFAnnotation annotation, WritableMap map) {
+    map.putString("type", "note");
+  }
+}

+ 18 - 0
android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/RCPDFSquareAnnotation.java

@@ -0,0 +1,18 @@
+package com.compdfkitpdf.reactnative.util.annotation;
+
+
+import com.compdfkit.core.annotation.CPDFAnnotation;
+import com.compdfkit.core.page.CPDFPage;
+import com.facebook.react.bridge.WritableMap;
+
+public class RCPDFSquareAnnotation extends RCPDFBaseAnnotation{
+
+
+  public RCPDFSquareAnnotation(CPDFPage page) {
+    super(page);
+  }
+
+  @Override
+  public void covert(CPDFAnnotation annotation, WritableMap map) {
+  }
+}

+ 58 - 0
android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/forms/RCPDFBaseForms.java

@@ -0,0 +1,58 @@
+/**
+ * Copyright © 2014-2025 PDF Technologies, Inc. All Rights Reserved.
+ * <p>
+ * 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.
+ */
+package com.compdfkitpdf.reactnative.util.annotation.forms;
+
+
+
+import com.compdfkit.core.annotation.CPDFAnnotation;
+import com.compdfkit.core.annotation.CPDFAnnotation.Type;
+import com.compdfkit.core.annotation.form.CPDFWidget;
+import com.compdfkit.core.annotation.form.CPDFWidget.WidgetType;
+import com.compdfkit.core.page.CPDFPage;
+import com.facebook.react.bridge.Arguments;
+import com.facebook.react.bridge.WritableArray;
+import com.facebook.react.bridge.WritableMap;
+import java.util.List;
+
+public abstract class RCPDFBaseForms implements RCPDFForms {
+
+  protected CPDFPage page;
+
+  private List<CPDFAnnotation> cachedAnnotations;
+
+  public RCPDFBaseForms(CPDFPage page) {
+    this.page = page;
+    cachedAnnotations = page.getAnnotations();
+  }
+
+  @Override
+  public WritableArray getForm(WidgetType widgetType) {
+    if (cachedAnnotations == null || !page.isValid()) {
+      return null;
+    }
+    WritableArray array = Arguments.createArray();
+    for (CPDFAnnotation annotation : cachedAnnotations) {
+      if (annotation.getType() != Type.WIDGET) {
+        continue;
+      }
+      CPDFWidget widget = (CPDFWidget) annotation;
+      if (widget.getWidgetType() != widgetType) {
+        continue;
+      }
+      WritableMap map = Arguments.createMap();
+      map.putInt("page", widget.pdfPage.getPageNum());
+      map.putString("title", widget.getTitle());
+      covert(annotation, map);
+      array.pushMap(map);
+    }
+    return array;
+  }
+
+  public abstract void covert(CPDFAnnotation annotation, WritableMap map);
+}

+ 22 - 0
android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/forms/RCPDFCheckBoxForms.java

@@ -0,0 +1,22 @@
+package com.compdfkitpdf.reactnative.util.annotation.forms;
+
+import com.compdfkit.core.annotation.CPDFAnnotation;
+import com.compdfkit.core.annotation.form.CPDFCheckboxWidget;
+import com.compdfkit.core.annotation.form.CPDFComboboxWidget;
+import com.compdfkit.core.page.CPDFPage;
+import com.facebook.react.bridge.WritableMap;
+
+
+public class RCPDFCheckBoxForms extends RCPDFBaseForms{
+
+  public RCPDFCheckBoxForms(CPDFPage page) {
+    super(page);
+  }
+
+  @Override
+  public void covert(CPDFAnnotation annotation, WritableMap map) {
+    CPDFCheckboxWidget checkboxWidget = (CPDFCheckboxWidget) annotation;
+    map.putString("type", "checkBox");
+    map.putBoolean("isChecked", checkboxWidget.isChecked());
+  }
+}

+ 30 - 0
android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/forms/RCPDFComboBoxForms.java

@@ -0,0 +1,30 @@
+package com.compdfkitpdf.reactnative.util.annotation.forms;
+
+import com.compdfkit.core.annotation.CPDFAnnotation;
+import com.compdfkit.core.annotation.form.CPDFComboboxWidget;
+import com.compdfkit.core.annotation.form.CPDFListboxWidget;
+import com.compdfkit.core.annotation.form.CPDFWidgetItem;
+import com.compdfkit.core.page.CPDFPage;
+import com.facebook.react.bridge.WritableMap;
+
+
+public class RCPDFComboBoxForms extends RCPDFBaseForms{
+
+  public RCPDFComboBoxForms(CPDFPage page) {
+    super(page);
+  }
+
+  @Override
+  public void covert(CPDFAnnotation annotation, WritableMap map) {
+    CPDFComboboxWidget comboBoxWidget = (CPDFComboboxWidget) annotation;
+    map.putString("type", "comboBox");
+    int[] selectedIndexs = comboBoxWidget.getSelectedIndexes();
+    CPDFWidgetItem selectedItem = null;
+    if (selectedIndexs != null && selectedIndexs.length > 0) {
+      selectedItem = comboBoxWidget.getOptionByIndex(selectedIndexs[0]);
+    }
+    if (selectedItem != null){
+      map.putString("value", selectedItem.text);
+    }
+  }
+}

+ 20 - 0
android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/forms/RCPDFForms.java

@@ -0,0 +1,20 @@
+/**
+ * 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.
+ */
+package com.compdfkitpdf.reactnative.util.annotation.forms;
+
+import com.compdfkit.core.annotation.form.CPDFWidget.WidgetType;
+import com.facebook.react.bridge.WritableArray;
+
+
+public interface RCPDFForms {
+
+
+  public WritableArray getForm(WidgetType widgetType);
+
+}

+ 31 - 0
android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/forms/RCPDFListBoxForms.java

@@ -0,0 +1,31 @@
+package com.compdfkitpdf.reactnative.util.annotation.forms;
+
+import com.compdfkit.core.annotation.CPDFAnnotation;
+import com.compdfkit.core.annotation.form.CPDFListboxWidget;
+import com.compdfkit.core.annotation.form.CPDFTextWidget;
+import com.compdfkit.core.annotation.form.CPDFWidgetItem;
+import com.compdfkit.core.page.CPDFPage;
+import com.facebook.react.bridge.WritableMap;
+
+
+public class RCPDFListBoxForms extends RCPDFBaseForms{
+
+  public RCPDFListBoxForms(CPDFPage page) {
+    super(page);
+  }
+
+  @Override
+  public void covert(CPDFAnnotation annotation, WritableMap map) {
+    CPDFListboxWidget listboxWidget = (CPDFListboxWidget) annotation;
+    map.putString("type", "listBox");
+
+    int[] selectedIndexs = listboxWidget.getSelectedIndexes();
+    CPDFWidgetItem selectedItem = null;
+    if (selectedIndexs != null && selectedIndexs.length > 0) {
+      selectedItem = listboxWidget.getOptionByIndex(selectedIndexs[0]);
+    }
+    if (selectedItem != null){
+      map.putString("value", selectedItem.text);
+    }
+  }
+}

+ 22 - 0
android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/forms/RCPDFRadioButtonForms.java

@@ -0,0 +1,22 @@
+package com.compdfkitpdf.reactnative.util.annotation.forms;
+
+import com.compdfkit.core.annotation.CPDFAnnotation;
+import com.compdfkit.core.annotation.form.CPDFComboboxWidget;
+import com.compdfkit.core.annotation.form.CPDFRadiobuttonWidget;
+import com.compdfkit.core.page.CPDFPage;
+import com.facebook.react.bridge.WritableMap;
+
+
+public class RCPDFRadioButtonForms extends RCPDFBaseForms{
+
+  public RCPDFRadioButtonForms(CPDFPage page) {
+    super(page);
+  }
+
+  @Override
+  public void covert(CPDFAnnotation annotation, WritableMap map) {
+    CPDFRadiobuttonWidget radiobuttonWidget = (CPDFRadiobuttonWidget) annotation;
+    map.putString("type", "radioButton");
+    map.putBoolean("isChecked", radiobuttonWidget.isChecked());
+  }
+}

+ 21 - 0
android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/forms/RCPDFSignatureFieldsForms.java

@@ -0,0 +1,21 @@
+package com.compdfkitpdf.reactnative.util.annotation.forms;
+
+import com.compdfkit.core.annotation.CPDFAnnotation;
+import com.compdfkit.core.annotation.form.CPDFCheckboxWidget;
+import com.compdfkit.core.annotation.form.CPDFSignatureWidget;
+import com.compdfkit.core.page.CPDFPage;
+import com.facebook.react.bridge.WritableMap;
+
+
+public class RCPDFSignatureFieldsForms extends RCPDFBaseForms{
+
+  public RCPDFSignatureFieldsForms(CPDFPage page) {
+    super(page);
+  }
+
+  @Override
+  public void covert(CPDFAnnotation annotation, WritableMap map) {
+    CPDFSignatureWidget signatureWidget = (CPDFSignatureWidget) annotation;
+    map.putString("type", "signaturesFields");
+  }
+}

+ 21 - 0
android/src/main/java/com/compdfkitpdf/reactnative/util/annotation/forms/RCPDFTextFieldForms.java

@@ -0,0 +1,21 @@
+package com.compdfkitpdf.reactnative.util.annotation.forms;
+
+import com.compdfkit.core.annotation.CPDFAnnotation;
+import com.compdfkit.core.annotation.form.CPDFTextWidget;
+import com.compdfkit.core.page.CPDFPage;
+import com.facebook.react.bridge.WritableMap;
+
+
+public class RCPDFTextFieldForms extends RCPDFBaseForms{
+
+  public RCPDFTextFieldForms(CPDFPage page) {
+    super(page);
+  }
+
+  @Override
+  public void covert(CPDFAnnotation annotation, WritableMap map) {
+    CPDFTextWidget textWidget = (CPDFTextWidget) annotation;
+    map.putString("type", "textField");
+    map.putString("text", textWidget.getText());
+  }
+}

+ 6 - 0
android/src/main/java/com/compdfkitpdf/reactnative/viewmanager/CPDFViewManager.java

@@ -749,4 +749,10 @@ public class CPDFViewManager extends ViewGroupManager<CPDFView> {
     CPDFPageUtil rcpdfPage = pdfView.getCPDFPageUtil();
     return rcpdfPage.getAnnotations(pageIndex);
   }
+
+  public WritableArray getForms(int tag, int pageIndex){
+    CPDFView pdfView = mDocumentViews.get(tag);
+    CPDFPageUtil rcpdfPage = pdfView.getCPDFPageUtil();
+    return rcpdfPage.getForms(pageIndex);
+  }
 }

BIN
example/android/app/src/main/assets/annot_test.pdf


+ 7 - 1
example/src/CPDFAnnotationsExample.tsx

@@ -35,7 +35,7 @@ const CPDFAnnotationsExampleScreen = () => {
 
     const [samplePDF] = useState(
         route.params?.document || (Platform.OS === 'android'
-            ? 'file:///android_asset/PDF_Document.pdf'
+            ? 'file:///android_asset/annot_test.pdf'
             : 'PDF_Document.pdf')
     );
 
@@ -58,6 +58,7 @@ const CPDFAnnotationsExampleScreen = () => {
         'Import Annotations 2',
         'Export Annotations',
         'Get Annotations',
+        'Get Widgets',
         'Import Widgets',
         'Export Widgets',
         ];
@@ -149,6 +150,11 @@ const CPDFAnnotationsExampleScreen = () => {
                 const annotations = await page?.getAnnotations();
                 console.log(JSON.stringify(annotations, null, 2));
                 break;
+            case 'Get Widgets':
+                const pdfPage = pdfReaderRef?.current?._pdfDocument.pageAtIndex(1);
+                const forms = await pdfPage?.getForms();
+                console.log(JSON.stringify(forms, null, 2));
+                break;
             default:
                 break;
         }

+ 27 - 1
src/annotation/CPDFAnnotation.tsx

@@ -1,5 +1,31 @@
 import { CPDFAnnotationType } from "../configuration/CPDFOptions";
 
-abstract class CPDFAnnotation{
+export class CPDFAnnotation {
+
+    type: string;
+    title: string;
+    page: number;
+    content: string;
+
+    constructor(params: { type: string; title: string; page: number; content?: string }) {
+        this.type = params.type;
+        this.title = params.title;
+        this.page = params.page;
+        this.content = params.content ?? "";
+    }
+
+    static fromJson(json: any): CPDFAnnotation {
+        return new CPDFAnnotation({
+            type: json.type,
+            title: json.title,
+            page: json.page,
+            content: json.content,
+        });
+    }
+
+    static fromJsonArray(jsonArray: any[]): CPDFAnnotation[] {
+        return jsonArray.map((item) => CPDFAnnotation.fromJson(item));
+    }
+
 
 }

+ 7 - 0
src/annotation/CPDFMarkupAnnotation.tsx

@@ -0,0 +1,7 @@
+import { CPDFAnnotation } from "./CPDFAnnotation";
+
+
+export class CPDFMarkupAnnotation extends CPDFAnnotation {
+
+
+}

+ 8 - 2
src/page/CPDFPage.tsx

@@ -18,10 +18,8 @@ export class CPDFPage {
     constructor(viewerRef: any, pageIndex : number) {
         this._pageIndex = pageIndex;
         this._viewerRef = viewerRef;
-
     }
 
-
     getAnnotations = () : Promise<any> =>{
         const tag = findNodeHandle(this._viewerRef);
         if (tag != null) {
@@ -30,4 +28,12 @@ export class CPDFPage {
         return Promise.reject(new Error('Unable to find the native view reference'));
     }
 
+    getForms = () : Promise<any> =>{
+        const tag = findNodeHandle(this._viewerRef);
+        if (tag != null) {
+            return CPDFViewManager.getForms(tag, this._pageIndex);
+        }
+        return Promise.reject(new Error('Unable to find the native view reference'));
+    }
+
 }