Skip to content
DemoAPI 参考文档FAQ
全新发布

PDF SDK 与 AI 文档处理

在 GitHub 获取完整的私有化部署SDK 包及 AI 智能文档处理能力,一键部署,快速构建您的文档处理工作流。

Guides

表单

ComPDF React Native SDK 支持表单相关回调和监听事件,用于处理表单属性面板、字段创建、字段选中和取消选中。

可用回调和事件

类型名称触发时机返回值
阅读器回调onFormStyleDialogDismissed表单属性弹窗关闭{ type } 事件对象
阅读器回调onInterceptWidgetActionCallback开启拦截后点击已配置的表单 WidgetCPDFWidget widget
监听事件CPDFEvent.FORM_FIELDS_CREATED表单字段创建CPDFWidget
监听事件CPDFEvent.FORM_FIELDS_SELECTED表单字段被选中CPDFWidget
监听事件CPDFEvent.FORM_FIELDS_DESELECTED表单字段取消选中CPDFWidget | null

表单 Widget 点击拦截

当你需要用自己的 UI 或业务逻辑替换 SDK 默认的表单字段点击行为时,可以使用表单 Widget 点击拦截。你可以通过 interceptAllFormWidgetActions 拦截全部表单 Widget,也可以通过 interceptFormWidgetActions 只拦截指定类型。

推荐只拦截需要自定义处理的类型:

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

CPDFReaderView.onInterceptWidgetActionCallback 中处理被拦截的 Widget。如果你修改了 Widget 的值,请调用 _pdfDocument.updateWidget 将自定义结果应用到文档。

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;
    }
  }}
/>

如果需要拦截所有表单 Widget 类型,可以设置 interceptAllFormWidgetActions: true。仅当你的应用会为全部表单 Widget 提供完整自定义行为时再使用它。

示例

tsx
const onFormFieldCreated = (widget: CPDFWidget) => {
  console.log('表单字段已创建:', widget.type);
};

const onFormFieldSelected = (widget: CPDFWidget) => {
  console.log('表单字段已选中:', widget.type);
};

const onFormFieldDeselected = (widget: CPDFWidget | null) => {
  console.log('表单字段已取消选中:', 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('表单属性弹窗已关闭:', event.type);
  }}
/>

移除监听

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