---
title: "Form Creation"
canonical_url: "https://www.nutrient.io/guides/android/samples/form-creation-kotlin/"
md_url: "https://www.nutrient.io/guides/android/samples/form-creation-kotlin.md"
last_updated: "2026-05-15T19:10:04.916Z"
description: "Create text fields, checkboxes, radio buttons, and combo boxes with PdfProcessor."
---

# Form Creation

Create text fields, checkboxes, radio buttons, and combo boxes with PdfProcessor.

[Get Started](https://www.nutrient.io/sdk/android/getting-started.md)

[All Samples](https://www.nutrient.io/guides/android/samples.md)

[Download](https://www.nutrient.io/guides/android/downloads.md)

[Launch Demo](https://www.nutrient.io/demo/)

---

```kotlin

/*
 *   Copyright © 2018-2026 PSPDFKit GmbH. All rights reserved.
 *
 *   The PSPDFKit Sample applications are licensed with a modified BSD license.
 *   Please see License for details. This notice may not be removed from this file.
 */

package com.pspdfkit.catalog.examples.kotlin

import android.content.Context
import android.content.res.AssetManager
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.RectF
import android.net.Uri
import android.util.Log
import androidx.activity.viewModels
import com.pspdfkit.annotations.actions.UriAction
import com.pspdfkit.catalog.R
import com.pspdfkit.catalog.SdkExample
import com.pspdfkit.catalog.SdkExample.Companion.TAG
import com.pspdfkit.configuration.activity.PdfActivityConfiguration
import com.pspdfkit.document.PdfDocument
import com.pspdfkit.document.processor.NewPage
import com.pspdfkit.document.processor.PdfProcessor
import com.pspdfkit.document.processor.PdfProcessorTask
import com.pspdfkit.forms.CheckBoxFormConfiguration
import com.pspdfkit.forms.ComboBoxFormConfiguration
import com.pspdfkit.forms.FormOption
import com.pspdfkit.forms.ListBoxFormConfiguration
import com.pspdfkit.forms.PushButtonFormConfiguration
import com.pspdfkit.forms.RadioButtonFormConfiguration
import com.pspdfkit.forms.SignatureFormConfiguration
import com.pspdfkit.forms.TextFormConfiguration
import com.pspdfkit.ui.PdfActivity
import com.pspdfkit.ui.PdfActivityIntentBuilder
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.schedulers.Schedulers
import java.io.File
import java.io.IOException
import java.io.InputStream

/**
 * Kotlin example. Showcases how to create forms programmatically.
 */
class FormCreationExample(context: Context) :
    SdkExample(context, R.string.formCreationExampleTitle, R.string.formCreationExampleDescription) {
    private var documentProcessingDisposable: Disposable? = null

    override fun launchExample(context: Context, configuration: PdfActivityConfiguration.Builder) {
        // Turn off saving, so we have the clean original document every time the example is launched.
        configuration.autosaveEnabled(false)

        // Enable form editing UI.
        configuration.formEditingEnabled(true)

        // Create an A4 page document from scratch.
        val newPage = NewPage.emptyPage(NewPage.PAGE_SIZE_A4).build()
        val task = PdfProcessorTask.newPage(newPage)

        val outputFile: File
        try {
            outputFile = File(getCatalogCacheDirectory(context), "Blank.pdf").canonicalFile
        } catch (exception: IOException) {
            throw IllegalStateException("Couldn't create Blank.pdf file.", exception)
        }

        documentProcessingDisposable =
            PdfProcessor.processDocumentAsync(task, outputFile).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(
                    {
                        val intent =
                            PdfActivityIntentBuilder.fromUri(context, Uri.fromFile(outputFile)).configuration(configuration.build()).activityClass(FormCreationActivity::class).build()

                        context.startActivity(intent)
                    },
                    { throwable ->
                        Log.e(TAG, "Error while trying to create PDF document.", throwable)
                    },
                )
    }

    override fun onDestroy() {
        super.onDestroy()
        documentProcessingDisposable?.dispose()
        documentProcessingDisposable = null
    }

    @Throws(IOException::class)
    private fun getCatalogCacheDirectory(context: Context): File {
        val directory = File(context.cacheDir, PSPDFKIT_DIRECTORY_NAME)
        if (!directory.exists()) {
            if (!directory.mkdirs()) {
                throw IOException("Failed to create Catalog cache directory.")
            }
        }
        return directory
    }

    companion object {
        private const val PSPDFKIT_DIRECTORY_NAME = "catalog-pspdfkit"
    }
}

class FormCreationActivity : PdfActivity() {
    private val viewModel: AnnotationCreationViewModel by viewModels()
    private var getFormElementsDisposable: Disposable? = null

    override fun onDocumentLoaded(document: PdfDocument) {
        super.onDocumentLoaded(document)

        viewModel.createObjects {
            // Retrieve existing form elements and create form fields only when there are no forms.
            getFormElementsDisposable =
                document.formProvider.formElementsAsync.subscribe { formElements ->
                    if (formElements.isNotEmpty()) return@subscribe
                    createForms()
                }
        }
    }

    /**
     * Creates several forms and attach them to the document.
     */
    private fun createForms() {
        createTextFormField()
        createCheckBoxFormField()
        createRadioButtonFormField()
        createPushButtonFormField()
        createSignatureFormField()
        createComboBoxFormField()
        createListBoxFormField()
    }

    /**
     * Creates and attaches to the document a text form field.
     */
    private fun createTextFormField() {
        val rectF = RectF(30f, 750f, 200f, 720f)
        val textFormConfiguration =
            TextFormConfiguration.Builder(0, rectF).setText("Example text").build()
        document?.formProvider?.addFormElementToPage("textfield-1", textFormConfiguration)
    }

    /**
     * Creates and attaches to the document a checkbox form field with two checkbox form elements.
     */
    private fun createCheckBoxFormField() {
        val rectFCheckBoxFormConfiguration1 = RectF(30f, 650f, 60f, 620f)
        val checkBoxFormConfiguration1 =
            CheckBoxFormConfiguration.Builder(0, rectFCheckBoxFormConfiguration1).select().build()

        val rectFCheckBoxFormConfiguration2 = RectF(30f, 600f, 60f, 570f)
        val checkBoxFormConfiguration2 =
            CheckBoxFormConfiguration.Builder(0, rectFCheckBoxFormConfiguration2).deselect().build()

        val checkBoxFormConfigurationList = listOf(checkBoxFormConfiguration1, checkBoxFormConfiguration2)
        document?.formProvider?.addFormElementsToPage("checkboxfield-1", checkBoxFormConfigurationList)
    }

    /**
     * Creates and attaches to the document a radio button form field with two radio button form elements.
     */
    private fun createRadioButtonFormField() {
        val rectFRadioButtonFormConfiguration1 = RectF(30f, 500f, 60f, 470f)
        val radioButtonFormConfiguration1 =
            RadioButtonFormConfiguration.Builder(0, rectFRadioButtonFormConfiguration1).select().build()

        val rectFRadioButtonFormConfiguration2 = RectF(30f, 450f, 60f, 420f)
        val radioButtonFormConfiguration2 =
            RadioButtonFormConfiguration.Builder(0, rectFRadioButtonFormConfiguration2).deselect().build()

        val radioButtonFormConfigurationList = listOf(radioButtonFormConfiguration1, radioButtonFormConfiguration2)
        document?.formProvider?.addFormElementsToPage("radiobuttonfield-1", radioButtonFormConfigurationList)
    }

    /**
     * Creates and attaches to the document a push button form field.
     */
    private fun createPushButtonFormField() {
        val rectFPushButtonFormConfiguration = RectF(30f, 350f, 120f, 260f)

        val bitmapFromAsset = getBitmapFromAsset(assets, "images/android.png")?: return

        val pushButtonFormConfiguration =
            PushButtonFormConfiguration.Builder(
                    0,
                    rectFPushButtonFormConfiguration,
                    bitmapFromAsset,
                ).setAction(UriAction("https://developer.android.com/index.html")).build()

        document?.formProvider?.addFormElementToPage("pushbuttonfield-1", pushButtonFormConfiguration)
    }

    /**
     * Creates and attaches to the document a signature form field.
     */
    private fun createSignatureFormField() {
        val rectFSignatureFormConfiguration = RectF(30f, 190f, 200f, 160f)

        val signatureFormConfiguration =
            SignatureFormConfiguration.Builder(0, rectFSignatureFormConfiguration).build()

        document?.formProvider?.addFormElementToPage("signaturefield-1", signatureFormConfiguration)
    }

    /**
     * Creates and attaches to the document a combo box form field.
     */
    private fun createComboBoxFormField() {
        val rectFComboBoxFormConfiguration = RectF(350f, 650f, 520f, 620f)
        val comboBoxFormConfiguration =
            ComboBoxFormConfiguration.Builder(0, rectFComboBoxFormConfiguration).setFormOptions(
                    listOf(
                        FormOption("L1", "42"),
                        FormOption("L2", "43"),
                    ),
                ).setCustomText("Custom text").build()

        document?.formProvider?.addFormElementToPage("comboboxfield-1", comboBoxFormConfiguration)
    }

    /**
     * Creates and attaches to the document a list box form field.
     */
    private fun createListBoxFormField() {
        val rectFListBoxFormConfiguration = RectF(350f, 500f, 520f, 420f)
        val listBoxFormConfiguration =
            ListBoxFormConfiguration.Builder(0, rectFListBoxFormConfiguration).setFormOptions(
                    listOf(
                        FormOption("L1", "42"),
                        FormOption("L2", "43"),
                        FormOption("L3", "44"),
                        FormOption("L4", "45"),
                    ),
                ).setMultiSelectionEnabled(true).setSelectedIndexes(listOf(1, 2)).build()

        document?.formProvider?.addFormElementToPage("listboxfield-1", listBoxFormConfiguration)
    }

    @Suppress("SameParameterValue")
    private fun getBitmapFromAsset(assets: AssetManager, path: String): Bitmap? {
        var inputStream: InputStream? = null
        var bitmap: Bitmap?
        try {
            inputStream = assets.open(path)
            bitmap = BitmapFactory.decodeStream(inputStream)
        } catch (e: IOException) {
            bitmap = null
        } finally {
            if (inputStream!= null) {
                try {
                    inputStream.close()
                } catch (ignored: IOException) {
                }
            }
        }
        return bitmap
    }

    override fun onDestroy() {
        super.onDestroy()
        getFormElementsDisposable?.dispose()
    }
}

```

This code sample is an example that illustrates how to use our SDK. Please adapt it to your specific use case.

---

## Related pages

- [Application Policy](/guides/android/samples/application-policy-kotlin.md)
- [Custom Form Highlight Color](/guides/android/samples/custom-form-highlight-color-java.md)
- [Custom Page Templates](/guides/android/samples/custom-page-templates-java.md)
- [Digital Signature (Basic)](/guides/android/samples/digital-signature-basic-kotlin.md)
- [Disabled Annotation Property](/guides/android/samples/disabled-annotation-property-java.md)
- [Image Document](/guides/android/samples/image-document-kotlin.md)
- [Compose Image Document](/guides/android/samples/compose-image-document-kotlin.md)
- [Inline Multimedia](/guides/android/samples/inline-multimedia-kotlin.md)
- [JavaScript Form Filling](/guides/android/samples/javascript-form-filling-kotlin.md)
- [Overlay Visibility](/guides/android/samples/overlay-visibility-kotlin.md)
- [PdfFragment](/guides/android/samples/pdffragment-kotlin.md)
- [Reader View](/guides/android/samples/reader-view-kotlin.md)
- [Playground](/guides/android/samples/playground-kotlin.md)
- [JavaScript Calculator](/guides/android/samples/javascript-calculator-kotlin.md)
- [Text Field Suggestions](/guides/android/samples/text-field-suggestions-kotlin.md)
- [Thumbnail Bar Modes](/guides/android/samples/thumbnail-bar-modes-kotlin.md)
- [Signature Storage Database](/guides/android/samples/signature-storage-database-kotlin.md)
- [Selection Customization](/guides/android/samples/selection-customization-java.md)
- [Password Protected PDF](/guides/android/samples/password-protected-pdf-kotlin.md)
- [Scientific Paper](/guides/android/samples/scientific-paper-kotlin.md)
- [Try Instant](/guides/android/samples/try-instant-kotlin.md)
- [Merge Documents](/guides/android/samples/merge-documents-kotlin.md)
- [Annotation Rendering](/guides/android/samples/annotation-rendering-kotlin.md)
- [Custom Data Provider](/guides/android/samples/custom-data-provider-kotlin.md)
- [Annotations with Transparency](/guides/android/samples/annotations-with-transparency-kotlin.md)
- [Annotation Flags](/guides/android/samples/annotation-flags-kotlin.md)
- [AI Assistant (Multiple Documents, ViewPager)](/guides/android/samples/ai-assistant-multiple-documents-viewpager-kotlin.md)
- [Custom Sharing Menu](/guides/android/samples/custom-sharing-menu-java.md)
- [Add LTV to Existing Signature](/guides/android/samples/add-ltv-to-existing-signature-kotlin.md)
- [Custom Toolbar Grouping](/guides/android/samples/custom-toolbar-grouping-java.md)
- [Custom Layout](/guides/android/samples/custom-layout-kotlin.md)
- [Custom ActionBar Actions](/guides/android/samples/custom-actionbar-actions-kotlin.md)
- [Custom Activity Toolbars](/guides/android/samples/custom-activity-toolbars-java.md)
- [Custom Note Hinter](/guides/android/samples/custom-note-hinter-kotlin.md)
- [Custom Main Toolbar](/guides/android/samples/custom-main-toolbar-kotlin.md)
- [Annotation Configuration](/guides/android/samples/annotation-configuration-kotlin.md)
- [Annotation Selection Styling](/guides/android/samples/annotation-selection-styling-kotlin.md)
- [Custom Search UI (Compose)](/guides/android/samples/custom-search-ui-compose-kotlin.md)
- [Document Switcher](/guides/android/samples/document-switcher-java.md)
- [File Annotation Creation](/guides/android/samples/file-annotation-creation-kotlin.md)
- [Dynamic Pages on Scroll](/guides/android/samples/dynamic-pages-on-scroll-kotlin.md)
- [Custom Activity Form Editing](/guides/android/samples/custom-activity-form-editing-java.md)
- [Custom Stamp Annotations](/guides/android/samples/custom-stamp-annotations-java.md)
- [Custom Outline Provider](/guides/android/samples/custom-outline-provider-kotlin.md)
- [Compose Navigation](/guides/android/samples/compose-navigation-kotlin.md)
- [Fragment Runtime Configuration](/guides/android/samples/fragment-runtime-configuration-kotlin.md)
- [Annotation Overlay](/guides/android/samples/annotation-overlay-java.md)
- [Instant Document JSON](/guides/android/samples/instant-document-json-kotlin.md)
- [DocumentView Composable](/guides/android/samples/documentview-composable-kotlin.md)
- [Document Download](/guides/android/samples/document-download-kotlin.md)
- [JavaScript Actions](/guides/android/samples/javascript-actions-kotlin.md)
- [Instant JSON Attachment](/guides/android/samples/instant-json-attachment-kotlin.md)
- [Digital Signature (Manual)](/guides/android/samples/digital-signature-manual-kotlin.md)
- [Digital Signature (Third-Party)](/guides/android/samples/digital-signature-third-party-kotlin.md)
- [Inline Search](/guides/android/samples/inline-search-java.md)
- [Form Filling](/guides/android/samples/form-filling-kotlin.md)
- [Form Click Intercept (Compose)](/guides/android/samples/form-click-intercept-compose-kotlin.md)
- [Document Sharing](/guides/android/samples/document-sharing-java.md)
- [Custom Download Dialog](/guides/android/samples/custom-download-dialog-java.md)
- [Download Progress](/guides/android/samples/download-progress-kotlin.md)
- [Popup Toolbar Customization](/guides/android/samples/popup-toolbar-customization-kotlin.md)
- [Custom Sharing Dialog](/guides/android/samples/custom-sharing-dialog-java.md)
- [PDF from Image](/guides/android/samples/pdf-from-image-kotlin.md)
- [Digital Signature (Two-Step)](/guides/android/samples/digital-signature-two-step-kotlin.md)
- [Remote URL](/guides/android/samples/remote-url-kotlin.md)
- [PdfUiFragment](/guides/android/samples/pdfuifragment-kotlin.md)
- [Runtime Configuration](/guides/android/samples/runtime-configuration-kotlin.md)
- [Sound Extraction](/guides/android/samples/sound-extraction-kotlin.md)
- [Document from Canvas](/guides/android/samples/document-from-canvas-kotlin.md)
- [Tabbed Documents](/guides/android/samples/tabbed-documents-kotlin.md)
- [Watermarks](/guides/android/samples/watermarks-kotlin.md)
- [Programmatic Zoom](/guides/android/samples/programmatic-zoom-kotlin.md)
- [Signature Parcelize](/guides/android/samples/signature-parcelize-kotlin.md)
- [OCR](/guides/android/samples/ocr-kotlin.md)
- [Vertical Scrollbar](/guides/android/samples/vertical-scrollbar-java.md)
- [Split View](/guides/android/samples/split-view-java.md)
- [XFDF Import/Export](/guides/android/samples/xfdf-import-export-kotlin.md)
- [UI View Modes](/guides/android/samples/ui-view-modes-kotlin.md)
- [LTV Signature](/guides/android/samples/ltv-signature-kotlin.md)
- [Bookmark Highlighting](/guides/android/samples/bookmark-highlighting-kotlin.md)
- [Custom Annotation Inspector](/guides/android/samples/custom-annotation-inspector-java.md)
- [Annotation Sidebar](/guides/android/samples/annotation-sidebar-kotlin.md)
- [AI Assistant (Single Document)](/guides/android/samples/ai-assistant-single-document-kotlin.md)
- [AI Assistant (Multiple Documents, Compose)](/guides/android/samples/ai-assistant-multiple-documents-compose-kotlin.md)
- [Document Comparison](/guides/android/samples/document-comparison-kotlin.md)
- [Document Processing](/guides/android/samples/document-processing-kotlin.md)
- [Custom Annotation Creation Toolbar](/guides/android/samples/custom-annotation-creation-toolbar-java.md)
- [Custom Electronic Signature](/guides/android/samples/custom-electronic-signature-java.md)
- [E-Learning](/guides/android/samples/e-learning-kotlin.md)
- [Electronic + Digital Signing](/guides/android/samples/electronic-digital-signing-kotlin.md)
- [Generate PDF Report](/guides/android/samples/generate-pdf-report-kotlin.md)
- [Multimedia Annotations](/guides/android/samples/multimedia-annotations-kotlin.md)
- [Forms with JavaScript](/guides/android/samples/forms-with-javascript-kotlin.md)
- [External Document](/guides/android/samples/external-document-kotlin.md)
- [Overlay Views](/guides/android/samples/overlay-views-kotlin.md)
- [Kiosk Grid](/guides/android/samples/kiosk-grid-kotlin.md)
- [Search Indexing](/guides/android/samples/search-indexing-kotlin.md)
- [Annotation Creation](/guides/android/samples/annotation-creation-kotlin.md)
- [Filterable Thumbnail Grid](/guides/android/samples/filterable-thumbnail-grid-kotlin.md)
- [Tabbed Documents (Persistent)](/guides/android/samples/tabbed-documents-persistent-kotlin.md)
- [Measurement Tools](/guides/android/samples/measurement-tools-kotlin.md)
- [HTML-to-PDF Conversion](/guides/android/samples/html-to-pdf-conversion-kotlin.md)
- [AES Encrypted File](/guides/android/samples/aes-encrypted-file-java.md)
- [Construction Floor Plan](/guides/android/samples/construction-floor-plan-kotlin.md)
- [Hide and Reveal Areas](/guides/android/samples/hide-and-reveal-areas-kotlin.md)
- [Multiple Documents (Compose Pager)](/guides/android/samples/multiple-documents-compose-pager-kotlin.md)
- [Screen Reader](/guides/android/samples/screen-reader-java.md)
- [Custom Search UI (Views)](/guides/android/samples/custom-search-ui-views-java.md)

