Repository navigation
1.1.0 (2026-10-19)
1.1 adds two ways to open documents, both requested in issues: several files
shown as one document (#5, #60)
and base64 strings (#6, #42).
It also makes long documents cheaper on both platforms, and raises the minimum
React Native version to 0.83.
Highlights
Several documents as one — source={[a, b, c]} shows the files one after
another as a single document: one page count, zoom, layouts, paging and search
across all of them. Each source can carry its own password. onLoad's
sources says where each file's pages start; the set loads all or nothing,
and onError's error.sourceIndex says which file failed. Links within a
file lead to its pages, and "next page" / "previous page" links cross into the
neighbouring file. The set is for reading: print, exportDocument and form
filling need one file and reject with several sources.
Guide
Base64 documents — source={{ base64 }} opens a PDF you have as a string
(pdfmake, pdf-lib, an API response), in PdfView and PdfDocument.open. It is
decoded natively off the main thread, and no file is handed to the app
(filePath is undefined). Meant for documents up to a few MB; no data:
prefix.
Guide
Lighter on long documents (simulators and emulators; methods and every run
in docs/performance/results.md):
- Android: text pages and greyscale scans are kept at one byte per pixel, a
quarter of the memory. Peak PSS on 500 greyscale scans: 144.7 → 110.4 MB (§20). - Android: zoomed out below the fitted width, pages render at half or a
quarter size. 1,000 pages at zoom 0.05: peak PSS ~240 → ~150 MB (§17). - Android: page bitmaps are reused in landscape, on tablets and on unfolded
foldables; a trip to the background no longer counts as memory pressure;
on Android 7.x, colour pages no longer run out of memory on small Java
heaps (§21). - iOS: search highlights no longer block the main thread. With 528,449
matches, next/previous went from 1.23–1.34 s to 10–19 ms (§15). - iOS: forms on long documents stay off the main thread. On 5,000 pages,
getFormFieldsafter an edit went from 3.24 s to under 0.1 ms (§19).
⚠ BREAKING CHANGES
- React Native 0.83+ (Expo SDK 55+) is required. On React Native 0.81,
iOS never tears down a closed viewer, so every closedPdfViewkept its
document, search and form in memory; no Expo SDK ships 0.82. Apps on Expo
SDK 54 can stay on 1.0.1. (#58, closes #26)
Upgrading
PdfLoadEventhas a new requiredsourcesarray (one entry per source, so
one for a single source). A test that builds anonLoadpayload typed as
PdfLoadEventneeds it. (#60)
Behavior changes
- iOS:
goToPage,goToViewportandzoomTocalled fromonLoadwhile
the view has no size yet apply once it is laid out (the view used to open at
the initial page and zoom); such a zoom is reported throughonScaleChange
after the first layout. (#46) - Android: fractional page numbers are rounded, not truncated, as on iOS:
goToPage(1.6)opens page 2. AlsogoToViewport,initialPageand
initialViewport.page. (#37) - Android:
search()beforeonLoadis ignored with no event, as on iOS
(it emitted an empty finished search, then a cleared one). (#55) - Android:
page-render-failedis reported only when the immediate retry
fails too; a page whose zoom tiles fail keeps its base bitmap. (#55) - Android: for accessibility services other than screen readers, page text
is read on demand, not ahead for every visible page. (#55) - Android 12–14 with SDK extension 13: a long press selects text and
onTextSelectionChangefires, as on Android 15+ (long presses were
ignored).enableTextSelection={false}turns it off. (#57) - Android: the view's
renderPage,getOutlineandgetPageSizesrun one
at a time in call order, as on iOS and inPdfDocument; exports run on a
thread of their own. Calls still queued when the document closes or is
replaced reject with "The document was closed". (#41) - Android: reading a malformed file's outline, links and metadata is
bounded in time. A read over the budget fails as a whole instead of
returning partial results: links fall back to the renderer's, and
getOutline/getMetadatareject. Damaged files with cross-reference
streams, which failed with "No document catalog", are now read. (#38) - Both:
exportDocumentinto the download cache's directories rejects
("The export path is in the cache of downloaded documents"). On iOS,
exporting over a remote document'sonLoadfilePathrejects too; it used
to overwrite the cached copy. (#45) - iOS:
print()rejects with "The document was closed" when the view
closes or itssourcechanges while a protected or filled-in document is
prepared; the dialog used to open anyway. (#40) - iOS: AES-128 documents print without a second password prompt (cancelling
it crashed the app). The in-memory print copy of a protected document is
always re-encrypted with AES-128. (#39) - iOS: a filled-in export of a protected document is re-encrypted with
AES-128 and an owner password nobody knows, so its restrictions can't be
lifted; an AES-256 original comes out AES-128. Android keeps the document's
own encryption. (#37) - iOS: a negative or infinite
pageSpacingfalls back to 8 (was 0 /
infinite). (#37) - iOS:
getStats()returns-1for the counters it cannot measure
(cacheHits,cacheMisses,bitmapAllocations,pagesRendered,
rendersCancelled), not0. (#37) - iOS 17+: an existing
%XXescape next to a character that needs encoding
is kept:My%20File 2.pdf→My%20File%202.pdf, notMy%2520File%202.pdf.
(#37)
Features
- open documents from base64 strings (#42) (8440ced), closes #6
- show several PDFs as one document with source={[a, b, c]} (#60) (e7f38eb), closes #5
Bug Fixes
- apply navigation from onLoad once a zero-size iOS view is laid out (#46) (4ce915f), closes #43, references #1
- bound the time the Android parser takes on malformed PDFs (#38) (3d42e4a), closes #27
- enable text selection on Android 12–14 with SDK extension 13 (#57) (b1581d4), closes #25
- ios: keep form reads, edits and exports of long forms off the main thread (#28) (#48) (a0c4944)
- keep the reader's page when a running iOS search is stopped (#33) (4b935ad), closes #19
- open the iOS print dialog only for the document still shown (#40) (8c90b13), closes #21
- parity and robustness fixes, mostly on iOS (#37) (8b678e2)
- print AES-protected documents on iOS without a second password prompt (#39) (cb80303)
- reject exports into the cache of downloaded documents (#45) (d78282b), closes #20
- render zoomed-out Android pages below the fitted width (#44) (05f815c), closes #30
- require React Native 0.83 (Expo SDK 55) (#58), closes #26, references #26
- reuse page bitmaps on Android in landscape and on large screens (#35) (775b4e5), closes #23
- robustness fixes in the Android viewer (#55) (2a379d1), references #43
- run the Android view's reads one at a time (#41) (ef5c81d), closes #24
- stop iOS search highlights from blocking the main thread (#36) (b46d9f1), closes #29, references #29 #29
- stop treating a trip to the background as memory pressure on Android (#34) (76445d2), closes #22