Nutrient Android SDK 11.4 release notes

RSS

28 Apr 2026

Nutrient Android SDK 11.4 introduces progressive page rendering: Page content is rendered in parts, so portions of the page appear as soon as they’re ready instead of waiting for the entire page to finish. This is most noticeable on very large or complex pages — for example, detailed floor plans — where some paths and shapes show up first while the rest of the page continues to render. The legacy per-page loading throbber is replaced by a thin Material 3 progress bar at the bottom of the page and fragment, exposed as the new LoadingIndicatorStyle configuration.

This release also deprecates the multithreaded rendering toggle (rendering is now always multithreaded) and renames the fixed-resolution render configuration to better reflect what it controls under progressive rendering.

These changes include source-breaking API changes. Refer to the migration guide below for details on updating your code.

This release contains several additional fixes and enhancements. For the full list of changes, refer to our changelog.

UI improvements

  • Pages now render progressively. Page content is split into parts so portions of the page appear as they’re ready rather than waiting for the entire page to finish — most noticeable on very large or complex pages such as detailed floor plans, where some paths and shapes appear before others.
  • The per-page and fragment-level loading throbbers have been replaced with a thin Material 3 progress bar. The new LoadingIndicatorStyle configuration exposes color, track color, and height customization.
  • The electronic signature tool now matches the iOS SDK behavior. The signature dialog opens immediately when the tool is activated, and the signature is placed at the center of the visible page area.

Bug fixes

This release addresses issues in both the user interface and underlying model layer.

UI

  • Improved Samsung keyboard handling to prevent spaces from being swallowed after Korean text composition during content editing.
  • Fixed fonts configured via pspdf__outlineViewStyle not being applied to the PdfOutlineView.
  • Fixed missing rounded corners on the vertical floating annotation toolbar when it contains only a single item.
  • Fixed a visual artifact (ghost/shadow) that appeared on annotations immediately after creation.
  • Fixed annotation creation mode being exited when changing the current page via the thumbnail bar.
  • Fixed double-tap word selection and long-press text selection inside a newly created free text annotation.

Model

  • Fixed Multiply and Overlay blend modes rendering too dark in DeviceCMYK transparency groups.
  • Fixed content editing where bold or italic was only applied to part of a selection when the embedded subset font didn’t cover every selected character. Fallback glyphs are now rendered in the requested weight or style instead of regular.
  • Fixed applying redactions producing burned overlay text that didn’t honor the configured redaction font size.
  • Fixed corrupted rendering of indexed JPEG2000 image tiles in clipped renders.
  • Fixed incorrect text selection and highlighting for ligatures in some PDFs.

Migration guide

This section covers source-breaking changes in this release and how to update your code.

Loading indicator replaces loading drawable

The per-page and fragment-level loading throbbers have been replaced by a thin Material 3 linear progress bar at the bottom of the page and fragment. The drawable-based configuration has been removed and replaced by a new LoadingIndicatorStyle configuration.

Removed methods

Removed methodReplacement
PdfConfiguration.Builder.loadingProgressDrawable()PdfConfiguration.Builder.loadingIndicatorStyle()
PdfActivityConfiguration.Builder.loadingProgressDrawable()PdfActivityConfiguration.Builder.loadingIndicatorStyle()

What to remove from your code

  • Custom loading Drawable instances passed to loadingProgressDrawable() — Remove these. The new progress bar is configured with colors and a height instead of a drawable.
  • References to loadingProgressDrawable in custom configurations — Replace with loadingIndicatorStyle and a LoadingIndicatorStyle instance.

Before:

val configuration = PdfActivityConfiguration.Builder(context)
.loadingProgressDrawable(myCustomLoadingDrawable)
.build()

After:

val configuration = PdfActivityConfiguration.Builder(context)
.loadingIndicatorStyle(
LoadingIndicatorStyle(
color = Color.BLUE,
trackColor = Color.LTGRAY,
heightDp = 2,
)
)
.build()

If you don’t need to customize the indicator, omit the call and the SDK will use defaults from your theme.

Multithreaded rendering is always enabled

Multithreaded rendering is now always on. The toggle that previously allowed disabling it has been deprecated and the document loader overloads that took the toggle have been removed.

Deprecated (still available)

  • PdfConfiguration.Builder#setMultithreadedRenderingEnabled(Boolean)
  • PdfActivityConfiguration.Builder#setMultithreadedRenderingEnabled(Boolean)
  • PdfConfiguration#isMultithreadedRenderingEnabled

These will be removed in a future version. Remove calls to them — the value is ignored, and rendering always runs multithreaded.

Removed document loader overloads

The PdfDocumentLoader overloads that accepted a multithreadedRenderingEnabled argument have been removed. Use the overloads without that argument.

RemovedReplacement
PdfDocumentLoader.openDocument(context, source, multithreadedRenderingEnabled)PdfDocumentLoader.openDocument(context, source)
PdfDocumentLoader.openDocuments(context, sources, multithreadedRenderingEnabled)PdfDocumentLoader.openDocuments(context, sources)
PdfDocumentLoader.openDocumentAsync(context, source, multithreadedRenderingEnabled)PdfDocumentLoader.openDocumentAsync(context, source)
PdfDocumentLoader.openDocumentsAsync(context, sources, multithreadedRenderingEnabled)PdfDocumentLoader.openDocumentsAsync(context, sources)

Before:

val document = PdfDocumentLoader.openDocument(context, source, false)

After:

val document = PdfDocumentLoader.openDocument(context, source)

setFixedLowResRenderPixelCount renamed to setFixedFullPageRenderPixelCount

With progressive rendering in place, the configuration value previously called FixedLowResRenderPixelCount now controls the full-page render and has been renamed to better reflect that.

Old nameNew name
PdfConfiguration.Builder#setFixedLowResRenderPixelCount()PdfConfiguration.Builder#setFixedFullPageRenderPixelCount()
PdfConfiguration#getFixedLowResRenderPixelCount()PdfConfiguration#getFixedFullPageRenderPixelCount()

Before:

val configuration = PdfConfiguration.Builder()
.setFixedLowResRenderPixelCount(2_000_000)
.build()
val pixels = configuration.fixedLowResRenderPixelCount

After:

val configuration = PdfConfiguration.Builder()
.setFixedFullPageRenderPixelCount(2_000_000)
.build()
val pixels = configuration.fixedFullPageRenderPixelCount

The semantics of the value are unchanged.