betto_pdfium 0.1.0
betto_pdfium: ^0.1.0 copied to clipboard
A pure Dart package wrapping the PDFium library for PDF rendering, text extraction, and annotation support.
betto_pdfium #
0.1.0 #
First stable release. No functional changes since 0.1.0-dev.4.
0.1.0-dev.4 #
Fixed #
- Native library resolution in a Pub workspace. When
dart testruns from a workspace member package, the native-assets pipeline stages the bundled PDFium library to the workspace root.dart_tool/lib/, not the package's own. The runtime loader previously probed only the current directory, so a PDFium call issued from a spawned isolate (which cannot see the test runner'sLD_LIBRARY_PATH) failed to load the library withcannot open shared object file. The loader now walks up from the working directory, probing each ancestor's.dart_tool/lib/, covering both the single-package and workspace layouts on Linux, macOS, and Windows. This surfaced under Dart 3.13 in thekmdbworkspace's PDF vault indexing.
Toolchain #
- Dart 3.13 support. SDK constraint raised to
^3.13.0. Verified end-to-end against the Dart 3.13 native-assets pipeline: the prebuilt-binary build hook, library loading, and the full native API surface (text/annotation/image extraction, rendering, and search) pass on macOS, Linux (x64 and arm64), and Windows. - lcov 2.x build compatibility. Coverage
lcov/genhtmlinvocations now pass--ignore-errors empty, so the line-only tracefiles Dart emits no longer fail the build under lcov 2.0 (shipped on current Ubuntu runners). - Regenerated the web
pdfium_worker.jswith the Dart 3.13 toolchain.
0.1.0-dev.3 - 2026-07-03 #
Platform support #
- Windows x86_64 — pre-built
pdfium.dll(bblanchon/pdfium-binaries) is now downloaded automatically by the native-assets hook, matching the existing macOS/Linux workflow. No native toolchain required. - Web (WASM) —
PdfDocumentis now fully implemented on Flutter web anddart2wasmviadart:js_interop, covering the complete API surface (metadata, text/annotation/image extraction, rendering, search, table of contents, thumbnails). Runmake fetch_wasm_assetsto place the PDFium WASM + JS + Worker artifacts in your app'sweb/assets/pdfium/directory; see the package README for setup. - Web (WASM) — Web Worker offload — PDFium calls on web now run inside a
dedicated Web Worker instead of the browser main thread, so large document
operations no longer block the UI.
dart:isolateis not supported on web, so this uses a hand-rolledWorker+postMessageprotocol mirroring the nativePdfiumIsolatearchitecture's shape.make fetch_wasm_assetsnow also copies the checked-inpdfium_worker.jsartifact alongsidepdfium.wasm/pdfium.js— no other consumer-facing change. See the README's "Web (WASM)" section, including the "Adopting the Web Worker backend" migration guide, andspec/02_pdfium_isolate.md's "Web Worker concurrency model" section.
0.1.0-dev.2 — 2026-06-30 #
Version bump — no API changes. Minor fix to publication config
0.1.0-dev.1 — 2026-06-29 #
First developer preview. All core PDF operations are implemented and tested (96.1 % line coverage). API is subject to change before 1.0.
Platform support #
Pre-built PDFium binaries (bblanchon/pdfium-binaries chromium/7906) are shipped for:
- macOS arm64
- Linux x86_64 and arm64
- iOS arm64 (xcframework via SPM)
- Android arm64 and x86_64
The binary is downloaded automatically by the native-assets hook on the first
dart test or dart run — no manual setup needed on desktop. Windows and WASM
are not yet supported.
Document loading #
PdfDocument.fromBytes(Uint8List)— loads a PDF from raw bytes into a background isolate so the calling isolate is never blocked.PdfExtractionException— thrown when loading fails;exception.errordistinguishesPdfError.passwordRequiredfromPdfError.invalidDocument.PdfDocument.close()— releases the native PDFium handle; safe to call more than once. AFinalizeris registered as a fallback but explicit disposal is preferred. Afterclose(), all methods throwStateError.
Metadata and document info #
getMetadata()— returnsPdfMetadatawithtitle,author,subject,keywords,creator,producer,creationDate, andmodificationDate. All fields are nullable; dates arePdfDatevalues with a parsedDateTime?.getDocumentInfo()— returnsPdfDocumentInfowithfileVersionand the 16-bytepermanentId/changingIdfile identifiers.pageCount— total page count.
Text extraction #
extractPlainText({int? pageIndex})— streamsPdfPageTextper page. Each result carriestext,hasTextLayer, andhasUnicodeErrors.isPlainTextExtractable()— quick check that returnsfalsewhen too many pages lack a text layer (configurable viaPdfTextExtractorConfig.scannedPageRatio).- Cancelling the stream or calling
close()stops further processing immediately with no handle leaks.
Page size and rendering #
getPageSize(int pageIndex)— returnsPdfPageSizewithwidthPt,heightPt,aspectRatio, andsizeForDpi(dpi)for pixel conversion.renderPageToBytes(pageIndex, pixelWidth, pixelHeight)— renders a page to a raw BGRA pixel buffer; returns({Uint8List pixels, int pixelWidth, int pixelHeight}). Optional flags:renderAnnotations,lcdText,backgroundColor(ARGB packed int).
Annotation extraction #
extractAnnotations({int? pageIndex})— streamsPdfPageAnnotationsper page; pages with no annotations yield an entry with an empty list so callers can track page coverage without gaps.- Concrete annotation types:
PdfTextAnnotation,PdfMarkupAnnotation(highlight, underline, squiggly, strikeout),PdfFreeTextAnnotation,PdfInkAnnotation,PdfShapeAnnotation,PdfPopupAnnotation,PdfStampAnnotation,PdfUnknownAnnotation. PdfMarkupAnnotationincludesquadPointsfor precise text-span geometry.- Annotations with a linked popup carry a non-null
popupfield.
Image extraction #
extractImages({int? pageIndex, bool includeBitmap})— streamsPdfPageImagesper page, each containing a list ofPdfImageobjects with bounding box andPdfImageMetadata(dimensions, colour space, bits per pixel, filter chain).includeBitmap: false(default) — metadata-only; no bitmap allocation.includeBitmap: true— populatesPdfImage.bgrafor every image on the page.renderImage(pageIndex, objectIndex)— fetches the BGRA bitmap for a single image object on demand; returnsnullfor mask-only images.
Search #
search(String query, {Set<PdfSearchFlag> flags, int? pageIndex})— streamsPdfSearchMatchvalues withpageIndex,charIndex, andrectsin PDF user-space (origin bottom-left).- Search flags:
PdfSearchFlag.matchCase,PdfSearchFlag.matchWholeWord,PdfSearchFlag.consecutive.
Table of contents #
tableOfContents— returns the complete bookmark tree asList<PdfTocEntry>. Each entry hastitle,pageIndex, andchildrenfor nested entries. Returns an empty list when the document has no bookmarks.
Thumbnails #
getThumbnail(int pageIndex, {bool generateIfAbsent, int maxDimension})— returns aPdfThumbnailwithbgra,width,height, andsource(embeddedorrendered). When no embedded/Thumbstream is present, a fallback render is produced at the requestedmaxDimension(longest edge) unlessgenerateIfAbsent: false.
pdfinfo CLI tool #
dart run bin/pdfinfo.dart— a command-line tool for inspecting PDF metadata, document info, page count, table of contents, and plain-text extractability.