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 2026Releases
latest 60 of 63-
4.1.029 Jul 2026Release notes
Open source →- Added
scan-dirs: extra directories forkeep: autoto scan, on top of your app'slib/andbin/. Code living somewhere else — atools/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 notdetector: 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: autonow 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 withkeep: [render, …]. - Fixed
setupignoring 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: autokeeping 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 runsetupfrom 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.
- 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
Release notes
Open source →- Added
scan-dirs: extra directories forkeep: autoto scan, on top of your app'slib/andbin/. Code living somewhere else — atools/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 notdetector: 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: autonow 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 withkeep: [render, …]. - Fixed
setupignoring 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: autokeeping 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 runsetupfrom 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.
- Added
-
4.1.0-dev.028 Jul 2026 pre-releaseRelease notes
Open source →- Added
scan-dirs: extra directories forkeep: autoto scan, on top of your app'slib/andbin/. Code living somewhere else — atools/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 notdetector: 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: autonow 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 withkeep: [render, …]. - Fixed
setupignoring 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: autokeeping 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 runsetupfrom 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.
- 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
- Added
-
4.0.025 Jul 2026Release notes
Open source →- Breaking: the engine is configured with three flat keys under
hooks: user_defines: pdf_manipulator:—keep(which capabilities compile:autoto scan your source,[render, …]for an exact set, or omit for everything),detector(howautodetects, only valid withkeep: auto), andbuild(how they compile). Migrating from 3.x:trim: auto→keep: auto,trim: {keep: [render, …]}→keep: [render, …],trim-detector: X→detector: X, and the web-onlysetup --trimflag is gone — put your choice in pubspec and re-runflutter 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 adetectorset withoutkeep: autoall 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), ordebug(keeps symbols so a native engine crash points to a file and line).sizeanddebugcompile 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 requiredcargo 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 therustupcommand to install it (#183 reported by @mrhazelh, PR #185)
- 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
Release notes
Open source →- Breaking: the engine is configured with three flat keys under
hooks: user_defines: pdf_manipulator:—keep(which capabilities compile:autoto scan your source,[render, …]for an exact set, or omit for everything),detector(howautodetects, only valid withkeep: auto), andbuild(how they compile). Migrating from 3.x:trim: auto→keep: auto,trim: {keep: [render, …]}→keep: [render, …],trim-detector: X→detector: X, and the web-onlysetup --trimflag is gone — put your choice in pubspec and re-runflutter 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 adetectorset withoutkeep: autoall 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), ordebug(keeps symbols so a native engine crash points to a file and line).sizeanddebugcompile 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 requiredcargo 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 therustupcommand to install it (#183 reported by @mrhazelh, PR #185)
- Breaking: the engine is configured with three flat keys under
-
4.0.0-dev.025 Jul 2026 pre-releaseRelease notes
Open source →- Breaking: the engine is configured with three flat keys under
hooks: user_defines: pdf_manipulator:—keep(which capabilities compile:autoto scan your source,[render, …]for an exact set, or omit for everything),detector(howautodetects, only valid withkeep: auto), andbuild(how they compile). Migrating from 3.x:trim: auto→keep: auto,trim: {keep: [render, …]}→keep: [render, …],trim-detector: X→detector: X, and the web-onlysetup --trimflag is gone — put your choice in pubspec and re-runflutter 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 adetectorset withoutkeep: autoall 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), ordebug(keeps symbols so a native engine crash points to a file and line).sizeanddebugcompile 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 requiredcargo 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 therustupcommand to install it (#183 reported by @mrhazelh, PR #185)
- 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
- Breaking: the engine is configured with three flat keys under
-
3.0.019 Jul 2026Release notes
Open source →- 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)(.emojifor 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-detectorvalueanalyzeris nowscan→ 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: autounderhooks: user_defines: pdf_manipulator:in your app pubspec, or choose yourself withtrim: {keep: [render, signatures]}; on web also runflutter 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.lock—wasm-bindgen-cli,binaryen, andjqare 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
analyzerversion onto your app, which blocked current freezed / json_serializable and friends. Theanalyzerdependency is gone:trim: autouses a dependency-free source scan. It can only keep slightly more than you use, never less — statetrim: {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 broketrimand 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: autocounting 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)
- 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
Release notes
Open source →- 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)(.emojifor 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-detectorvalueanalyzeris nowscan→ 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: autounderhooks: user_defines: pdf_manipulator:in your app pubspec, or choose yourself withtrim: {keep: [render, signatures]}; on web also runflutter 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.lock—wasm-bindgen-cli,binaryen, andjqare 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
analyzerversion onto your app, which blocked current freezed / json_serializable and friends. Theanalyzerdependency is gone:trim: autouses a dependency-free source scan. It can only keep slightly more than you use, never less — statetrim: {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 broketrimand 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: autocounting 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)
- Breaking: flattening CJK or emoji form values no longer uses a bundled font (it added 4.4 MB to every install). Register one once:
-
3.0.0-dev.119 Jul 2026 pre-releaseRelease notes
Open source →- 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.lock—wasm-bindgen-cli,binaryen, andjqare 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: autocounting 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)
- 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
- Engine updated — web: re-run
-
3.0.0-dev.017 Jul 2026 pre-releaseRelease notes
Open source →- 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)(.emojifor 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-detectorvalueanalyzeris nowscan→ 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: autounderhooks: user_defines: pdf_manipulator:in your app pubspec, or choose yourself withtrim: {keep: [render, signatures]}; on web also runflutter 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
analyzerversion onto your app, which blocked current freezed / json_serializable and friends. Theanalyzerdependency is gone:trim: autouses a dependency-free source scan. It can only keep slightly more than you use, never less — statetrim: {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 broketrimand 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)
- 8e78afc release: v3.0.0-dev.0
- 23fe620 fix: ship vendor Cargo.lock in the pub tarball + tarball gate (#171) (#172)
- 6ce511d Merge branch 'prod' into dev
- f15167e chore: bump pinned versions (#168)
- 14cd751 chore: promote dev to prod (2.1.4) (#164)
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
- Breaking: flattening CJK or emoji form values no longer uses a bundled font (it added 4.4 MB to every install). Register one once:
-
2.2.017 Jul 2026 withdrawnRelease notes
Open source →Warning
Retracted on pub.dev: the published archive was missing a build file (the engine's
Cargo.lock), breakingtrimand 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)(.emojifor 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: autounderhooks: user_defines: pdf_manipulator:in your app pubspec, or choose yourself withtrim: {keep: [render, signatures]}; on web also runflutter 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.
- 1a51770 release: v2.2.0
- 2002f69 chore: promote dev to prod (2.2.0) (#170)
- 6ce511d Merge branch 'prod' into dev
- f15167e chore: bump pinned versions (#168)
- 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)
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
Release notes
Open source →Retracted on pub.dev: the published archive was missing a build file (the engine's
Cargo.lock), breakingtrimand 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)(.emojifor 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: autounderhooks: user_defines: pdf_manipulator:in your app pubspec, or choose yourself withtrim: {keep: [render, signatures]}; on web also runflutter 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.
- Breaking: flattening CJK or emoji form values no longer uses a bundled font (it added 4.4 MB to every install). Register one once:
-
2.2.0-dev.017 Jul 2026 pre-release withdrawnRelease notes
Open source →Warning
Retracted on pub.dev: the published archive was missing a build file (the engine's
Cargo.lock), breakingtrimand 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)(.emojifor 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: autounderhooks: user_defines: pdf_manipulator:in your app pubspec, or choose yourself withtrim: {keep: [render, signatures]}; on web also runflutter 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.
- 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
- Breaking: flattening CJK or emoji form values no longer uses a bundled font (it added 4.4 MB to every install). Register one once:
-
2.1.413 Jul 2026Release notes
Open source →- Engine updated — web: re-run
flutter pub run pdf_manipulator:setup --force web(native updates itself) - Fixed
flattenFormsdropping 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
addImageStamperasing a page's existing form widgets when the page references its annotations through an indirect/Annotsreference 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
/Vwhen the AcroForm sets/NeedAppearances, matching the flattener (PR #162)
- 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
Release notes
Open source →- Engine updated — web: re-run
flutter pub run pdf_manipulator:setup --force web(native updates itself) - Fixed
flattenFormsdropping 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
addImageStamperasing a page's existing form widgets when the page references its annotations through an indirect/Annotsreference 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
/Vwhen the AcroForm sets/NeedAppearances, matching the flattener (PR #162)
- Engine updated — web: re-run
-
2.1.4-dev.013 Jul 2026 pre-releaseNothing published for this version
-
2.1.307 Jul 2026Release notes
Open source →- Engine updated — web: re-run
flutter pub run pdf_manipulator:setup --force web(native updates itself) - Fixed
setFormFieldValuereporting 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
flattenFormsbaking 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 (
getTitleand friends) mangling non-ASCII on read, and metadata writes now encode per spec so other readers see the right text (#155, PR #156)
- Engine updated — web: re-run
-
2.1.3-dev.007 Jul 2026 pre-releaseNothing published for this version
-
2.1.207 Jul 2026Release notes
Open source →- 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_postswitch overObject?was non-exhaustive under dart2wasm (dart2js treatsJSAnyas a catch-all, dart2wasm doesn't), now converted withjsify()(#145 reported by @DarkWingMcQuack, PR #146) - Fixed pub.dev not advertising Flutter Web support — the web runtime now resolves to a stub default that
panacan analyze, so the package shows web (dart2js) support (PR #133)
- Engine updated — web: re-run
-
2.1.2-dev.006 Jul 2026 pre-releaseNothing published for this version
-
2.1.124 Jun 2026Release notes
Open source →- Fixed the README banner not rendering on pub.dev — the
<picture>element is flattened to a plain image in the published package (PR #111)
- Fixed the README banner not rendering on pub.dev — the
-
2.1.1-dev.024 Jun 2026 pre-releaseNothing published for this version
-
2.1.021 Jun 2026Release notes
Open source →- 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()andsetCreationDate()/getCreationDate()(raw PDF date strings, e.g.D:20240101120000Z), plusPdfDoc.producer,PdfDoc.creator, andPdfDoc.creationDateread on open - Fixed
addImageStamprendering a transparent-background PNG as a solid black box — the alpha channel now ships as a grayscale/SMaskand 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.datadoc —render()returns PNG-encoded bytes (decode to read pixels), not raw RGBA (PR #104)
- Engine updated — web: re-run
-
2.1.0-dev.021 Jun 2026 pre-releaseNothing published for this version
-
2.0.2-dev.020 Jun 2026 pre-releaseNothing published for this version
-
2.0.115 Jun 2026Release notes
Open source →Docs-only — no code or API changes.
- README and every guide (architecture, capabilities, migration, updating, contributing) rewritten, restructured, and verified against the source
-
2.0.1-dev.015 Jun 2026 pre-releaseNothing published for this version
-
2.0.014 Jun 2026Release notes
Open source →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→ onewebLaneWorkerUrl - Breaking: web now ships
lane_worker.js(wascoordinator.js+worker.js) - Engine updated — web: re-run
flutter pub run pdf_manipulator:setup --force web(native updates itself) - Every method returns
PdfTask<T>— aFuturepluscancel(); cancelling kills just that job pdf.dispose()is instant — no joins, no timeouts, no leaks; in-flight ops resolve withPdfCancelled- 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)
- Breaking:
-
2.0.0-dev.014 Jun 2026 pre-releaseNothing published for this version
-
1.0.609 Jun 2026Release notes
Open source →- Fixed release build routing for consumer builds (PR #80, @Binary-Parse)
- Fixed Windows NDK linker
.cmdextension 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)
-
1.0.6-dev.009 Jun 2026 pre-releaseNothing published for this version
-
1.0.505 Jun 2026Release notes
Open source →- Fixed README version not stamped on pub.dev
- Updated tracking links for web build hook support
-
1.0.5-dev.005 Jun 2026 pre-releaseNothing published for this version
-
1.0.405 Jun 2026Release notes
Open source →- Web setup now verifies all assets against release hashes — detects stale files automatically
setupsupports--forceto re-download everything,--nativeto pre-fetch the native binary
-
1.0.4-dev.005 Jun 2026 pre-releaseNothing published for this version
-
1.0.305 Jun 2026 -
1.0.3-dev.005 Jun 2026 pre-releaseNothing published for this version
-
1.0.205 Jun 2026 -
1.0.2-dev.005 Jun 2026 pre-releaseNothing published for this version
-
1.0.105 Jun 2026Release notes
Open source →- 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 withdart run)
-
1.0.1-dev.005 Jun 2026 pre-releaseNothing published for this version
-
1.0.003 Jun 2026Release notes
Open source →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()withdispose(); batch editing viapdf.edit(source), create from scratch viapdf.build() - I/O:
DataSourcein,DataSinkout — no file paths, nodart:io, same code on every target - Errors: typed
PdfErrorsealed class — no morePlatformException - Performance: every operation off the main thread, no full-file buffers
- SDK: requires Dart >=3.10.0
-
1.0.0-dev.003 Jun 2026 pre-releaseNothing published for this version
-
0.5.906 Jan 2023Release notes
Open source →<!-- release: no-tag -->
- The last release of Android-only version before the cross-platform rewrite.
-
0.5.829 Dec 2022Nothing published for this version
-
0.5.702 Dec 2022Nothing published for this version
-
0.5.618 Nov 2022Nothing published for this version
-
0.5.513 Nov 2022Nothing published for this version
-
0.5.413 Nov 2022Nothing published for this version
-
0.5.313 Nov 2022Nothing published for this version
-
0.5.210 Nov 2022Nothing published for this version
-
0.5.107 Nov 2022Nothing published for this version
-
0.4.907 Nov 2022Nothing published for this version
-
0.4.805 Nov 2022Nothing published for this version
-
0.4.705 Nov 2022Nothing published for this version
-
0.4.605 Nov 2022Nothing published for this version
-
0.4.527 Oct 2022Nothing published for this version
-
0.4.424 Oct 2022Nothing published for this version
-
0.4.317 Oct 2022Nothing published for this version
-
0.4.216 Oct 2022Nothing published for this version
-
0.4.115 Oct 2022Nothing published for this version
-
0.3.215 Oct 2022Nothing published for this version
-
0.3.115 Oct 2022Nothing published for this version
-
0.2.214 Oct 2022Nothing published for this version
-
0.2.111 Oct 2022Nothing published for this version