pdf_manipulator 5.0.1 copy "pdf_manipulator: ^5.0.1" to clipboard
pdf_manipulator: ^5.0.1 copied to clipboard

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

Changelog #

5.0.1 #

  • Engine updated — web: re-run flutter pub run pdf_manipulator:setup --force web (native updates itself)
  • Fixed a keep: list without extract, such as keep: [], failing to compile the engine with cannot find search in crate — the search module now compiles in every keep-set (#256 reported by @DarkWingMcQuack)
  • Fixed a PDF encrypted with Standard Security R2–R4 (RC4) failing to open on web with compiled without 'legacy-crypto' — the web engine now carries the same legacy encryption and ICC colour support as native (#257 reported by @crurui)
Commits since v5.0.0 (10)
  • cd83915 stamp: asset hashes for v5.0.1
  • 3b9d837 release: v5.0.1
  • dfa7c6b release: promote dev → prod (v5.0.1) (#259)
  • f08b245 Merge branch 'prod' into dev
  • 51a259f fix: every keep-set compiles, and web opens R2-R4 encrypted PDFs (#256, #257) (#258)
  • 7896412 chore: bump Flutter SDK (#254)
  • f2a90a9 chore: refresh lockfiles (#253)
  • 13d080c chore: bump pinned versions (#252)
  • 5f34453 chore: bump the deps group with 2 updates (#255)
  • 6cbe43b chore: refresh lockfiles (#251)

5.0.0 #

  • Breaking: PdfEditor.optimizeImages(quality:, minSize:) is removed → use reduceImages(PdfImagePolicy(jpegQuality: quality, minPixels: minSize, convertCmykToRgb: true)); the count it returned is report.changed
  • Breaking: compress(imageQuality:) → compress(images:), a PdfImagePolicy defaulting to PdfImagePolicy.ebook (150 ppi, JPEG quality 75), so a plain compress now downsamples images drawn above 225 ppi; pass PdfImagePolicy(jpegQuality: q) for the old behaviour
  • Breaking: the editor's argument-less reads are getters (a property reads as a noun, never with a get prefix): getTitle() → title, getAuthor() → author, getSubject() → subject, getKeywords() → keywords, getProducer() → producer, getCreationDate() → creationDate, and on PdfDoc getSignatures() → signatures; the one read with an argument is a noun method, getPageMediaBox(page) → pageMediaBox(page)
  • Breaking: flattenAllAnnotations() is flattenAnnotations({int? page}), and flattenForms() gains the same optional page; without it both flatten every page as before
  • Breaking: applyRedactions() now returns a PdfRedactionReport (regions, glyphs removed, images modified or removed, paths pruned) instead of void; awaiting it still applies the redactions
  • Breaking: mergeFrom(other) gains pages: (a 0-based list; null merges every page) and embedFile(name, data) gains description:, mimeType: and relationship:; positional callers are unchanged
  • Engine updated — web: re-run flutter pub run pdf_manipulator:setup --force web (native updates itself)
  • Added PdfEditor.pageImages(page) — every image XObject drawn on a page with its resource name, bounds and transform; the name is what resizeImage takes
  • Added PdfEditor.repositionImage(page, name, x:, y:) and setImageBounds(page, name, bounds) — move, or move and resize, an image by the name pageImages lists
  • Added PdfEditor.reduceImages(PdfImagePolicy) — downsamples images to the resolution they are drawn at and re-encodes them by kind (JPEG, predicted Flate, CCITT G4), soft masks included, presets screen/ebook/print/lossless, one PdfImageReport row per image with the reason when it is kept; images reached only through annotation appearances, patterns or inline BI … EI stay as stored
  • Added compress(images: PdfImagePolicy.screen) — the one-shot takes the same policy
  • Added PdfImagePolicy.minSavings (default 10%: a lossy re-encode must earn its bytes or the image is kept), chromaSubsampling (auto = 4:4:4 from quality 90, full, half; print pins full) and recompressJpeg (re-encode stored JPEGs at jpegQuality even when not downsampled; off by default)
  • Added PdfEditor.pageCropBox(page) (null when the page has no CropBox), setPageMediaBox, setPageCropBox and setPageRotation(page, degrees:) (absolute, where rotatePage is relative)
  • Added PdfEditor.clearEraseRegions(page) to drop the regions queued by eraseRegions before save
  • Added PdfEditor.sanitize(PdfSanitizeOptions) — strip metadata, JavaScript actions and embedded files in one pass; scrubMetadata() is its metadata-only form
  • Added PdfDoc.formFields and formField(name) — every AcroForm field with its type, typed value, tooltip, bounds, max length, alignment and read-only/required flags
  • Added the form field property setters on PdfEditor: removeFormField, setFormFieldReadOnly, setFormFieldRequired, setFormFieldTooltip, setFormFieldBounds, setFormFieldMaxLength, setFormFieldAlignment, setFormFieldBackgroundColor, setFormFieldBorderColor, setFormFieldBorderWidth, setFormFieldAppearance and setFormFieldFlags — each read back after save by formFields
  • Added PdfDoc.exportFormData(sink, format:) — the filled values as FDF or XFDF
  • Added PdfDoc.xfa (PdfXfaInfo with field count, page count and field types, or null without an XFA packet) and the one-shot convertXfaToAcroForm(source, output) that rewrites an XFA form as a plain AcroForm
  • Added PdfDoc.attachments (name, size, description, MIME type, read from the name tree without decoding the files) and extractAttachment(name, sink)
  • Fixed images optimized in an edit session being saved unchanged — the full-rewrite writer copied page-referenced XObjects from the source and skipped the staged replacement
  • Fixed pageImages listing Form XObjects — only /Subtype /Image resources are listed, so every name is a valid resizeImage target
  • Fixed a DOCX table converting to PDF several times wider than declared, columns off the page — the converter now honours the w:tblGrid widths, scaled to the printable width (#243 reported by @kampmapa1-design)
  • Fixed a web instance failing with WASM init failed: Out of memory during rapid create-and-dispose churn — a worker slot is freed when the browser confirms the worker is gone, not at terminate()
  • Fixed pageMediaBox returning the box's far corner as its width and height whenever the MediaBox origin is not (0, 0)
  • Fixed form field property changes being lost on save unless the form was also flattened — the engine wrote only the value; every property and a removed field now reach the saved file
  • Fixed eraseRegions and addRedaction acting on the wrong rectangle — the width and height were passed where the far corner was expected, so every region past the origin was off by its own size
  • Fixed addStamp losing the stamp on save when its rectangle sits high on the page — the same size-for-corner mix-up placed the label above the page edge; the builder's image was drawn at the wrong size for the same reason
  • Fixed mergeFrom dropping the merged document's form fields — the pages arrived but no /Fields entry pointed at them, so they could not be listed or filled; the AcroForm is carried across now
  • Fixed an embedded file's MIME type being written as text#232Fplain — the solidus was escaped twice
  • Vendored engines synced upstream: pdf_oxide v0.3.73 → v0.3.78 and office_oxide v0.1.3 → v0.1.11 (extraction, rendering, table-structure and legacy .doc fixes)
Commits since v4.2.0 (10)
  • cfe2c92 stamp: asset hashes for v5.0.0
  • 03e85e6 release: v5.0.0
  • 02ae148 release: promote dev → prod (v5.0.0) (#250)
  • d39c358 Merge branch 'prod' into dev
  • 83d218f feat!: 5.0.0 — image reducer, image edits, and every PLANNED capability row (#249)
  • b72a04d fix: DOCX tables convert at their declared widths (#243); vendors synced; web worker budget frees a slot on confirmed death (#248)
  • e16164f chore: bump pinned versions (#245)
  • afd708e chore: refresh lockfiles (#246)
  • bd388a8 chore: bump Flutter SDK (#247)
  • 30cd3f0 chore: bump code_assets from 1.2.1 to 2.0.0 in the deps group (#244)

4.2.0 #

  • Engine updated — web: re-run flutter pub run pdf_manipulator:setup --force web (native updates itself)
  • Added setCheckboxFieldValue(fieldName, checked) — checks a checkbox without knowing its on-state name (/Yes, /On, /1 …); setFormFieldValue still takes the name directly
  • Fixed a checked checkbox flattening as an empty box and losing its value on reopen — button values are read, resolved and written as appearance-state names, and flattening draws the state that was set (#215 reported by @DarkWingMcQuack)
  • Fixed radio groups being impossible to select — the state is set on the kid widget that offers it (siblings cleared), and the Radio/Pushbutton flag bits are read per ISO 32000-1
Commits since v4.1.0 (31)
  • 7688536 stamp: asset hashes for v4.2.0
  • ebcbaad release: v4.2.0
  • 2bc950c release: promote dev → prod (v4.2.0) (#242)
  • 357d6e4 Merge branch 'prod' into dev
  • 750cc12 fix: checked checkboxes and selected radios flatten as set (#215) (#218)
  • 97a47b1 ci: whuppi/ci v2.7.3 (#241)
  • 6649f0c ci: pkg: Web rows keep their host hook tree on ghcr under their own family (#240)
  • cd33e85 ci: int: Android rows keep their hook trees on ghcr under their own family (#239)
  • b4c655c ci: verify: Android and verify: macOS keep their hook trees on ghcr under their own families (#238)
  • 5a89cd4 ci: whuppi/ci v2.7.2 (#237)
  • 6e033aa ci: compile rows keep their release trees on ghcr under their own family (#236)
  • 20b978a ci: whuppi/ci 2.7.0 → 2.7.1 (SDK cache key carries the runner image version) (#235)
  • 3afd1b6 ci: cache diagnostics — restored-artifacts summary; probe dispatch input (#234)
  • 4725c8d ci: whuppi/ci 2.6.3 → 2.7.0; Android SDK components from ghcr on the emulator rows (#233)
  • 070689a ci: the Rust test family keeps its whole target trees on ghcr.io (#232)
  • 2038a2c ci: engine-artifacts archive carries the crates' fingerprints and build dirs (#231)
  • 013ebdf ci: whuppi/ci 2.6.1 → 2.6.3 (ghcr restore resilience, Windows symlinks, emulator version) (#230)
  • 2745f3f ci: whuppi/ci 2.6.0 → 2.6.1 (SDK cache keyed on the .fvmrc version; emulator version parse) (#229)
  • fe18919 ci: keep the big caches on ghcr.io via whuppi/ci 2.6.0 oci-cache (#228)
  • c6d178e ci: compile rows share the deps archive and own only their engine-artifacts archive (#227)
  • 28f2d02 ci: warm the caches from dev; PR runs read only; delete a PR's caches on close (#226)
  • a7bb13f ci: run the engine test suites through cargo-nextest and link with mold (#225)
  • 6d2c92d ci: cache cargo's target dir with rust-cache; one target dir for every build path; cold guard (#224)
  • d17f23c chore: refresh lockfiles (#222)
  • 048a591 ci: bump all action refs (workflows + composites) (#213)
  • e992002 chore: reformat under the Flutter 3.47.2 formatter (#221)
  • 7d27b2a chore: bump pinned versions (#211)
  • f6b303b chore: bump Flutter SDK (#214)
  • dee1675 ci: bump whuppi/ci refs to v2.4.1 (#220)
  • 812f1a4 docs: point S8 at where release.sh actually lives (#219)
  • 76adf8e test: mark hook_app_root_test dart:io-exempt (#217)

4.1.0 #

  • Added scan-dirs — extra directories for keep: auto to scan beyond lib/ and bin/ (scan-dirs: [tools, packages/shared/lib], relative to your app); a directory that is not there keeps the full binary rather than scanning less
  • Verify your app after upgrading: keep: auto now actually trims the native engine; if something is missing, state it with keep: [render, …]
  • Fixed setup ignoring your config when run from a subfolder of your project — both lanes now locate your app from its own .dart_tool/, not from the working directory
  • Fixed keep: auto keeping every capability on native — the build hook scanned its own package instead of your app; it now derives your app from the hook's output path (web was never affected)
  • Fixed the native keep decision never re-evaluating — your source is now a hook dependency, so adding a sign() call recompiles the engine with signatures
Commits since v4.0.0 (5)
  • 1b5edb1 stamp: asset hashes for v4.1.0
  • 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)

4.0.0 #

  • Breaking: the engine is configured with three flat keys under hooks: user_defines: pdf_manipulator: — keep (auto, [render, …], or omit for everything), detector (only with keep: auto) and build. Migrate: trim: auto → keep: auto, trim: {keep: […]} → keep: […], trim-detector: X → detector: X, drop setup --trim and re-run flutter pub run pdf_manipulator:setup; an invalid config fails the build with a clear message
  • Added build: in the same block — speed (default, prebuilt), size (smaller, opt-level z) or debug (symbols for native crash traces); size and debug compile from source and need Rust
  • Changed the prebuilt-binary download to retry and resume over HTTP Range, so one network blip on a large asset no longer forces a from-source compile
  • Fixed a cryptic feature edition2024 is required cargo error on older Rust toolchains — the build checks the required Rust version first and names the rustup command to run (#183 reported by @mrhazelh)
Commits since v3.0.0 (19)
  • 56ab37f stamp: asset hashes for v4.0.0
  • 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)

3.0.0 #

  • Breaking: flattening CJK or emoji form values no longer uses a bundled font (4.4 MB on every install) → register one: await pdf.registerFallbackFont(PdfFallbackFontKind.cjk, fontBytes) (.emoji for emoji); without one the value is still saved, only the baked-in look falls back to the field's font
  • Breaking (only if you took the retracted 2.2.0): trim-detector: analyzer is now scan → change it or delete the line, it is the default
  • 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: trim: auto under hooks: user_defines: pdf_manipulator:, or trim: {keep: [render, signatures]}; on web also run flutter pub run pdf_manipulator:setup --trim; needs Rust, compiled once and cached (#167)
  • Added Pdf.registerFallbackFont(PdfFallbackFontKind, Uint8List)
  • Changed the default binary — dead engine surfaces, 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 wasm-bindgen and wasm-opt inside the engine's cargo workspace — wasm-bindgen-cli, binaryen and jq are no longer needed, Rust is the only requirement (#177 reported by @DarkWingMcQuack)
  • Fixed the package forcing an old analyzer version onto your app — the dependency is gone; trim: auto uses a dependency-free scan that can only keep slightly more than you use, never less (#171 reported by @DarkWingMcQuack)
  • Fixed the package archive missing the engine's Cargo.lock, which broke trim and every compile-from-source path (#171 reported by @DarkWingMcQuack)
  • Fixed the web compile error telling you to install wasm-pack — it now names the tool it actually misses, with the install command
  • Fixed trim: auto counting member names inside comments as usage — the scan ignores comments and prints where each kept member matched, e.g. render (lib/preview.dart:12) (#175 reported by @DarkWingMcQuack)
  • Fixed source builds failing with "rustup: command not found" on Rust installs not managed by rustup — the build asks rustc which targets are installed and uses rustup only as the fallback (#176 reported by @DarkWingMcQuack)
Commits since v2.2.0 (9)
  • 2e710e6 stamp: asset hashes for v3.0.0
  • 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)

2.2.0 #

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 (4.4 MB on every install) → register one: await pdf.registerFallbackFont(PdfFallbackFontKind.cjk, fontBytes) (.emoji for emoji); without one the value is still saved, only the baked-in look falls back to the field's 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: trim: auto under hooks: user_defines: pdf_manipulator:, or trim: {keep: [render, signatures]}; on web also run flutter pub run pdf_manipulator:setup --trim; needs Rust, compiled once and cached (#167)
  • Added Pdf.registerFallbackFont(PdfFallbackFontKind, Uint8List)
  • Changed the default binary — dead engine surfaces, 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 (8)
  • c2d8163 stamp: asset hashes for v2.2.0
  • 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)

2.1.4 #

  • Engine updated — web: re-run flutter pub run pdf_manipulator:setup --force web (native updates itself)
  • Fixed flattenForms dropping a field's value when fill and flatten happen in separate editor sessions — the appearance is regenerated from the persisted /V (#161 reported by @DarkWingMcQuack)
  • Fixed addImageStamp erasing a page's form widgets when /Annots is an indirect reference (#161 reported by @DarkWingMcQuack)
  • Fixed a reopened filled form rendering blank where its value should appear — the renderer regenerates a widget's appearance from /V under /NeedAppearances, matching the flattener
Commits since v2.1.3 (8)
  • b7fdb35 stamp: asset hashes for v2.1.4
  • 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)

2.1.3 #

  • 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 raw UTF-8 (LibreOffice-class producers) — one spec-tolerant text-string decoder covers UTF-16, UTF-8 and PDFDocEncoding (#155)
  • Fixed flattenForms baking mojibake for values outside ASCII (ß → ß) — values decode per ISO 32000-1 §7.9.2.2 and appearance text is written in WinAnsi (#155)
  • 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 decode names the same way (#155)
  • Fixed flattening CJK and emoji values drawing nothing — the bundled fallback font ships in native and web builds (#155)
  • Fixed document metadata (getTitle and friends) mangling non-ASCII on read, and writes now encode per spec (#155)
Commits since v2.1.2 (7)
  • 6aa4e45 stamp: asset hashes for v2.1.3
  • 99c6e61 release: v2.1.3
  • cce6645 chore: promote dev to prod (2.1.3) (#158)
  • efa47f2 Merge branch 'prod' into dev
  • 9ed0c7c docs: 2.1.3 — form text-string encoding fixes (#157)
  • 10dee1f chore: bump Flutter SDK (#154)
  • fb5ee1f fix: form fill/flatten non-ASCII text handling (ß, umlauts, CJK) (#156)

2.1.2 #

  • Engine updated — web: re-run flutter pub run pdf_manipulator:setup --force web (native updates itself)
  • Fixed a Flutter Web WASM (dart2wasm) compile failure — a switch over Object? that dart2js accepted was non-exhaustive under dart2wasm (#145 reported by @DarkWingMcQuack)
  • Fixed pub.dev not advertising Flutter Web support — the web runtime resolves to a stub default that pana can analyze
Commits since v2.1.1 (31)
  • 99d9159 stamp: asset hashes for v2.1.2
  • 398d566 release: v2.1.2
  • 9b21629 chore: promote dev to prod (2.1.2) (#153)
  • 4f61ed1 Merge branch 'prod' into dev
  • ec338d8 ci: bump whuppi/ci to v2.0.4 (#151)
  • 8ae80af ci: bump whuppi/ci to v2.0.3 (#150)
  • 6c267f8 ci: bump whuppi/ci to v2.0.2 (#149)
  • 711055d ci: bump whuppi/ci to v2.0.1 (#148)
  • f8fdf61 docs: 2.1.2 — dart2wasm web fix + web platform on pub.dev (#147)
  • 7c0e15a fix: dart2wasm web build; adopt whuppi/ci v2.0.0 dual-compiler gate (#146)
  • 6fc0ec3 chore: adopt whuppi/ci v1.0.8 (#144)
  • f724639 build: adopt the shared platforms gate + shell lint (#142)
  • f237ade ci: align dependabot/labels/upgrade-body with the workspace shape (#141)
  • 6fe4598 chore: bump pinned versions (#139)
  • f05ed54 build: shared strict analyze gate + whuppi/ci pin bump to v1.0.6 (#140)
  • a98a69f docs: fix stale branch-protection recipe (#138)
  • aa20ef0 ci: bump whuppi/ci shared refs to v1.0.4 (#137)
  • 1614841 ci: migrate onto the shared whuppi/ci@v1.0.1 (#136)
  • 79dc1f8 chore: bump pinned versions (#134)
  • ffb3048 fix: show web platform support on pub.dev (stub-default seam) + pana platform gate (#133)
  • ed305ea chore: bump pinned versions (#130)
  • a82d751 chore: refresh lockfiles (#131)
  • 1ccf266 fix(ci): resolve fvm on windows via native fvm.exe, not a .bat shim (#132)
  • 657804e chore: promote dev to prod (#129)
  • 9af712c Merge branch 'prod' into dev
  • af178e9 fix(ci): refresh the example lockfile with flutter, not dart (#128)
  • 9a8f5d0 chore: bump pinned versions (#127)
  • 21368ff chore: refresh lockfiles (#125)
  • cce4135 ci: verify the dependency floor compiles (analyze on oldest deps) (#126)
  • 464f06c chore: bump pinned versions (#124)
  • 0a58c7b ci: gate .gitmodules to the owner (#123)

2.1.1 #

  • Fixed the README banner not rendering on pub.dev — the <picture> element is flattened to a plain image in the published package
Commits since v2.1.0 (14)
  • 655a804 stamp: asset hashes for v2.1.1
  • ae38450 release: v2.1.1
  • 7295a0e chore: promote dev to prod (2.1.1) (#122)
  • e9c3bd5 Merge branch 'prod' into dev
  • 3ac56cb ci: unblock the release pipeline + supply-chain & workflow hardening (#121)
  • 8c63ea2 chore: promote dev to prod (2.1.1) (#119)
  • cd4f499 Merge branch 'prod' into dev
  • c9ef5d0 fix(ci): re-supply git push auth in release.sh (#120)
  • 2724150 docs: add 2.1.1 changelog entry for the README fix (#118)
  • 16d2241 ci: declare repo labels as code with a sync workflow (#117)
  • dc1037d ci: harden CI to zizmor-auditor zero with a supply-chain SSOT (#113)
  • 441ec72 ci: bump actions/stale from 9 to 10 in the actions group (#114)
  • 2dde3f0 ci: auto-close resolved issues with an opt-out guard (#112)
  • 3dbae4e ci: flatten README banner for the pub.dev tarball (#111)

2.1.0 #

  • 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 ships as a grayscale /SMask (#103 reported by @DarkWingMcQuack)
  • Fixed the RenderedPage.data doc — render() returns PNG-encoded bytes (decode to read pixels), not raw RGBA
Commits since v2.0.1 (11)
  • 5f06717 stamp: asset hashes for v2.1.0
  • cefb51e release: v2.1.0
  • f8c7bf1 chore: promote dev to prod (#109)
  • 4bb7149 ci: add changelog version check (#110)
  • 779495f Merge branch 'prod' into dev
  • 2b5c35e feat: add producer and creation-date document metadata (#108)
  • cc837da docs: changelog 2.0.2 — addImageStamp PNG transparency fix (#107)
  • 5392e95 ci: bump actions/checkout from 6 to 7 in the actions group across 1 directory (#106)
  • eb15b4d fix: addImageStamp preserves PNG transparency (no black box) (#104)
  • 271c1d5 ci: vendored-engine cargo tests + consistent job names (#105)
  • 0d623bf ci: bump actions/labeler from 5 to 6 in the actions group (#102)

2.0.1 #

Docs-only — no code or API changes.

  • README and every guide (architecture, capabilities, migration, updating, contributing) rewritten, restructured, and verified against the source
Commits since v2.0.0 (6)
  • 9afea02 stamp: asset hashes for v2.0.1
  • a393f2b release: v2.0.1
  • 15ea53a chore: promote dev to prod (2.0.1) (#101)
  • 8a41292 Merge branch 'prod' into dev
  • 9786314 feat: pdf_manipulator/io.dart + README & docs polish (#100)
  • c59fd4a chore: bump Flutter 3.44.1 → 3.44.2 (#98)

2.0.0 #

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)
Commits since v1.0.6 (9)
  • ad1cb65 stamp: asset hashes for v2.0.0
  • e8134c3 release: v2.0.0
  • 60e4200 chore: promote dev to prod (1.0.7) (#92)
  • b3d1823 feat: lane runtime rewrite + test, docs & CI overhaul (#97)
  • e202281 fix: release gate tag-check fallback for workflow_dispatch (#93)
  • d031a96 Merge branch 'prod' into dev
  • fb93efa feat: 16 KB Android page-size alignment (vendor/pdf_oxide update) (#91)
  • 78dfd87 fix(ci): WASM release assets + binary verification gate (#89)
  • 0091e99 fix(ci): WASM artifacts missing from releases + binary verification

1.0.6 #

  • Fixed release build routing for consumer builds (by @Binary-Parse)
  • Fixed Windows NDK linker .cmd extension for Android cross-compilation (by @Binary-Parse)
  • Added CI verify tests — release builds now verified on all 6 targets (Android, iOS, macOS, Linux, Windows, Web)
Commits since v1.0.5 (9)
  • f53de02 stamp: asset hashes for v1.0.6
  • 9ea4073 release: v1.0.6
  • c8ff236 chore: promote dev to prod (#88)
  • cc4f9b8 Merge branch 'prod' into dev
  • 0679c51 chore: add 1.0.6 changelog entries (#86)
  • ce9d7ec fix(ci): release gate only triggers on new changelog versions (#85)
  • 5083450 refactor(ci): capability-based architecture + verify release builds (#82)
  • 0132518 fix(hook): append .cmd to the NDK clang linker on Windows hosts (Android cross-compile fails) (#81)
  • 453b39e fix(hook): add link.dart passthrough, build.json, release-build tests (#80)

1.0.5 #

  • Fixed README version not stamped on pub.dev
  • Updated tracking links for web build hook support
Commits since v1.0.4 (4)
  • 8d3e363 stamp: asset hashes for v1.0.5
  • 86ade5b release: v1.0.5
  • 1288d12 chore: promote dev to prod (#79)
  • 694c96e chore: 1.0.5 release — fix README stamp + tracking links (#78)

1.0.4 #

  • 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
Commits since v1.0.3 (6)
  • 902cf4f stamp: asset hashes for v1.0.4
  • d1266fb release: v1.0.4
  • 5cd981f chore: promote dev to prod (#77)
  • cdabb02 Merge branch 'prod' into dev
  • 8dbad3b chore: add 1.0.4 changelog entries (#76)
  • d912aa1 feat: unified asset resolver — same waterfall for native and web (#75)

1.0.3 #

  • Fixed changelog on pub.dev
Commits since v1.0.2 (10)
  • 6bbaaa8 stamp: asset hashes for v1.0.3
  • 1339dc4 release: v1.0.3
  • 9b228dc chore: promote dev to prod (#73)
  • 223c1a4 Merge branch 'prod' into dev
  • 3e0ebd8 chore: add 1.0.3 changelog entries (#72)
  • 6a33c47 chore: promote dev to prod (#71)
  • 77c8738 feat(ci): preview filtered changelog in CI logs before publish approval (#70)
  • c7ffae8 docs: move slopfairy manual comments to workspace rule
  • d4471ac docs: add slopfairy manual comments + changelog preview recipes
  • ab0a74e fix(ci): same-file read-write race in stamp-changelog + bash 3.2 compat

1.0.2 #

  • Fixed changelog on pub.dev missing commit history between versions
Commits since v1.0.1 (10)
  • e420ba0 stamp: asset hashes for v1.0.2
  • 1154d43 release: v1.0.2
  • 0b610c0 fix(ci): edit asset_hashes.dart between markers instead of overwriting
  • 91bd9ad fix(ci): add doc comment to generated asset_hashes.dart constant
  • bd78225 fix(ci): version-scoped staging branch + updated UPDATING.md
  • eb2e822 fix(ci): delete stale _release-staging before push to avoid lock conflicts
  • 6990128 fix(ci): fall back to HEAD when tag doesn't exist yet in commits_collapsible
  • 0ddc9ce fix(ci): correct repo fallback to whuppi/pdf_manipulator
  • 83b44cb feat(ci): rewrite release pipeline — single release.sh, changelog builder, idempotent (#68)
  • 392aaa8 fix(ci): version-level release concurrency + branch-file gate (#67)

1.0.1 #

  • 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)
Commits since v1.0.0 (48)
  • 4ed5b3b release: v1.0.1
  • 722b2dd chore: add 1.0.1 changelog entry (#65)
  • d04b556 chore: add 1.0.1-dev.0 prerelease changelog entry (#64)
  • 52b6d52 ci: bump the actions group across 1 directory with 5 updates (#57)
  • 9c798ee fix(ci): notify maintainer to recreate dependabot PRs on new pushes
  • 4ade698 docs: explain Windows DLL lock in dispose test (#60)
  • e8dee7b fix: analyzer clean + web CI + native dispose safety
  • ea9c961 ci: write bore port to artifact for API access
  • 88197b4 ci: split setup/keepalive steps so SSH port shows immediately
  • 07749ec ci: fix bore version (0.6.0), serveo was dead
  • 4b4d6e5 ci: raw sshd + serveo.net tunnel (no binary downloads)
  • 4a4bd3a ci: raw sshd + bore tunnel, no tmate, 5hr timeout
  • 015b951 ci: update debug-ssh workflow
  • 5b71adf ci: add debug-ssh workflow for interactive CI debugging
  • 5874c1a chore: bump Flutter 3.44.0 → 3.44.1 (#50)
  • a26b3c2 chore: add Dependabot for GitHub Actions updates (#56)
  • 684b840 docs: fix rendering + add fvmrc pinning section (#54)
  • c06e2d9 fix: flutter-upgrade PRs created as draft (#53)
  • 9d18776 fix: slopfairy PR#51 suggestions — printf credentials + remove redundant gitignore (#52)
  • a548f42 feat: secrets.sh + per-env pub.dev credentials (#51)
  • 8ac73ea fix: add vendor false_secrets at stamp-tag time (#49)
  • 53c52aa fix: force-add Cargo.lock in stamp-tag (gitignored in vendor) (#48)
  • cbae62b fix: auto-detect wasm-bindgen-cli version from Cargo.lock (#47)
  • 3e4e5f6 fix: force-push temp branch + stale comment refs (#46)
  • 81a789f fix: push stamped commit before creating release tag (#45)
  • 90617d2 fix: mode guard was rejecting --github-notes (#44)
  • a07b935 fix: install snippets on release, generic version, cancel-in-progress (#43)
  • 8b4387f feat: unified release pipeline with approval gate (#42)
  • 7b1fac9 fix: move asset_hashes.dart to lib/src/hook/ (#41)
  • 7637a29 fix: false_secrets for test PEM keys + pin example .fvmrc (#40)
  • b16ccc4 fix: single stamp_release.sh for all pre-publish stamping (#39)
  • 51c845b fix: API-based asset hashes, MSVC-first Windows, git identity (#38)
  • 6d44016 fix: publish fails on dirty git + create-release YAML syntax (#36)
  • 5909946 fix: YAML syntax error in create-release.yml (#35)
  • ab2e79f fix: auto-generate commit lists + asset hashes at publish time (#34)
  • 6adbed3 docs: add rebuild-release recovery flow to UPDATING.md (#33)
  • 193c460 fix: compile per-platform — CI builds only the targets it installed (#32)
  • f874171 fix: add validation gate to publish.yml (#31)
  • 8da554d fix: quote YAML expression in publish.yml (#30)
  • 7fc4ae6 fix: publish.yml errors on branch push — replace all bare inputs.tag (#29)
  • d5630a0 docs: fix UPDATING.md release section — correct workflow names, document auto-trigger chain
  • 2d6d65c fix: publish.yml fails on branch push due to inputs.tag in concurrency
  • 26ce093 feat!: cross-platform Rust engine, streaming I/O, web WASM (#28)
  • 7456369 chore: rename main → prod (workflows, docs, ruleset) (#26)
  • 8dcc13f ci: commit-msg hook (merge blocker + printf), promotion-check, hooksPath docs (#23)
  • 074868f ci: fix release-please config and PR formatting (#21)
  • 945a51f ci: add release-please + tag-triggered release pipeline (#19)
  • e5e698e ci: enforce conventional commits via hook + PR title check (#17)

1.0.0 #

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

0.5.9 #

  • The last release of Android-only version before the cross-platform rewrite
Commits since initial (301)
  • cd83915 stamp: asset hashes for v5.0.1
  • 3b9d837 release: v5.0.1
  • dfa7c6b release: promote dev → prod (v5.0.1) (#259)
  • f08b245 Merge branch 'prod' into dev
  • 51a259f fix: every keep-set compiles, and web opens R2-R4 encrypted PDFs (#256, #257) (#258)
  • 7896412 chore: bump Flutter SDK (#254)
  • f2a90a9 chore: refresh lockfiles (#253)
  • 13d080c chore: bump pinned versions (#252)
  • 5f34453 chore: bump the deps group with 2 updates (#255)
  • 6cbe43b chore: refresh lockfiles (#251)
  • 02ae148 release: promote dev → prod (v5.0.0) (#250)
  • d39c358 Merge branch 'prod' into dev
  • 83d218f feat!: 5.0.0 — image reducer, image edits, and every PLANNED capability row (#249)
  • b72a04d fix: DOCX tables convert at their declared widths (#243); vendors synced; web worker budget frees a slot on confirmed death (#248)
  • e16164f chore: bump pinned versions (#245)
  • afd708e chore: refresh lockfiles (#246)
  • bd388a8 chore: bump Flutter SDK (#247)
  • 30cd3f0 chore: bump code_assets from 1.2.1 to 2.0.0 in the deps group (#244)
  • 2bc950c release: promote dev → prod (v4.2.0) (#242)
  • 357d6e4 Merge branch 'prod' into dev
  • 750cc12 fix: checked checkboxes and selected radios flatten as set (#215) (#218)
  • 97a47b1 ci: whuppi/ci v2.7.3 (#241)
  • 6649f0c ci: pkg: Web rows keep their host hook tree on ghcr under their own family (#240)
  • cd33e85 ci: int: Android rows keep their hook trees on ghcr under their own family (#239)
  • b4c655c ci: verify: Android and verify: macOS keep their hook trees on ghcr under their own families (#238)
  • 5a89cd4 ci: whuppi/ci v2.7.2 (#237)
  • 6e033aa ci: compile rows keep their release trees on ghcr under their own family (#236)
  • 20b978a ci: whuppi/ci 2.7.0 → 2.7.1 (SDK cache key carries the runner image version) (#235)
  • 3afd1b6 ci: cache diagnostics — restored-artifacts summary; probe dispatch input (#234)
  • 4725c8d ci: whuppi/ci 2.6.3 → 2.7.0; Android SDK components from ghcr on the emulator rows (#233)
  • 070689a ci: the Rust test family keeps its whole target trees on ghcr.io (#232)
  • 2038a2c ci: engine-artifacts archive carries the crates' fingerprints and build dirs (#231)
  • 013ebdf ci: whuppi/ci 2.6.1 → 2.6.3 (ghcr restore resilience, Windows symlinks, emulator version) (#230)
  • 2745f3f ci: whuppi/ci 2.6.0 → 2.6.1 (SDK cache keyed on the .fvmrc version; emulator version parse) (#229)
  • fe18919 ci: keep the big caches on ghcr.io via whuppi/ci 2.6.0 oci-cache (#228)
  • c6d178e ci: compile rows share the deps archive and own only their engine-artifacts archive (#227)
  • 28f2d02 ci: warm the caches from dev; PR runs read only; delete a PR's caches on close (#226)
  • a7bb13f ci: run the engine test suites through cargo-nextest and link with mold (#225)
  • 6d2c92d ci: cache cargo's target dir with rust-cache; one target dir for every build path; cold guard (#224)
  • d17f23c chore: refresh lockfiles (#222)
  • 048a591 ci: bump all action refs (workflows + composites) (#213)
  • e992002 chore: reformat under the Flutter 3.47.2 formatter (#221)
  • 7d27b2a chore: bump pinned versions (#211)
  • f6b303b chore: bump Flutter SDK (#214)
  • dee1675 ci: bump whuppi/ci refs to v2.4.1 (#220)
  • 812f1a4 docs: point S8 at where release.sh actually lives (#219)
  • 76adf8e test: mark hook_app_root_test dart:io-exempt (#217)
  • 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)
  • 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)
  • 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)
  • 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)
  • 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)
  • cce6645 chore: promote dev to prod (2.1.3) (#158)
  • efa47f2 Merge branch 'prod' into dev
  • 9ed0c7c docs: 2.1.3 — form text-string encoding fixes (#157)
  • 10dee1f chore: bump Flutter SDK (#154)
  • fb5ee1f fix: form fill/flatten non-ASCII text handling (ß, umlauts, CJK) (#156)
  • 9b21629 chore: promote dev to prod (2.1.2) (#153)
  • 4f61ed1 Merge branch 'prod' into dev
  • ec338d8 ci: bump whuppi/ci to v2.0.4 (#151)
  • 8ae80af ci: bump whuppi/ci to v2.0.3 (#150)
  • 6c267f8 ci: bump whuppi/ci to v2.0.2 (#149)
  • 711055d ci: bump whuppi/ci to v2.0.1 (#148)
  • f8fdf61 docs: 2.1.2 — dart2wasm web fix + web platform on pub.dev (#147)
  • 7c0e15a fix: dart2wasm web build; adopt whuppi/ci v2.0.0 dual-compiler gate (#146)
  • 6fc0ec3 chore: adopt whuppi/ci v1.0.8 (#144)
  • f724639 build: adopt the shared platforms gate + shell lint (#142)
  • f237ade ci: align dependabot/labels/upgrade-body with the workspace shape (#141)
  • 6fe4598 chore: bump pinned versions (#139)
  • f05ed54 build: shared strict analyze gate + whuppi/ci pin bump to v1.0.6 (#140)
  • a98a69f docs: fix stale branch-protection recipe (#138)
  • aa20ef0 ci: bump whuppi/ci shared refs to v1.0.4 (#137)
  • 1614841 ci: migrate onto the shared whuppi/ci@v1.0.1 (#136)
  • 79dc1f8 chore: bump pinned versions (#134)
  • ffb3048 fix: show web platform support on pub.dev (stub-default seam) + pana platform gate (#133)
  • ed305ea chore: bump pinned versions (#130)
  • a82d751 chore: refresh lockfiles (#131)
  • 1ccf266 fix(ci): resolve fvm on windows via native fvm.exe, not a .bat shim (#132)
  • 657804e chore: promote dev to prod (#129)
  • 9af712c Merge branch 'prod' into dev
  • af178e9 fix(ci): refresh the example lockfile with flutter, not dart (#128)
  • 9a8f5d0 chore: bump pinned versions (#127)
  • 21368ff chore: refresh lockfiles (#125)
  • cce4135 ci: verify the dependency floor compiles (analyze on oldest deps) (#126)
  • 464f06c chore: bump pinned versions (#124)
  • 0a58c7b ci: gate .gitmodules to the owner (#123)
  • 7295a0e chore: promote dev to prod (2.1.1) (#122)
  • e9c3bd5 Merge branch 'prod' into dev
  • 3ac56cb ci: unblock the release pipeline + supply-chain & workflow hardening (#121)
  • 8c63ea2 chore: promote dev to prod (2.1.1) (#119)
  • cd4f499 Merge branch 'prod' into dev
  • c9ef5d0 fix(ci): re-supply git push auth in release.sh (#120)
  • 2724150 docs: add 2.1.1 changelog entry for the README fix (#118)
  • 16d2241 ci: declare repo labels as code with a sync workflow (#117)
  • dc1037d ci: harden CI to zizmor-auditor zero with a supply-chain SSOT (#113)
  • 441ec72 ci: bump actions/stale from 9 to 10 in the actions group (#114)
  • 2dde3f0 ci: auto-close resolved issues with an opt-out guard (#112)
  • 3dbae4e ci: flatten README banner for the pub.dev tarball (#111)
  • f8c7bf1 chore: promote dev to prod (#109)
  • 4bb7149 ci: add changelog version check (#110)
  • 779495f Merge branch 'prod' into dev
  • 2b5c35e feat: add producer and creation-date document metadata (#108)
  • cc837da docs: changelog 2.0.2 — addImageStamp PNG transparency fix (#107)
  • 5392e95 ci: bump actions/checkout from 6 to 7 in the actions group across 1 directory (#106)
  • eb15b4d fix: addImageStamp preserves PNG transparency (no black box) (#104)
  • 271c1d5 ci: vendored-engine cargo tests + consistent job names (#105)
  • 0d623bf ci: bump actions/labeler from 5 to 6 in the actions group (#102)
  • 15ea53a chore: promote dev to prod (2.0.1) (#101)
  • 8a41292 Merge branch 'prod' into dev
  • 9786314 feat: pdf_manipulator/io.dart + README & docs polish (#100)
  • c59fd4a chore: bump Flutter 3.44.1 → 3.44.2 (#98)
  • 60e4200 chore: promote dev to prod (1.0.7) (#92)
  • b3d1823 feat: lane runtime rewrite + test, docs & CI overhaul (#97)
  • e202281 fix: release gate tag-check fallback for workflow_dispatch (#93)
  • d031a96 Merge branch 'prod' into dev
  • fb93efa feat: 16 KB Android page-size alignment (vendor/pdf_oxide update) (#91)
  • 78dfd87 fix(ci): WASM release assets + binary verification gate (#89)
  • 0091e99 fix(ci): WASM artifacts missing from releases + binary verification
  • c8ff236 chore: promote dev to prod (#88)
  • cc4f9b8 Merge branch 'prod' into dev
  • 0679c51 chore: add 1.0.6 changelog entries (#86)
  • ce9d7ec fix(ci): release gate only triggers on new changelog versions (#85)
  • 5083450 refactor(ci): capability-based architecture + verify release builds (#82)
  • 0132518 fix(hook): append .cmd to the NDK clang linker on Windows hosts (Android cross-compile fails) (#81)
  • 453b39e fix(hook): add link.dart passthrough, build.json, release-build tests (#80)
  • 1288d12 chore: promote dev to prod (#79)
  • 694c96e chore: 1.0.5 release — fix README stamp + tracking links (#78)
  • 5cd981f chore: promote dev to prod (#77)
  • cdabb02 Merge branch 'prod' into dev
  • 8dbad3b chore: add 1.0.4 changelog entries (#76)
  • d912aa1 feat: unified asset resolver — same waterfall for native and web (#75)
  • 9b228dc chore: promote dev to prod (#73)
  • 223c1a4 Merge branch 'prod' into dev
  • 3e0ebd8 chore: add 1.0.3 changelog entries (#72)
  • 6a33c47 chore: promote dev to prod (#71)
  • 77c8738 feat(ci): preview filtered changelog in CI logs before publish approval (#70)
  • c7ffae8 docs: move slopfairy manual comments to workspace rule
  • d4471ac docs: add slopfairy manual comments + changelog preview recipes
  • ab0a74e fix(ci): same-file read-write race in stamp-changelog + bash 3.2 compat
  • 0b610c0 fix(ci): edit asset_hashes.dart between markers instead of overwriting
  • 91bd9ad fix(ci): add doc comment to generated asset_hashes.dart constant
  • bd78225 fix(ci): version-scoped staging branch + updated UPDATING.md
  • eb2e822 fix(ci): delete stale _release-staging before push to avoid lock conflicts
  • 6990128 fix(ci): fall back to HEAD when tag doesn't exist yet in commits_collapsible
  • 0ddc9ce fix(ci): correct repo fallback to whuppi/pdf_manipulator
  • 83b44cb feat(ci): rewrite release pipeline — single release.sh, changelog builder, idempotent (#68)
  • 392aaa8 fix(ci): version-level release concurrency + branch-file gate (#67)
  • 722b2dd chore: add 1.0.1 changelog entry (#65)
  • d04b556 chore: add 1.0.1-dev.0 prerelease changelog entry (#64)
  • 52b6d52 ci: bump the actions group across 1 directory with 5 updates (#57)
  • 9c798ee fix(ci): notify maintainer to recreate dependabot PRs on new pushes
  • 4ade698 docs: explain Windows DLL lock in dispose test (#60)
  • e8dee7b fix: analyzer clean + web CI + native dispose safety
  • ea9c961 ci: write bore port to artifact for API access
  • 88197b4 ci: split setup/keepalive steps so SSH port shows immediately
  • 07749ec ci: fix bore version (0.6.0), serveo was dead
  • 4b4d6e5 ci: raw sshd + serveo.net tunnel (no binary downloads)
  • 4a4bd3a ci: raw sshd + bore tunnel, no tmate, 5hr timeout
  • 015b951 ci: update debug-ssh workflow
  • 5b71adf ci: add debug-ssh workflow for interactive CI debugging
  • 5874c1a chore: bump Flutter 3.44.0 → 3.44.1 (#50)
  • a26b3c2 chore: add Dependabot for GitHub Actions updates (#56)
  • 684b840 docs: fix rendering + add fvmrc pinning section (#54)
  • c06e2d9 fix: flutter-upgrade PRs created as draft (#53)
  • 9d18776 fix: slopfairy PR#51 suggestions — printf credentials + remove redundant gitignore (#52)
  • a548f42 feat: secrets.sh + per-env pub.dev credentials (#51)
  • 8ac73ea fix: add vendor false_secrets at stamp-tag time (#49)
  • 53c52aa fix: force-add Cargo.lock in stamp-tag (gitignored in vendor) (#48)
  • cbae62b fix: auto-detect wasm-bindgen-cli version from Cargo.lock (#47)
  • 3e4e5f6 fix: force-push temp branch + stale comment refs (#46)
  • 81a789f fix: push stamped commit before creating release tag (#45)
  • 90617d2 fix: mode guard was rejecting --github-notes (#44)
  • a07b935 fix: install snippets on release, generic version, cancel-in-progress (#43)
  • 8b4387f feat: unified release pipeline with approval gate (#42)
  • 7b1fac9 fix: move asset_hashes.dart to lib/src/hook/ (#41)
  • 7637a29 fix: false_secrets for test PEM keys + pin example .fvmrc (#40)
  • b16ccc4 fix: single stamp_release.sh for all pre-publish stamping (#39)
  • 51c845b fix: API-based asset hashes, MSVC-first Windows, git identity (#38)
  • 6d44016 fix: publish fails on dirty git + create-release YAML syntax (#36)
  • 5909946 fix: YAML syntax error in create-release.yml (#35)
  • ab2e79f fix: auto-generate commit lists + asset hashes at publish time (#34)
  • 6adbed3 docs: add rebuild-release recovery flow to UPDATING.md (#33)
  • 193c460 fix: compile per-platform — CI builds only the targets it installed (#32)
  • f874171 fix: add validation gate to publish.yml (#31)
  • 8da554d fix: quote YAML expression in publish.yml (#30)
  • 7fc4ae6 fix: publish.yml errors on branch push — replace all bare inputs.tag (#29)
  • d5630a0 docs: fix UPDATING.md release section — correct workflow names, document auto-trigger chain
  • 2d6d65c fix: publish.yml fails on branch push due to inputs.tag in concurrency
  • 26ce093 feat!: cross-platform Rust engine, streaming I/O, web WASM (#28)
  • 7456369 chore: rename main → prod (workflows, docs, ruleset) (#26)
  • 8dcc13f ci: commit-msg hook (merge blocker + printf), promotion-check, hooksPath docs (#23)
  • 074868f ci: fix release-please config and PR formatting (#21)
  • 945a51f ci: add release-please + tag-triggered release pipeline (#19)
  • e5e698e ci: enforce conventional commits via hook + PR title check (#17)
  • 67edc60 add pre-commit hook: reject commits with gitignored files
  • da16d8a untrack example/pubspec.lock (gitignored, should never have been tracked)
  • 9a3dc68 fix: .pubignore for vendor/ + compile WASM before web tests
  • 02e92a5 fix(ci): checkout in workflows before local composite actions
  • 55d9e58 ci: 10 composite actions, zero duplication, test-first flow
  • e6bf54b release: manual re-trigger + overwrite existing releases
  • 9328919 ci: split WASM into its own compile job
  • dfcd65f fix: WASM target + Rust warnings in release CI
  • 2dbb00e hook: rewrite using native_toolchain_rust patterns
  • 28daa58 hook: use StaticLinking for iOS + install both device and sim targets
  • c8f4bfe hook: set NDK linker for Android cargo cross-compilation
  • 4e72a4a ci: add x86_64-linux-android rust target for Android emulator tests
  • c9c26ab ci: fix android emulator-runner cd not persisting between commands
  • eef11c8 ci: commit .metadata, remove destructive flutter create
  • f144ba5 ci: fix Android + iOS integration test failures
  • 6b9e7d7 updating.md: add submodule commit discipline (3-step sequence)
  • bf50a39 submodule: update to include all Rust patches
  • 8fcec5f ci: fix pub get failure — skip example deps in Dart-only jobs
  • a62a36b roadmap: add upstream v0.3.48 office conversion features
  • 621f091 fix upstream URL + expand S1 bump recipe
  • 8e67064 provenance: link to fork repo + branch, document fork convention
  • b93b9ec v1.0.0 API redesign + web feature parity + doc cleanup
  • e7e0338 editor: add missing addStamp + addWatermarkPositioned wrappers
  • 4ba4264 fix migration guide + expand contributing
  • 0374c59 readme: feature×platform matrix, docs table, community files
  • c0e712c bump to 1.0.0, fix stale README references
  • 581e844 v1.0.0 — complete ground-up rewrite
  • a99fbdb Make plugin compatible with Gradle 8+ while keeping support for older versions
  • 4a0102b Update issue templates
  • 257bc10 Update issue templates
  • 9dc0251 * Fixed error "Build file '\pdf_manipulator\android\build.gradle' should not contain a package statement".
  • 8d17db2 * Attempts to fix "x + width must be <= bitmap.width()" exception on some devices in some case of PDF compressing. * Updated documentation regarding PlatformException in Release build: AbstractITextEvent is only for internal usage #2.
  • 8e7c094 Update README.md
  • 51a54b6 Update README.md
  • 939c73f Update README.md
  • bbf346f Update README.md
  • ad48def Update README.md
  • 51eac08 * Updated pub version.
  • 5531a95 * Updated dependency.
  • 4a787c1 * Pub version update.
  • 2a40976 Merge remote-tracking branch 'origin/master'
  • bd9155e * Added new description.
  • 30ab01b Update README.md
  • 2603470 * Updated documentation. * Improved example app.
  • bf5ca20 Merge branch 'master' of https://github.com/chaudharydeepanshu/pdf_manipulator
  • 083f86c Update README.md
  • aab073a Merge branch 'master' of https://github.com/chaudharydeepanshu/pdf_manipulator
  • c8b771e Create LICENSE
  • 76e31b2 Update README.md
  • 64d4388 * Fixes crash on pdfCompressor with unEmbedFonts set true for some pdfs.
  • bcf78e3 * Removed unnecessary catch blocks.
  • dc681b6 * Now pdfDecryption finishes with error on BadPasswordException and PdfException.
  • 22e58a9 * Fixed imagesToPdfs method not working for absolute file paths of files with names containing :.
  • 0d0a83f * Fixed imagesToPdfs method not working for android absolute file paths.
  • a31774e * Fixed imagesToPdfs method not working for android uris. * Fixed imagesToPdfs adding unnecessary padding to pdfs when createSinglePdf is set to false or default. * Updated example and example dependency.
  • 1dea7a8 * Added imagesToPdfs method for converting images to single pdf or multiple pdfs.
  • c21c1f1 * Added pdfEncryption method for pdf encryption. * Added pdfDecryption method for pdf decryption. * Added pdfValidityAndProtection method for getting pdf validity and protection info.
  • c28db0a * Fixed pdfPagesSize method OOM issue also removed redundant properties.
  • 81ae92c * Added positionType in pdfWatermark method which provides various predefined and allows providing custom watermark positions.* AddedpdfPagesSizemethod for getting size info of pages of pdf. * AddedcustomPositionXCoordinatesList, customPositionYCoordinatesListinpdfWatermark` method for more fine controlling of watermark position.
  • 18a5dc9 * Added pdfWatermark method for watermarking pdf.
  • 6886f97 * Added unEmbedFonts for pdfCompressor.
  • c192813 * Added pdfCompressor method for compressing pdf.
  • 48df0f6 * pdfUri is replaced with pdfPath as now pdfPath is capable of taking care both URI path and absolute file path. * pdfsUris is replaced with pdfsPaths as now pdfsPaths is capable of taking care both URI paths and absolute file paths. * Fixed issue of not being able to use absolute file paths. * Flushing pdfWriters when splitting documents for trying to fix OOfM error in some cases.
  • db77334 * Support for rotating, deleting and reordering pdf pages. * Fixes OOfM error in some cases. * Fixes few errors in splitting by byte size.
  • 439b37d new pub.dev version
  • dcd3568 typo fix
  • 42ea493 dependencies updated
  • b4143c9 Update README.md
  • cb740ed Update LICENSE
  • 1bb42a3 Update README.md
  • 87a7c36 added pdf page deleter functionality
  • 90aff66 added other split pdf functions
  • d903a62 Initial commit
77
likes
160
points
3.75k
downloads

Documentation

API reference

Publisher

verified publisherwhuppi.com

Weekly Downloads

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

Repository (GitHub)
View/report issues
Contributing

Topics

#pdf #ffi #wasm #document #encryption

License

MIT (license)

Dependencies

code_assets, crypto, ffi, hooks, logging, meta, package_config, path, record_use, web, yaml

More

Packages that depend on pdf_manipulator