PackageTrack
Sign in Get early access

pdf_manipulator

Cross-platform PDF toolkit for Flutter. Merge, split, render, extract, search, sign, encrypt, convert, build from scratch. Rust engine, off the main thread.

4.1.0 2.6K downloads/mo #4904 most downloaded on pub.dev whuppi/pdf_manipulator

What this package is like to depend on

Last release 26 days ago

29 Jul 2026

Ships unpredictably

gaps range from 8 days to 3.4 years

Some releases are documented

notes for 18 of 42 stable releases

2 versions withdrawn

withdrawn after publishing

4 years old

63 releases · first in 2022

38 releases in the last 12 months

see the full history below

Release timeline

63 releases · Sep 2022 to Jul 2026
2023 2024 2025 2026
Release Pre-release Withdrawn

Releases

latest 60 of 63
  1. 4.1.0 29 Jul 2026
    Release notes
    • Added scan-dirs: extra directories for keep: auto to scan, on top of your app's lib/ and bin/. Code living somewhere else — a tools/ folder, a sibling package in a monorepo — was invisible to the scan, so a capability you really call could be trimmed away. Now you point at it: scan-dirs: [tools, packages/shared/lib], paths relative to your app. It only applies where there is a scan to widen (keep: auto, and not detector: record-use), and a directory that isn't there keeps the full binary rather than quietly scanning less than you asked for.
    • Verify your app after upgrading: keep: auto now actually trims the native engine, so a build that had been silently shipping every capability gets a smaller one. If anything is missing, state it yourself with keep: [render, …].
    • Fixed setup ignoring your config when run from a subfolder of your project. It read the config and scanned for source relative to wherever you were standing, so from anywhere but the app root it found no pubspec, silently read that as "nothing configured", and shipped the full web engine. Both lanes now locate your app the same way — from a path inside its own .dart_tool/, which neither the working directory nor where you invoke the command can move.
    • Fixed keep: auto keeping every capability on native no matter what your app used. The build hook read its own working directory as your app's source, but hooks are started inside the package they belong to — so the scan matched pdf_manipulator's own implementations and concluded you used all of them, every time, while reporting success. It now derives your app from the hook's output path. Web was never affected: you run setup from your own project, so its scan was always looking in the right place.
    • Fixed the native keep decision being cached for good. The hook registered none of your source as a build dependency, so once it had decided it never looked again — add a sign() call to an app that had already been built and the engine kept compiling without signature support. The source the scan reads is now a hook dependency, so the decision re-evaluates when your app changes.
    Commits since v4.0.0 (4)
    • bbf0ff8 release: v4.1.0
    • 00054ef release: promote dev → prod (v4.1.0) (#210)
    • bd94ef4 Merge branch 'prod' into dev
    • 65f4233 feat: scan-dirs, and make keep: auto actually scan your app (#209)

    Install (git tag)

    dependencies:
      pdf_manipulator:
        git:
          url: https://github.com/whuppi/pdf_manipulator.git
          ref: v4.1.0

    Install (pub.dev)

    dependencies:
      pdf_manipulator: ^4.1.0
    Open source →
    Release notes
    • Added scan-dirs: extra directories for keep: auto to scan, on top of your app's lib/ and bin/. Code living somewhere else — a tools/ folder, a sibling package in a monorepo — was invisible to the scan, so a capability you really call could be trimmed away. Now you point at it: scan-dirs: [tools, packages/shared/lib], paths relative to your app. It only applies where there is a scan to widen (keep: auto, and not detector: record-use), and a directory that isn't there keeps the full binary rather than quietly scanning less than you asked for.
    • Verify your app after upgrading: keep: auto now actually trims the native engine, so a build that had been silently shipping every capability gets a smaller one. If anything is missing, state it yourself with keep: [render, …].
    • Fixed setup ignoring your config when run from a subfolder of your project. It read the config and scanned for source relative to wherever you were standing, so from anywhere but the app root it found no pubspec, silently read that as "nothing configured", and shipped the full web engine. Both lanes now locate your app the same way — from a path inside its own .dart_tool/, which neither the working directory nor where you invoke the command can move.
    • Fixed keep: auto keeping every capability on native no matter what your app used. The build hook read its own working directory as your app's source, but hooks are started inside the package they belong to — so the scan matched pdf_manipulator's own implementations and concluded you used all of them, every time, while reporting success. It now derives your app from the hook's output path. Web was never affected: you run setup from your own project, so its scan was always looking in the right place.
    • Fixed the native keep decision being cached for good. The hook registered none of your source as a build dependency, so once it had decided it never looked again — add a sign() call to an app that had already been built and the engine kept compiling without signature support. The source the scan reads is now a hook dependency, so the decision re-evaluates when your app changes.
    Open source →
  2. 4.1.0-dev.0 28 Jul 2026 pre-release
    Release notes
    • Added scan-dirs: extra directories for keep: auto to scan, on top of your app's lib/ and bin/. Code living somewhere else — a tools/ folder, a sibling package in a monorepo — was invisible to the scan, so a capability you really call could be trimmed away. Now you point at it: scan-dirs: [tools, packages/shared/lib], paths relative to your app. It only applies where there is a scan to widen (keep: auto, and not detector: record-use), and a directory that isn't there keeps the full binary rather than quietly scanning less than you asked for.
    • Verify your app after upgrading: keep: auto now actually trims the native engine, so a build that had been silently shipping every capability gets a smaller one. If anything is missing, state it yourself with keep: [render, …].
    • Fixed setup ignoring your config when run from a subfolder of your project. It read the config and scanned for source relative to wherever you were standing, so from anywhere but the app root it found no pubspec, silently read that as "nothing configured", and shipped the full web engine. Both lanes now locate your app the same way — from a path inside its own .dart_tool/, which neither the working directory nor where you invoke the command can move.
    • Fixed keep: auto keeping every capability on native no matter what your app used. The build hook read its own working directory as your app's source, but hooks are started inside the package they belong to — so the scan matched pdf_manipulator's own implementations and concluded you used all of them, every time, while reporting success. It now derives your app from the hook's output path. Web was never affected: you run setup from your own project, so its scan was always looking in the right place.
    • Fixed the native keep decision being cached for good. The hook registered none of your source as a build dependency, so once it had decided it never looked again — add a sign() call to an app that had already been built and the engine kept compiling without signature support. The source the scan reads is now a hook dependency, so the decision re-evaluates when your app changes.
    Commits since v4.0.0-dev.0 (4)
    • 9627e9d release: v4.1.0-dev.0
    • 65f4233 feat: scan-dirs, and make keep: auto actually scan your app (#209)
    • b624f54 Merge branch 'prod' into dev
    • eeb322d chore: promote dev to prod (3.0.0) (#179)

    Install (git tag)

    dependencies:
      pdf_manipulator:
        git:
          url: https://github.com/whuppi/pdf_manipulator.git
          ref: v4.1.0-dev.0

    Install (pub.dev)

    dependencies:
      pdf_manipulator: ^4.1.0-dev.0
    Open source →
  3. 4.0.0 25 Jul 2026
    Release notes
    • Breaking: the engine is configured with three flat keys under hooks: user_defines: pdf_manipulator:keep (which capabilities compile: auto to scan your source, [render, …] for an exact set, or omit for everything), detector (how auto detects, only valid with keep: auto), and build (how they compile). Migrating from 3.x: trim: autokeep: auto, trim: {keep: [render, …]}keep: [render, …], trim-detector: Xdetector: X, and the web-only setup --trim flag is gone — put your choice in pubspec and re-run flutter pub run pdf_manipulator:setup (web now reads the same block native does). Invalid configs fail the build loudly, never silently: an unknown key, a bad value, or a detector set without keep: auto all stop with a clear message (PR #185)
    • Added build: in that same block — pick HOW the engine compiles: speed (default, prebuilt), size (smaller binary, opt-level z, a little slower), or debug (keeps symbols so a native engine crash points to a file and line). size and debug compile from source and need Rust; works for web and native (PR #185)
    • Changed the prebuilt-binary download to retry transient failures and resume interrupted transfers over HTTP Range, so a flaky network on a large asset (e.g. the ~180 MB iOS static library) no longer forces a slow from-source compile on a single blip (PR #185)
    • Fixed a cryptic failed to load manifest ... feature edition2024 is required cargo error when the engine compiles from source (iOS device builds, git dependencies, or any download-miss) on an older Rust toolchain — the build now checks the required Rust version first and stops with a clear message naming the exact version and the rustup command to install it (#183 reported by @mrhazelh, PR #185)
    Commits since v3.0.0 (18)
    • 29d564f release: v4.0.0
    • c4f6afc release: promote dev → prod (#208)
    • b624f54 Merge branch 'prod' into dev
    • 7502a31 feat!: engine config → keep / detector / build; one compile driver; Rust pin+gate (#183); resilient downloads (#185)
    • cca99f0 ci: bump all action refs (workflows + composites) (#207)
    • 5e9c33f chore: refresh lockfiles (#205)
    • 551491b chore: bump Flutter SDK (#204)
    • b983534 ci: one owner for all action refs (whuppi/ci v2.4.0), Dependabot = pub only (#206)
    • 8927f03 ci: revert Renovate — back to dependabot + upgrade-check (#201)
    • c25c058 ci: Renovate — no hourly PR limit for the go-live backlog (#194)
    • e5c7afe ci: Renovate — open bump PRs immediately (drop not-pending) (#191)
    • 37af265 ci: Renovate — disable commit statuses (unblock PR creation) (#189)
    • d52959c ci: go live on Renovate — remove dependabot + upgrade-check shared job (#188)
    • bd510b6 ci: tune Renovate config (pinDigests + schedules) (#187)
    • a474ca5 ci: add self-hosted Renovate (replaces dependabot + sweeps) (#186)
    • da98a3e chore: bump the deps group with 2 updates (#181)
    • ab9217b chore: refresh lockfiles (#184)
    • 2364765 chore: bump Flutter SDK (#182)

    Install (git tag)

    dependencies:
      pdf_manipulator:
        git:
          url: https://github.com/whuppi/pdf_manipulator.git
          ref: v4.0.0

    Install (pub.dev)

    dependencies:
      pdf_manipulator: ^4.0.0
    Open source →
    Release notes
    • Breaking: the engine is configured with three flat keys under hooks: user_defines: pdf_manipulator:keep (which capabilities compile: auto to scan your source, [render, …] for an exact set, or omit for everything), detector (how auto detects, only valid with keep: auto), and build (how they compile). Migrating from 3.x: trim: autokeep: auto, trim: {keep: [render, …]}keep: [render, …], trim-detector: Xdetector: X, and the web-only setup --trim flag is gone — put your choice in pubspec and re-run flutter pub run pdf_manipulator:setup (web now reads the same block native does). Invalid configs fail the build loudly, never silently: an unknown key, a bad value, or a detector set without keep: auto all stop with a clear message (PR #185)
    • Added build: in that same block — pick HOW the engine compiles: speed (default, prebuilt), size (smaller binary, opt-level z, a little slower), or debug (keeps symbols so a native engine crash points to a file and line). size and debug compile from source and need Rust; works for web and native (PR #185)
    • Changed the prebuilt-binary download to retry transient failures and resume interrupted transfers over HTTP Range, so a flaky network on a large asset (e.g. the ~180 MB iOS static library) no longer forces a slow from-source compile on a single blip (PR #185)
    • Fixed a cryptic failed to load manifest ... feature edition2024 is required cargo error when the engine compiles from source (iOS device builds, git dependencies, or any download-miss) on an older Rust toolchain — the build now checks the required Rust version first and stops with a clear message naming the exact version and the rustup command to install it (#183 reported by @mrhazelh, PR #185)
    Open source →
  4. 4.0.0-dev.0 25 Jul 2026 pre-release
    Release notes
    • Breaking: the engine is configured with three flat keys under hooks: user_defines: pdf_manipulator:keep (which capabilities compile: auto to scan your source, [render, …] for an exact set, or omit for everything), detector (how auto detects, only valid with keep: auto), and build (how they compile). Migrating from 3.x: trim: autokeep: auto, trim: {keep: [render, …]}keep: [render, …], trim-detector: Xdetector: X, and the web-only setup --trim flag is gone — put your choice in pubspec and re-run flutter pub run pdf_manipulator:setup (web now reads the same block native does). Invalid configs fail the build loudly, never silently: an unknown key, a bad value, or a detector set without keep: auto all stop with a clear message (PR #185)
    • Added build: in that same block — pick HOW the engine compiles: speed (default, prebuilt), size (smaller binary, opt-level z, a little slower), or debug (keeps symbols so a native engine crash points to a file and line). size and debug compile from source and need Rust; works for web and native (PR #185)
    • Changed the prebuilt-binary download to retry transient failures and resume interrupted transfers over HTTP Range, so a flaky network on a large asset (e.g. the ~180 MB iOS static library) no longer forces a slow from-source compile on a single blip (PR #185)
    • Fixed a cryptic failed to load manifest ... feature edition2024 is required cargo error when the engine compiles from source (iOS device builds, git dependencies, or any download-miss) on an older Rust toolchain — the build now checks the required Rust version first and stops with a clear message naming the exact version and the rustup command to install it (#183 reported by @mrhazelh, PR #185)
    Commits since v3.0.0-dev.1 (18)
    • a4c1e09 release: v4.0.0-dev.0
    • 7502a31 feat!: engine config → keep / detector / build; one compile driver; Rust pin+gate (#183); resilient downloads (#185)
    • cca99f0 ci: bump all action refs (workflows + composites) (#207)
    • 5e9c33f chore: refresh lockfiles (#205)
    • 551491b chore: bump Flutter SDK (#204)
    • b983534 ci: one owner for all action refs (whuppi/ci v2.4.0), Dependabot = pub only (#206)
    • 8927f03 ci: revert Renovate — back to dependabot + upgrade-check (#201)
    • c25c058 ci: Renovate — no hourly PR limit for the go-live backlog (#194)
    • e5c7afe ci: Renovate — open bump PRs immediately (drop not-pending) (#191)
    • 37af265 ci: Renovate — disable commit statuses (unblock PR creation) (#189)
    • d52959c ci: go live on Renovate — remove dependabot + upgrade-check shared job (#188)
    • bd510b6 ci: tune Renovate config (pinDigests + schedules) (#187)
    • a474ca5 ci: add self-hosted Renovate (replaces dependabot + sweeps) (#186)
    • da98a3e chore: bump the deps group with 2 updates (#181)
    • ab9217b chore: refresh lockfiles (#184)
    • 2364765 chore: bump Flutter SDK (#182)
    • 9fadb24 Merge branch 'prod' into dev
    • 2002f69 chore: promote dev to prod (2.2.0) (#170)

    Install (git tag)

    dependencies:
      pdf_manipulator:
        git:
          url: https://github.com/whuppi/pdf_manipulator.git
          ref: v4.0.0-dev.0

    Install (pub.dev)

    dependencies:
      pdf_manipulator: ^4.0.0-dev.0
    Open source →
  5. 3.0.0 19 Jul 2026
    Release notes
    • Breaking: flattening CJK or emoji form values no longer uses a bundled font (it added 4.4 MB to every install). Register one once: await pdf.registerFallbackFont(PdfFallbackFontKind.cjk, fontBytes) (.emoji for emoji). Without one the value is still saved correctly — only the baked-in look falls back to the field's own font.
    • Breaking (only if you took the retracted 2.2.0): the trim-detector value analyzer is now scan → change it or delete the line — it is the default (PR #172)
    • Engine updated — web: re-run flutter pub run pdf_manipulator:setup --force web (native updates itself)
    • Added trim — keep only the features your app uses (#167). Put trim: auto under hooks: user_defines: pdf_manipulator: in your app pubspec, or choose yourself with trim: {keep: [render, signatures]}; on web also run flutter pub run pdf_manipulator:setup --trim. Needs Rust — the engine compiles once on your machine and is cached. Wrong or missing pieces fail with a clear message, never a broken app.
    • Added Pdf.registerFallbackFont(PdfFallbackFontKind, Uint8List).
    • Changed the default binary: dead engine surfaces, unused barcode support, and the embedded fonts are gone — native 28.7 MB → 21.1 MB, gzipped web download 11.3 MB → 7.3 MB. No action needed.
    • Changed the web build to compile its own wasm-bindgen + wasm-opt inside the engine's cargo workspace, version-locked by the engine's Cargo.lockwasm-bindgen-cli, binaryen, and jq are no longer needed, Rust is the only requirement on every platform, and the exact-version rejection is gone with the tools (#177 reported by @DarkWingMcQuack, PR #178)
    • Fixed the package forcing an old analyzer version onto your app, which blocked current freezed / json_serializable and friends. The analyzer dependency is gone: trim: auto uses a dependency-free source scan. It can only keep slightly more than you use, never less — state trim: {keep: [...]} yourself for the exact minimum (#171 reported by @DarkWingMcQuack, PR #172)
    • Fixed the package archive missing a build file (the engine's Cargo.lock), which broke trim and every compile-from-source path with "No such file or directory" (#171 reported by @DarkWingMcQuack, PR #172)
    • Fixed the web compile error message telling you to install wasm-pack — it is not used. The build now points at the tool it actually misses, with the exact install command (PR #172)
    • Fixed trim: auto counting member names inside comments as usage — a doc line saying "render them" kept the render capability. The scan now ignores comments, and prints where each kept member was matched, e.g. render (lib/preview.dart:12) (#175 reported by @DarkWingMcQuack, PR #178)
    • Fixed source builds failing with "rustup: command not found" on Rust installs not managed by rustup (Homebrew, distro packages) — the build now asks rustc itself whether a target is installed and uses rustup only as the fallback (#176 reported by @DarkWingMcQuack, PR #178)
    Commits since v2.2.0 (8)
    • 705ce19 release: v3.0.0
    • eeb322d chore: promote dev to prod (3.0.0) (#179)
    • 9fadb24 Merge branch 'prod' into dev
    • afd3b45 fix: Rust-only trim toolchain — comment-aware scan, rustc target probe, workspace-locked wasm tools (#178)
    • 7322e8d chore: refresh lockfiles (#174)
    • e423aad ci: run analyze-floor in make check and guard battery-runner completeness
    • 4066afa docs(roadmap): record_use ^0.6.0 pin reason + bump trigger (#173)
    • 23fe620 fix: ship vendor Cargo.lock in the pub tarball + tarball gate (#171) (#172)

    Install (git tag)

    dependencies:
      pdf_manipulator:
        git:
          url: https://github.com/whuppi/pdf_manipulator.git
          ref: v3.0.0

    Install (pub.dev)

    dependencies:
      pdf_manipulator: ^3.0.0
    Open source →
    Release notes
    • Breaking: flattening CJK or emoji form values no longer uses a bundled font (it added 4.4 MB to every install). Register one once: await pdf.registerFallbackFont(PdfFallbackFontKind.cjk, fontBytes) (.emoji for emoji). Without one the value is still saved correctly — only the baked-in look falls back to the field's own font.
    • Breaking (only if you took the retracted 2.2.0): the trim-detector value analyzer is now scan → change it or delete the line — it is the default (PR #172)
    • Engine updated — web: re-run flutter pub run pdf_manipulator:setup --force web (native updates itself)
    • Added trim — keep only the features your app uses (#167). Put trim: auto under hooks: user_defines: pdf_manipulator: in your app pubspec, or choose yourself with trim: {keep: [render, signatures]}; on web also run flutter pub run pdf_manipulator:setup --trim. Needs Rust — the engine compiles once on your machine and is cached. Wrong or missing pieces fail with a clear message, never a broken app.
    • Added Pdf.registerFallbackFont(PdfFallbackFontKind, Uint8List).
    • Changed the default binary: dead engine surfaces, unused barcode support, and the embedded fonts are gone — native 28.7 MB → 21.1 MB, gzipped web download 11.3 MB → 7.3 MB. No action needed.
    • Changed the web build to compile its own wasm-bindgen + wasm-opt inside the engine's cargo workspace, version-locked by the engine's Cargo.lockwasm-bindgen-cli, binaryen, and jq are no longer needed, Rust is the only requirement on every platform, and the exact-version rejection is gone with the tools (#177 reported by @DarkWingMcQuack, PR #178)
    • Fixed the package forcing an old analyzer version onto your app, which blocked current freezed / json_serializable and friends. The analyzer dependency is gone: trim: auto uses a dependency-free source scan. It can only keep slightly more than you use, never less — state trim: {keep: [...]} yourself for the exact minimum (#171 reported by @DarkWingMcQuack, PR #172)
    • Fixed the package archive missing a build file (the engine's Cargo.lock), which broke trim and every compile-from-source path with "No such file or directory" (#171 reported by @DarkWingMcQuack, PR #172)
    • Fixed the web compile error message telling you to install wasm-pack — it is not used. The build now points at the tool it actually misses, with the exact install command (PR #172)
    • Fixed trim: auto counting member names inside comments as usage — a doc line saying "render them" kept the render capability. The scan now ignores comments, and prints where each kept member was matched, e.g. render (lib/preview.dart:12) (#175 reported by @DarkWingMcQuack, PR #178)
    • Fixed source builds failing with "rustup: command not found" on Rust installs not managed by rustup (Homebrew, distro packages) — the build now asks rustc itself whether a target is installed and uses rustup only as the fallback (#176 reported by @DarkWingMcQuack, PR #178)
    Open source →
  6. 3.0.0-dev.1 19 Jul 2026 pre-release
    Release notes
    • Engine updated — web: re-run flutter pub run pdf_manipulator:setup --force web (native updates itself)
    • Changed the web build to compile its own wasm-bindgen + wasm-opt inside the engine's cargo workspace, version-locked by the engine's Cargo.lockwasm-bindgen-cli, binaryen, and jq are no longer needed, Rust is the only requirement on every platform, and the exact-version rejection is gone with the tools (#177 reported by @DarkWingMcQuack, PR #178)
    • Fixed trim: auto counting member names inside comments as usage — a doc line saying "render them" kept the render capability. The scan now ignores comments, and prints where each kept member was matched, e.g. render (lib/preview.dart:12) (#175 reported by @DarkWingMcQuack, PR #178)
    • Fixed source builds failing with "rustup: command not found" on Rust installs not managed by rustup (Homebrew, distro packages) — the build now asks rustc itself whether a target is installed and uses rustup only as the fallback (#176 reported by @DarkWingMcQuack, PR #178)
    Commits since v3.0.0-dev.0 (5)
    • a6dbd77 release: v3.0.0-dev.1
    • afd3b45 fix: Rust-only trim toolchain — comment-aware scan, rustc target probe, workspace-locked wasm tools (#178)
    • 7322e8d chore: refresh lockfiles (#174)
    • e423aad ci: run analyze-floor in make check and guard battery-runner completeness
    • 4066afa docs(roadmap): record_use ^0.6.0 pin reason + bump trigger (#173)

    Install (git tag)

    dependencies:
      pdf_manipulator:
        git:
          url: https://github.com/whuppi/pdf_manipulator.git
          ref: v3.0.0-dev.1

    Install (pub.dev)

    dependencies:
      pdf_manipulator: ^3.0.0-dev.1
    Open source →
  7. 3.0.0-dev.0 17 Jul 2026 pre-release
    Release notes
    • Breaking: flattening CJK or emoji form values no longer uses a bundled font (it added 4.4 MB to every install). Register one once: await pdf.registerFallbackFont(PdfFallbackFontKind.cjk, fontBytes) (.emoji for emoji). Without one the value is still saved correctly — only the baked-in look falls back to the field's own font.
    • Breaking (only if you took the retracted 2.2.0): the trim-detector value analyzer is now scan → change it or delete the line — it is the default (PR #172)
    • Engine updated — web: re-run flutter pub run pdf_manipulator:setup --force web (native updates itself)
    • Added trim — keep only the features your app uses (#167). Put trim: auto under hooks: user_defines: pdf_manipulator: in your app pubspec, or choose yourself with trim: {keep: [render, signatures]}; on web also run flutter pub run pdf_manipulator:setup --trim. Needs Rust — the engine compiles once on your machine and is cached. Wrong or missing pieces fail with a clear message, never a broken app.
    • Added Pdf.registerFallbackFont(PdfFallbackFontKind, Uint8List).
    • Changed the default binary: dead engine surfaces, unused barcode support, and the embedded fonts are gone — native 28.7 MB → 21.1 MB, gzipped web download 11.3 MB → 7.2 MB. No action needed.
    • Fixed the package forcing an old analyzer version onto your app, which blocked current freezed / json_serializable and friends. The analyzer dependency is gone: trim: auto uses a dependency-free source scan. It can only keep slightly more than you use, never less — state trim: {keep: [...]} yourself for the exact minimum (#171 reported by @DarkWingMcQuack, PR #172)
    • Fixed the package archive missing a build file (the engine's Cargo.lock), which broke trim and every compile-from-source path with "No such file or directory" (#171 reported by @DarkWingMcQuack, PR #172)
    • Fixed the web compile error message telling you to install wasm-pack — it is not used. The build now points at the tool it actually misses, with the exact install command (PR #172)
    Commits since v2.2.0-dev.0 (5)

    Install (git tag)

    dependencies:
      pdf_manipulator:
        git:
          url: https://github.com/whuppi/pdf_manipulator.git
          ref: v3.0.0-dev.0

    Install (pub.dev)

    dependencies:
      pdf_manipulator: ^3.0.0-dev.0
    Open source →
  8. 2.2.0 17 Jul 2026 withdrawn
    Release notes

    Warning

    Retracted on pub.dev: the published archive was missing a build file (the engine's Cargo.lock), breaking trim and compile-from-source installs. Use 3.0.0, which consolidates everything here. Git-tag consumers (ref: v2.2.0) are unaffected — this tag and its binaries are complete.

    • Breaking: flattening CJK or emoji form values no longer uses a bundled font (it added 4.4 MB to every install). Register one once: await pdf.registerFallbackFont(PdfFallbackFontKind.cjk, fontBytes) (.emoji for emoji). Without one the value is still saved correctly — only the baked-in look falls back to the field's own font.
    • Engine updated — web: re-run flutter pub run pdf_manipulator:setup --force web (native updates itself)
    • Added trim — keep only the features your app uses (#167). Put trim: auto under hooks: user_defines: pdf_manipulator: in your app pubspec, or choose yourself with trim: {keep: [render, signatures]}; on web also run flutter pub run pdf_manipulator:setup --trim. Needs Rust — the engine compiles once on your machine and is cached. Wrong or missing pieces fail with a clear message, never a broken app.
    • Added Pdf.registerFallbackFont(PdfFallbackFontKind, Uint8List).
    • Changed the default binary: dead engine surfaces, unused barcode support, and the embedded fonts are gone — native 28.7 MB → 21.1 MB, gzipped web download 11.3 MB → 7.2 MB. No action needed.
    Commits since v2.1.4 (7)

    Install (git tag)

    dependencies:
      pdf_manipulator:
        git:
          url: https://github.com/whuppi/pdf_manipulator.git
          ref: v2.2.0

    Install (pub.dev)

    dependencies:
      pdf_manipulator: ^2.2.0
    Open source →
    Release notes

    Retracted on pub.dev: the published archive was missing a build file (the engine's Cargo.lock), breaking trim and compile-from-source installs. Superseded by 3.0.0, which consolidates everything here.

    • Breaking: flattening CJK or emoji form values no longer uses a bundled font (it added 4.4 MB to every install). Register one once: await pdf.registerFallbackFont(PdfFallbackFontKind.cjk, fontBytes) (.emoji for emoji). Without one the value is still saved correctly — only the baked-in look falls back to the field's own font.
    • Engine updated — web: re-run flutter pub run pdf_manipulator:setup --force web (native updates itself)
    • Added trim — keep only the features your app uses (#167). Put trim: auto under hooks: user_defines: pdf_manipulator: in your app pubspec, or choose yourself with trim: {keep: [render, signatures]}; on web also run flutter pub run pdf_manipulator:setup --trim. Needs Rust — the engine compiles once on your machine and is cached. Wrong or missing pieces fail with a clear message, never a broken app.
    • Added Pdf.registerFallbackFont(PdfFallbackFontKind, Uint8List).
    • Changed the default binary: dead engine surfaces, unused barcode support, and the embedded fonts are gone — native 28.7 MB → 21.1 MB, gzipped web download 11.3 MB → 7.2 MB. No action needed.
    Open source →
  9. 2.2.0-dev.0 17 Jul 2026 pre-release withdrawn
    Release notes

    Warning

    Retracted on pub.dev: the published archive was missing a build file (the engine's Cargo.lock), breaking trim and compile-from-source installs. Use 3.0.0, which consolidates everything here. Git-tag consumers (ref: v2.2.0) are unaffected — this tag and its binaries are complete.

    • Breaking: flattening CJK or emoji form values no longer uses a bundled font (it added 4.4 MB to every install). Register one once: await pdf.registerFallbackFont(PdfFallbackFontKind.cjk, fontBytes) (.emoji for emoji). Without one the value is still saved correctly — only the baked-in look falls back to the field's own font.
    • Engine updated — web: re-run flutter pub run pdf_manipulator:setup --force web (native updates itself)
    • Added trim — keep only the features your app uses (#167). Put trim: auto under hooks: user_defines: pdf_manipulator: in your app pubspec, or choose yourself with trim: {keep: [render, signatures]}; on web also run flutter pub run pdf_manipulator:setup --trim. Needs Rust — the engine compiles once on your machine and is cached. Wrong or missing pieces fail with a clear message, never a broken app.
    • Added Pdf.registerFallbackFont(PdfFallbackFontKind, Uint8List).
    • Changed the default binary: dead engine surfaces, unused barcode support, and the embedded fonts are gone — native 28.7 MB → 21.1 MB, gzipped web download 11.3 MB → 7.2 MB. No action needed.
    Commits since v2.1.4-dev.0 (6)
    • deb536c release: v2.2.0-dev.0
    • ff1309d feat: trim — ship only the ops the app calls (#167) (#169)
    • 41155eb ci: bump dorny/paths-filter from 4.0.1 to 4.0.2 in the actions group (#165)
    • 7cde443 chore: refresh lockfiles (#166)
    • cefb01f Merge branch 'prod' into dev
    • cce6645 chore: promote dev to prod (2.1.3) (#158)

    Install (git tag)

    dependencies:
      pdf_manipulator:
        git:
          url: https://github.com/whuppi/pdf_manipulator.git
          ref: v2.2.0-dev.0

    Install (pub.dev)

    dependencies:
      pdf_manipulator: ^2.2.0-dev.0
    Open source →
  10. 2.1.4 13 Jul 2026
    Release notes
    • Engine updated — web: re-run flutter pub run pdf_manipulator:setup --force web (native updates itself)
    • Fixed flattenForms dropping a field's value when the fill and the flatten happen in separate editor sessions — a reopened editor carries no in-session modified-field map, so the flattener now regenerates the appearance from the persisted /V (saved alongside /NeedAppearances) instead of baking the stale placeholder (#161 reported by @DarkWingMcQuack, PR #162)
    • Fixed addImageStamp erasing a page's existing form widgets when the page references its annotations through an indirect /Annots reference rather than a direct array (#161 reported by @DarkWingMcQuack, PR #162)
    • Fixed a reopened filled form rendering blank where its value should appear — the renderer now regenerates a widget's appearance from /V when the AcroForm sets /NeedAppearances, matching the flattener (PR #162)
    Commits since v2.1.3 (7)
    • 260091e release: v2.1.4
    • 14cd751 chore: promote dev to prod (2.1.4) (#164)
    • cefb01f Merge branch 'prod' into dev
    • 0f751b1 docs: 2.1.4 — split-session flatten, indirect /Annots stamp, NeedAppearances render (#163)
    • 0245950 fix: #161 split-session flatten + indirect /Annots stamp (bump pdf_oxide v0.3.73 / office_oxide v0.1.3) (#162)
    • 7dd115d chore: refresh lockfiles (#160)
    • 6e7e8fa chore: bump Flutter SDK (#159)

    Install (git tag)

    dependencies:
      pdf_manipulator:
        git:
          url: https://github.com/whuppi/pdf_manipulator.git
          ref: v2.1.4

    Install (pub.dev)

    dependencies:
      pdf_manipulator: ^2.1.4
    Open source →
    Release notes
    • Engine updated — web: re-run flutter pub run pdf_manipulator:setup --force web (native updates itself)
    • Fixed flattenForms dropping a field's value when the fill and the flatten happen in separate editor sessions — a reopened editor carries no in-session modified-field map, so the flattener now regenerates the appearance from the persisted /V (saved alongside /NeedAppearances) instead of baking the stale placeholder (#161 reported by @DarkWingMcQuack, PR #162)
    • Fixed addImageStamp erasing a page's existing form widgets when the page references its annotations through an indirect /Annots reference rather than a direct array (#161 reported by @DarkWingMcQuack, PR #162)
    • Fixed a reopened filled form rendering blank where its value should appear — the renderer now regenerates a widget's appearance from /V when the AcroForm sets /NeedAppearances, matching the flattener (PR #162)
    Open source →
  11. 2.1.4-dev.0 13 Jul 2026 pre-release

    Nothing published for this version

  12. 2.1.3 07 Jul 2026
    Release notes
    • Engine updated — web: re-run flutter pub run pdf_manipulator:setup --force web (native updates itself)
    • Fixed setFormFieldValue reporting field-not-found on forms whose field names are stored as raw UTF-8 (LibreOffice-class producers) — one spec-tolerant text-string decoder now handles UTF-16BE/LE, UTF-8 with and without BOM, and PDFDocEncoding across every read (#155, PR #156)
    • Fixed flattenForms baking mojibake for values outside ASCII (ßß or ) — values decode per ISO 32000-1 §7.9.2.2 and appearance text is written one WinAnsi byte per character instead of UTF-8 (#155, PR #156)
    • Fixed fill → flatten silently dropping the value on widgets without an appearance stream when the field name is non-ASCII — the flattener and the form extractor now agree on how names decode (#155, PR #156)
    • Fixed flattening CJK and emoji values drawing nothing — the bundled fallback font now ships in both native and web builds and is embedded when the field's own font cannot render the text (#155, PR #156)
    • Fixed document metadata (getTitle and friends) mangling non-ASCII on read, and metadata writes now encode per spec so other readers see the right text (#155, PR #156)
    Open source →
  13. 2.1.3-dev.0 07 Jul 2026 pre-release

    Nothing published for this version

  14. 2.1.2 07 Jul 2026
    Release notes
    • Engine updated — web: re-run flutter pub run pdf_manipulator:setup --force web (native updates itself)
    • Fixed a Flutter Web WASM (dart2wasm) compile failure — the _post switch over Object? was non-exhaustive under dart2wasm (dart2js treats JSAny as a catch-all, dart2wasm doesn't), now converted with jsify() (#145 reported by @DarkWingMcQuack, PR #146)
    • Fixed pub.dev not advertising Flutter Web support — the web runtime now resolves to a stub default that pana can analyze, so the package shows web (dart2js) support (PR #133)
    Open source →
  15. 2.1.2-dev.0 06 Jul 2026 pre-release

    Nothing published for this version

  16. 2.1.1 24 Jun 2026
    Release notes
    • Fixed the README banner not rendering on pub.dev — the <picture> element is flattened to a plain image in the published package (PR #111)
    Open source →
  17. 2.1.1-dev.0 24 Jun 2026 pre-release

    Nothing published for this version

  18. 2.1.0 21 Jun 2026
    Release notes
    • Engine updated — web: re-run flutter pub run pdf_manipulator:setup --force web (native updates itself)
    • Added document producer and creation-date metadata — PdfEditor.setProducer() / getProducer() and setCreationDate() / getCreationDate() (raw PDF date strings, e.g. D:20240101120000Z), plus PdfDoc.producer, PdfDoc.creator, and PdfDoc.creationDate read on open
    • Fixed addImageStamp rendering a transparent-background PNG as a solid black box — the alpha channel now ships as a grayscale /SMask and the PNG predictor params are preserved, so transparent areas reveal the page instead of painting black (#103 reported by @DarkWingMcQuack, PR #104)
    • Fixed the RenderedPage.data doc — render() returns PNG-encoded bytes (decode to read pixels), not raw RGBA (PR #104)
    Open source →
  19. 2.1.0-dev.0 21 Jun 2026 pre-release

    Nothing published for this version

  20. 2.0.2-dev.0 20 Jun 2026 pre-release

    Nothing published for this version

  21. 2.0.1 15 Jun 2026
    Release notes

    Docs-only — no code or API changes.

    • README and every guide (architecture, capabilities, migration, updating, contributing) rewritten, restructured, and verified against the source
    Open source →
  22. 2.0.1-dev.0 15 Jun 2026 pre-release

    Nothing published for this version

  23. 2.0.0 14 Jun 2026
    Release notes

    The concurrency rewrite. Every operation now runs fully isolated on its own lane — a dedicated Rust thread (native) or Web Worker (web).

    • Breaking: webCoordinatorUrl + webWorkerUrl → one webLaneWorkerUrl
    • Breaking: web now ships lane_worker.js (was coordinator.js + worker.js)
    • Engine updated — web: re-run flutter pub run pdf_manipulator:setup --force web (native updates itself)
    • Every method returns PdfTask<T> — a Future plus cancel(); cancelling kills just that job
    • pdf.dispose() is instant — no joins, no timeouts, no leaks; in-flight ops resolve with PdfCancelled
    • Operations on different handles now run truly parallel on native (1.x serialized them)
    • Lane budgets never error — past the cap, work queues instead of failing
    • Added PdfConfig.maxLanes — concurrent lanes per instance (default: half the cores, min 2)
    • All three web modes (JSPI, Atomics, OPFS) behave identically; a bad worker/WASM URL now fails instantly with a typed error instead of hanging
    • Fixed flattening — translated appearances no longer land off-page, unfilled fields render their default value, stamps render their label
    • Fixed missing WASM binaries in the 1.0.6 release
    • Fixed Android 16 KB page-size alignment for Google Play API 35+ (PR whuppi/pdf_oxide#1, @Binary-Parse)
    Open source →
  24. 2.0.0-dev.0 14 Jun 2026 pre-release

    Nothing published for this version

  25. 1.0.6 09 Jun 2026
    Release notes
    • Fixed release build routing for consumer builds (PR #80, @Binary-Parse)
    • Fixed Windows NDK linker .cmd extension for Android cross-compilation (PR #81, @Binary-Parse)
    • Added CI verify tests — release builds now verified on all 6 targets (Android, iOS, macOS, Linux, Windows, Web)
    Open source →
  26. 1.0.6-dev.0 09 Jun 2026 pre-release

    Nothing published for this version

  27. 1.0.5 05 Jun 2026
    Release notes
    • Fixed README version not stamped on pub.dev
    • Updated tracking links for web build hook support
    Open source →
  28. 1.0.5-dev.0 05 Jun 2026 pre-release

    Nothing published for this version

  29. 1.0.4 05 Jun 2026
    Release notes
    • Web setup now verifies all assets against release hashes — detects stale files automatically
    • setup supports --force to re-download everything, --native to pre-fetch the native binary
    Open source →
  30. 1.0.4-dev.0 05 Jun 2026 pre-release

    Nothing published for this version

  31. 1.0.3 05 Jun 2026
    Release notes
    • Fixed changelog on pub.dev
    Open source →
  32. 1.0.3-dev.0 05 Jun 2026 pre-release

    Nothing published for this version

  33. 1.0.2 05 Jun 2026
    Release notes
    • Fixed changelog on pub.dev missing commit history between versions
    Open source →
  34. 1.0.2-dev.0 05 Jun 2026 pre-release

    Nothing published for this version

  35. 1.0.1 05 Jun 2026
    Release notes
    • Added public API doc comments across all exported classes and methods
    • Minimum Android API corrected from 35 to 21 (Android 5.0)
    • Setup command is now flutter pub run pdf_manipulator:setup (avoids triggering native build hooks with dart run)
    Open source →
  36. 1.0.1-dev.0 05 Jun 2026 pre-release

    Nothing published for this version

  37. 1.0.0 03 Jun 2026
    Release notes

    Complete ground-up rewrite — new Rust engine, new instance API, cross-platform (previously Android only). The package docs carry the migration guide and the full capability list.

    • Engine: pdf_oxide (Rust, MIT/Apache-2.0) replaces the Android-only backend
    • Targets: iOS, Android, macOS, Windows, Linux, Web — previously Android only
    • API: instance-based Pdf() with dispose(); batch editing via pdf.edit(source), create from scratch via pdf.build()
    • I/O: DataSource in, DataSink out — no file paths, no dart:io, same code on every target
    • Errors: typed PdfError sealed class — no more PlatformException
    • Performance: every operation off the main thread, no full-file buffers
    • SDK: requires Dart >=3.10.0
    Open source →
  38. 1.0.0-dev.0 03 Jun 2026 pre-release

    Nothing published for this version

  39. 0.5.9 06 Jan 2023
    Release notes

    <!-- release: no-tag -->

    • The last release of Android-only version before the cross-platform rewrite.
    Open source →
  40. 0.5.8 29 Dec 2022

    Nothing published for this version

  41. 0.5.7 02 Dec 2022

    Nothing published for this version

  42. 0.5.6 18 Nov 2022

    Nothing published for this version

  43. 0.5.5 13 Nov 2022

    Nothing published for this version

  44. 0.5.4 13 Nov 2022

    Nothing published for this version

  45. 0.5.3 13 Nov 2022

    Nothing published for this version

  46. 0.5.2 10 Nov 2022

    Nothing published for this version

  47. 0.5.1 07 Nov 2022

    Nothing published for this version

  48. 0.4.9 07 Nov 2022

    Nothing published for this version

  49. 0.4.8 05 Nov 2022

    Nothing published for this version

  50. 0.4.7 05 Nov 2022

    Nothing published for this version

  51. 0.4.6 05 Nov 2022

    Nothing published for this version

  52. 0.4.5 27 Oct 2022

    Nothing published for this version

  53. 0.4.4 24 Oct 2022

    Nothing published for this version

  54. 0.4.3 17 Oct 2022

    Nothing published for this version

  55. 0.4.2 16 Oct 2022

    Nothing published for this version

  56. 0.4.1 15 Oct 2022

    Nothing published for this version

  57. 0.3.2 15 Oct 2022

    Nothing published for this version

  58. 0.3.1 15 Oct 2022

    Nothing published for this version

  59. 0.2.2 14 Oct 2022

    Nothing published for this version

  60. 0.2.1 11 Oct 2022

    Nothing published for this version

Every package, every release, already written down.

The archive is open and free. Watching your own project is what we are building next.

Browse the archive