Doko's new lair
React Native PDF Editor

Requirements

Platform, architecture, and native dependency requirements.

Minimum versions

RequirementMinimum
React Native0.79+ with the New Architecture enabled
Nitro Modulesreact-native-nitro-modules installed in the app
iOS15.1+
AndroidAPI 26+

The package is New Architecture only. There is no old bridge fallback.

Why Android API 26?

The published podofo-android AAR declares minSdkVersion 26. If your app is lower than that, Android's manifest merger will fail before your PDF gets a chance to be majestic.

Set your app's minimum SDK to 26 or higher.

For Expo-managed apps, that usually means expo-build-properties:

{
  "expo": {
    "plugins": [
      [
        "expo-build-properties",
        {
          "android": {
            "minSdkVersion": 26
          }
        }
      ]
    ]
  }
}

Native stack

PlatformImplementation path
iOSNitro C++ bindings directly to PoDoFo core, plus platform render/image APIs
AndroidKotlin Nitro implementation over podofo-android JNI wrapper, plus Android render/image APIs

Rendering does not use PoDoFo. It uses platform renderers:

  • iOS: Core Graphics (CGPDFDocument, CGPDFPage)
  • Android: android.graphics.pdf.PdfRenderer

That distinction matters because rendering reads from a file path, not from an unsaved in-memory PdfDocument. Save first, render second. PDFs enjoy being written down before being photographed.

Platform support table

FeatureAndroidiOS
Document create/open/saveFullFull
Page add/remove/rotate/resize/reorderFullFull
Merge and copy page rangesFullFull
Painter: text/images/shapes/colorsFullFull
Custom fonts from path or bufferFullFull
Annotations base APIFullFull
AcroForm text boxes and checkboxesFullFull
Radio/combo/list/signature field editingNot boundNot bound
Signature field inspection and verificationFullFull
Encryption and encryption inspectionFullFull
PAdES signing B-B/B-T/B-LT/B-LTAFullFull
Page rendering and text extractionFullFull

Android and iOS are not permanently frozen in this shape. The Android surface is expected to keep catching up as the underlying JNI wrapper expands.

On this page