Skip to content
ComPDF
DemoAPI ReferenceFAQ
New Release

Open-Source PDF SDK & AI Document Processing

Get the full self-hosted SDK and AI document processing on GitHub. One-click deploy to quickly build your document workflows.

Guides

Forms

ComPDF React Native SDK supports form callbacks and listener events for form style panels, field creation, field selection, and field deselection.

Available Callbacks and Events

TypeNameTrigger TimingPayload
Reader callbackonFormStyleDialogDismissedForm style dialog is dismissed{ type } event object
Reader callbackonInterceptWidgetActionCallbackA configured form widget is tapped and interception is enabledCPDFWidget widget
Listener eventCPDFEvent.FORM_FIELDS_CREATEDForm field is createdCPDFWidget
Listener eventCPDFEvent.FORM_FIELDS_SELECTEDForm field is selectedCPDFWidget
Listener eventCPDFEvent.FORM_FIELDS_DESELECTEDForm field is deselectedCPDFWidget | null

Form Widget Action Intercept

Use form widget action interception when you want to replace the SDK's default form field tap behavior with your own UI or business logic. You can intercept all form widget actions with interceptAllFormWidgetActions, or intercept only selected widget types with interceptFormWidgetActions.

The recommended approach is to intercept only the widget types that need custom handling:

tsx
const configuration = ComPDFKit.getDefaultConfig({
  formsConfig: {
    interceptFormWidgetActions: [
      CPDFWidgetType.TEXT_FIELD,
      CPDFWidgetType.CHECKBOX,
      CPDFWidgetType.LISTBOX,
      CPDFWidgetType.COMBOBOX,
    ],
  },
});

Handle the intercepted widget in CPDFReaderView.onInterceptWidgetActionCallback. If you change a widget value, call _pdfDocument.updateWidget to apply the custom result to the document.

tsx
<CPDFReaderView
  ref={pdfReaderRef}
  document={samplePDF}
  configuration={configuration}
  onInterceptWidgetActionCallback={async (widget) => {
    switch (widget.type) {
      case CPDFWidgetType.TEXT_FIELD: {
        const textWidget = widget as CPDFTextWidget;
        textWidget.update({ text: 'Handled by React Native' });
        await pdfReaderRef.current?._pdfDocument.updateWidget(textWidget);
        break;
      }
      case CPDFWidgetType.CHECKBOX: {
        const checkBox = widget as CPDFCheckboxWidget;
        checkBox.update({ isChecked: !checkBox.isChecked });
        await pdfReaderRef.current?._pdfDocument.updateWidget(checkBox);
        break;
      }
      case CPDFWidgetType.LISTBOX:
      case CPDFWidgetType.COMBOBOX: {
        const choiceWidget = widget as CPDFListboxWidget | CPDFComboboxWidget;
        choiceWidget.update({ selectItemAtIndex: 0 });
        await pdfReaderRef.current?._pdfDocument.updateWidget(choiceWidget);
        break;
      }
      default:
        break;
    }
  }}
/>

To intercept every form widget type, set interceptAllFormWidgetActions: true. Use it only when your app provides complete custom behavior for all form widgets.

Example Usage

tsx
const onFormFieldCreated = (widget: CPDFWidget) => {
  console.log('Form field created:', widget.type);
};

const onFormFieldSelected = (widget: CPDFWidget) => {
  console.log('Form field selected:', widget.type);
};

const onFormFieldDeselected = (widget: CPDFWidget | null) => {
  console.log('Form field deselected:', widget?.type);
};

<CPDFReaderView
  ref={pdfReaderRef}
  document={samplePDF}
  configuration={configuration}
  onViewCreated={() => {
    pdfReaderRef.current?.addEventListener(CPDFEvent.FORM_FIELDS_CREATED, onFormFieldCreated);
    pdfReaderRef.current?.addEventListener(CPDFEvent.FORM_FIELDS_SELECTED, onFormFieldSelected);
    pdfReaderRef.current?.addEventListener(CPDFEvent.FORM_FIELDS_DESELECTED, onFormFieldDeselected);
  }}
  onFormStyleDialogDismissed={(event) => {
    console.log('Form style dialog dismissed:', event.type);
  }}
/>

Remove Event Listeners

tsx
pdfReaderRef.current?.removeEventListener(CPDFEvent.FORM_FIELDS_CREATED, onFormFieldCreated);