Lecteur PDF
Affichez des PDF, extrayez du texte et sélectionnez ou copiez du contenu depuis Compose, avec une seule API sur Android, iOS, web et desktop.
Le lecteur PDF est une bibliothèque Kotlin Multiplatform qui affiche des pages PDF, extrait du texte et pilote la sélection, la recherche, les liens et les vignettes depuis Compose. L'API publique est la même sur chaque cible : vous écrivez une fois contre PdfReaderState et PdfPage, et la bibliothèque se lie en dessous à la pile PDF native de chaque plateforme.
Dépôt séparé — versionné indépendamment
Le lecteur PDF est livré depuis son propre dépôt avec son propre cycle de release, comme la system tray. Son numéro de version est indépendant de Nucleus — épinglez-le séparément. L'artefact est dev.nucleusframework:pdfium, publié sur Maven Central.
Dernière version: 152.0.7947.0
Une seule API au lieu d'une par plateforme
Chaque plateforme a son propre moteur PDF, avec son API, son modèle de threading et ses conventions de coordonnées :
| Plateforme | Pile PDF native |
|---|---|
| Android | PdfRenderer (android.graphics.pdf) |
| iOS | PDFKit (PDFView, PDFDocument) |
| Web | PDF.js |
| Desktop | PDFBox et autres bibliothèques JVM |
Sans couche partagée, une app multiplateforme intègre et maintient quatre de ces piles. Le lecteur PDF les remplace par une seule surface Compose adossée à PDFium sur les quatre, si bien que le rendu, l'extraction de texte et la sélection se comportent de façon identique partout.
Ajouter la dépendance
kotlin {
sourceSets {
commonMain.dependencies {
implementation("dev.nucleusframework:pdfium:152.0.7947.0")
}
}
}Le module :pdfium utilise un toolchain JVM 17. Les binaires PDFium sont téléchargés au build depuis bblanchon/pdfium-binaries ; aucune configuration native manuelle n'est requise.
Afficher un PDF
Hissez un PdfReaderState, ouvrez les octets du document et placez PdfReader dans votre mise en page :
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier
import dev.nucleusframework.pdfium.PdfReader
import dev.nucleusframework.pdfium.rememberPdfReaderState
@Composable
fun HelloPdf(bytes: ByteArray) {
val reader = rememberPdfReaderState()
LaunchedEffect(bytes) { reader.open(bytes) }
PdfReader(state = reader, modifier = Modifier.fillMaxSize())
}PdfReader empile chaque page dans un LazyColumn. rememberPdfReaderState libère automatiquement les handles natifs quand il quitte la composition.
Cibles prises en charge
| Cible | Backend |
|---|---|
| JVM | JNI + Skia (Skiko) |
| Android | JNI (NDK AndroidBitmap_*) |
| iOS | Kotlin/Native cinterop + Skia (Skiko) |
| Web | pdfium.wasm dans un Web Worker + Skiko |
JVM couvre linux-x64/arm64, macos-x64/arm64 et win-x64/arm64. Android couvre arm64-v8a, armeabi-v7a, x86 et x86_64. Web couvre Kotlin/WasmJS et Kotlin/JS (IR).
Fonctionnement
commonMain contient toute l'API publique — PdfReaderState, PdfPage, PdfThumbnail et PdfReader — au-dessus d'un expect class PdfDocument. Chaque source set fournit l'actual : la glue JNI sur JVM et Android, un cinterop Kotlin/Native sur iOS, et un worker pdfium.wasm sur le web.
Le rendu emprunte un chemin zero-copy là où la plateforme le permet. Sur JVM et iOS, PDFium écrit les pixels directement dans la mémoire d'un bitmap Skia ; sur Android il verrouille le android.graphics.Bitmap ; sur le web, l'ArrayBuffer de pixels du worker est écrit dans le tas wasm de Skia sans ByteArray Kotlin intermédiaire.
PDFium est mono-thread par document — il repose sur le FT_Library non thread-safe de FreeType — donc chaque PdfDocument tourne sur son propre dispatcher mono-thread. Le rendu est sérialisé à l'intérieur d'un document.
Ce que couvre la bibliothèque
- Des composables Compose : placez
PdfReader,PdfPageouPdfThumbnaildans n'importe quelle UI Compose. - Un rendu progressif (aperçu vers pleine qualité) avec un flux de taille débouncé.
- Un cache LRU à deux niveaux pour les bitmaps du lecteur et les vignettes, avec préchargement hors écran.
- L'extraction de texte : texte UTF-8 par page, rectangles au niveau des lignes et boîtes par caractère.
- Un overlay de texte sélectionnable piloté par les boîtes par caractère de PDFium.
- Des liens cliquables : annotations URI et GoTo internes, plus les URL et adresses e-mail détectées dans le texte de la page.
- Les documents protégés par mot de passe via
PdfError.PasswordRequired.
Licence
PDFium est sous double licence BSD-3-Clause / Apache-2.0, et les binaires de bblanchon reprennent cette licence. Si vous livrez une app bâtie sur cette bibliothèque, incluez les notices PDFium amont.
Et ensuite
- Premiers pas — chargez des octets, gérez l'état de chargement, activez la sélection, les liens, les vignettes et le zoom.
- Référence de l'API — chaque type public, ses paramètres et ses valeurs par défaut.
- System tray — un autre composant Nucleus livré depuis son propre dépôt.