Basic Example
Example of how to integrate Nutrient in a Jetpack compose application.
/* * Copyright © 2021-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.Contextimport android.content.Intentimport android.net.Uriimport android.os.Bundleimport android.util.Logimport androidx.activity.compose.setContentimport androidx.appcompat.app.AppCompatActivityimport androidx.compose.foundation.backgroundimport androidx.compose.foundation.layout.Arrangementimport androidx.compose.foundation.layout.Boximport androidx.compose.foundation.layout.Rowimport androidx.compose.foundation.layout.Spacerimport androidx.compose.foundation.layout.fillMaxSizeimport androidx.compose.foundation.layout.navigationBarsPaddingimport androidx.compose.foundation.layout.paddingimport androidx.compose.foundation.layout.statusBarsPaddingimport androidx.compose.material.icons.Iconsimport androidx.compose.material.icons.filled.Saveimport androidx.compose.material3.Buttonimport androidx.compose.material3.FloatingActionButtonimport androidx.compose.material3.Iconimport androidx.compose.material3.MaterialThemeimport androidx.compose.material3.Scaffoldimport androidx.compose.material3.Textimport androidx.compose.ui.Modifierimport androidx.compose.ui.unit.dpimport com.pspdfkit.catalog.Rimport com.pspdfkit.catalog.SdkExampleimport com.pspdfkit.catalog.SdkExample.Companion.TAGimport com.pspdfkit.catalog.tasks.ExtractAssetTaskimport com.pspdfkit.catalog.ui.theming.CatalogThemeimport com.pspdfkit.configuration.activity.PdfActivityConfigurationimport com.pspdfkit.configuration.activity.UserInterfaceViewModeimport com.pspdfkit.jetpack.compose.interactors.DefaultListenersimport com.pspdfkit.jetpack.compose.interactors.getDefaultDocumentManagerimport com.pspdfkit.jetpack.compose.interactors.rememberDocumentStateimport com.pspdfkit.jetpack.compose.views.DocumentViewimport com.pspdfkit.ui.PdfUiFragmentimport com.pspdfkit.utils.getSupportParcelableExtra
/** * Opens the example document using Jetpack Compose. */class JetpackComposeExample(context: Context) : SdkExample(context, R.string.jetpackExampleTitle, R.string.jetpackExampleDescription) { /** Configuration is handled inside [JetpackComposeActivity] */ override fun launchExample(context: Context, configuration: PdfActivityConfiguration.Builder) { ExtractAssetTask.extract(WELCOME_DOC, title, context) { documentFile -> val intent = Intent(context, JetpackComposeActivity::class.java) intent.putExtra(JetpackComposeActivity.EXTRA_URI, Uri.fromFile(documentFile)) context.startActivity(intent) } }}
/** * This example shows you how to use the [PdfUiFragment] to display PDFs in your activities. */class JetpackComposeActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)
val uri = intent.getSupportParcelableExtra(EXTRA_URI, Uri::class.java)!!
setContent { CatalogTheme { val pdfActivityConfiguration = PdfActivityConfiguration .Builder(this) .setUserInterfaceViewMode(UserInterfaceViewMode.USER_INTERFACE_VIEW_MODE_HIDDEN) .build()
val documentState = rememberDocumentState(uri, pdfActivityConfiguration)
var currentPage = pdfActivityConfiguration.page
Scaffold( modifier = Modifier .background(color = MaterialTheme.colorScheme.onPrimary) .statusBarsPadding() .navigationBarsPadding(), floatingActionButton = { FloatingActionButton( onClick = { documentState.documentConnection.save() } ) { Icon(imageVector = Icons.Default.Save, contentDescription = "save") } }, bottomBar = { Row( horizontalArrangement = Arrangement.SpaceAround ) { Button( onClick = { documentState.documentConnection.setPageIndex( (currentPage - 1).coerceAtLeast( 0 ) ) }, modifier = Modifier.padding(8.dp) ) { Text("Previous page") }
Spacer(modifier = Modifier.weight(1f))
Button( onClick = { documentState.documentConnection.setPageIndex( (currentPage + 1).coerceAtMost( 17 ) ) }, modifier = Modifier.padding(8.dp) ) { Text("Next page") } } } ) { paddingValues -> Box(Modifier.padding(paddingValues)) { DocumentView( documentState = documentState, modifier = Modifier.fillMaxSize(), documentManager = getDefaultDocumentManager( documentListener = DefaultListeners.documentListeners( onDocumentLoaded = { Log.e(TAG, "onDocumentLoaded ${it.title}") }, onPageChanged = { document, page -> currentPage = page Log.e(TAG, "onPageChanged: ${document.title} - $page") }, onDocumentSave = { document, _ -> Log.e(TAG, "onDocumentSave ${document.title}") true }, onDocumentSaved = { Log.e(TAG, "onDocumentSaved ${it.title}") }, onDocumentZoomed = { document, pageIndex, scaleFactor -> Log.e( TAG, "onDocumentZoomed: ${document.title} $pageIndex $scaleFactor" ) } ), annotationListener = DefaultListeners.annotationListeners( onAnnotationSelected = { annotation, created -> Log.e( TAG, "onAnnotationSelected: ${annotation.type.name} $created" ) }, onAnnotationDeselected = { annotation, created -> Log.e( TAG, "onAnnotationDeselected: ${annotation.type.name} $created" ) } ) ) ) } } } } }
companion object { const val EXTRA_URI = "JetpackComposeActivity.DocumentUri" }}This code sample is an example that illustrates how to use our SDK. Please adapt it to your specific use case.