NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #3920 most downloaded on pub.dev
Flutter PDF editor and viewer for Dart: native rendering, text selection, search, annotations, forms, signatures, page editing, and document comparison.
Last release 3 days ago
05 Oct 2026
Ships on a steady schedule
a new release about every 9 days
Nearly every release is documented
notes for 43 of 44 stable releases
Nothing withdrawn
no release was ever pulled
3 months old
44 releases · first in 2026
One column per month.
Add DartPDF 7.0.0 AppStream release notes
Add DartPDF 7.0.0 AppStream release notes
material_ui. The library's widgets now come from
package:material_ui (and package:cupertino_ui) instead of
package:flutter/material.dart, which Flutter is retiring. Their Theme,
ThemeData, MaterialLocalizations, ScaffoldMessenger, InputDecoration
and friends are different types from the legacy ones. Hosts on either
library keep working; see doc/MIGRATING-7.0.0.md.
MaterialApp keeps its look: a small bridge
carries the host theme's colour scheme, text and icon themes, platform
and density into the editor, and shows notices as SnackBars on the host's
ScaffoldMessenger. Legacy component themes and ThemeExtensions no
longer reach the editor; use PdfEditorThemeData or a material_ui Theme
around the editor instead. Build with
--dart-define=PDF_LEGACY_MATERIAL_BRIDGE=false to compile the bridge out
when no host uses the legacy library (kPdfLegacyMaterialBridge).PdfMaterialHost (installed by PdfViewer, PdfReader, PdfEditorView
and PdfComparisonView) now supplies material_ui's localizations,
Theme and surface whenever the host lacks them - a legacy
MaterialApp, a CupertinoApp or a WidgetsApp. It installs the
material_ui and cupertino_ui localizations for the ambient locale
whenever they are missing, which also fixes a crash under a material_ui
app that registered the generated delegate list with a locale material_ui
does not cover by default (Ukrainian, for one).PdfEditorLocalizations.delegates (the editor's delegate plus
material_ui's GlobalMaterialLocalizations.delegates) and
PdfEditorLocalizations.supportedLocales, the recommended list for an
app's localizationsDelegates. The generated
DartPdfEditorLocalizations.localizationsDelegates still lists the legacy
flutter_localizations delegates, which suit a legacy host only.PdfEditorThemeData.primary and PdfEditorThemeData.brightness:
set either and the stock chrome draws with a colour scheme seeded from
them, whatever theme the host has.PdfEditingPreferences.themeMode (use themePreference), the
ButtonStyleButton form of PdfDialogSubmit (use
PdfDialogSubmit.action), and pdfSearchInputBorder (use
pdfSearchFieldBorderRadius).PdfDropdown.decoration is a material_ui InputDecoration).find.byType(TextField) matches the legacy class);
use the pdf-* keys or import material_ui.flutter: '>=3.47.0', material_ui 1.4's floor);
the Dart language version stays 3.5.Describe 6.0.0 in Linux release metadata
Release DartPDF 6.0.0
Describe 6.0.0 in Linux release metadata
Co-authored-by: dart-pdf release automation probe actions@github.com
PdfDialogSubmit.child is now Widget, so an arbitrary host
control can be the submit action. Code reading Material button properties
from it must keep its own button reference or check/cast the widget type.
The original constructor, themeMode and pdfSearchInputBorder remain
available and deprecated; their removal is deferred to 7.0.0.PdfRenderWorker gains trimMemory(): subclasses inherit its no-op default;
hosts using implements PdfRenderWorker must implement the new method.
Workers now use platform-sized decode budgets and release reconstructible
caches on memory pressure and mobile backgrounding.PdfDropdown and PdfDropdownItem, the drop-down picker the
editor's own dialogs use: its options open through the
PdfEditorPresenter's menu, so it works under any host. Companion
packages (dart_pdf_printing's print preview) use it too.flutter: '>=3.44.0' (was >=3.24.0).
5.0.0 already needed 3.44, since the thumbnail strip's reorder uses
ReorderableListView.onReorderItem, which first shipped in Flutter 3.44, so
this strands nobody. A new floor-analyze CI job analyzes the package on
Flutter 3.44.0 to keep the floor honest.PdfThemePreference and PdfEditingPreferences.themePreference, the
saved theme choice as an editor-owned enum instead of Material's
ThemeMode. It is stored under the same key, so a choice saved by an older
build reads back. themeMode still works and is deprecated (removed in
7.0.0); map the new value to ThemeMode in the host.PdfDialogSubmit.action(onSubmit:, child:), which marks any widget as
a dialog's Enter action. The ButtonStyleButton-only default constructor is
deprecated (removed in 7.0.0). Enter now tells a focused command button
(which keeps Enter) from a focused value control such as segments, a
dropdown or a checkbox (Enter submits) by semantics role rather than by
Material widget type, so controls from any design system classify the same.pdfSearchFieldBorderRadius; pdfSearchInputBorder (a Material
OutlineInputBorder) is deprecated (removed in 7.0.0).PdfMeasurementScale, PdfInkSignature,
PdfSavedSignature, the trackpad signature capture types, PdfCustomStamp,
PdfStampDateFormat/PdfStampTimeFormat, the picker and prompt typedefs,
PdfSnapshot, PdfClipboardPdf, PdfSelectedContentImage,
PdfColorFormat, PdfDockablePanel, PdfPanelDock, PdfSidebarSide) out
of the files that hold their Material dialogs. They are exported exactly as
before; PdfEditingController and PdfPageView no longer import Material
through them, which a new CI check (tool/check_design_imports.dart) keeps
true. PdfDockablePanel.icon values are now plain IconData constants equal
to the Material icons they were.uses-material-design and
localization delegate registration.PdfEditorCommands, the stock toolbar's intents as one public object:
armTool/toggleTool (with the prerequisites - a measure tool asks for
the measuring scale, the signature tool for a signature), openGroup,
applyMarkup, applyColor, flatten/flattenFormFields (with an Undo
notice), hand/select/clear, and recentTools. PdfEditorView owns one
(or takes the host's through PdfEditorView.commands) and provides it to
everything beneath it; a standalone PdfEditingToolbar shares the commands
above it when they drive the same controller and otherwise owns its own.
Find them with PdfEditorCommands.of(context) / maybeOf, or place a
PdfEditorCommandsScope yourself. Swapping the controller restarts the
recent tools and keeps the open tool group, as the toolbar always did. Its
prompts and notices go through PdfEditorPresenter (below).PdfCommand (id, icon, label, tooltip, shortcut, enabled/selected
listenables, category, invoke) and PdfEditorCommands.catalog(context):
the editor's tools and markup kinds in dock order, and, under
PdfEditorView, its panels, view options, view modes and Save / Save as -
filtered by the view's features - for a command palette or menu.toolGroups (a List<PdfToolGroup>, default pdfToolGroups)
to PdfEditingToolbar and PdfEditorView: reorder or trim the dock, or add
groups of your own. PdfToolEntry.command(PdfCommand) puts a host action in
a group beside the stock tools. PdfToolGroup gains kind (which stock
group's behaviour it has, and which groups/features.toolGroups value
filters it; defaults to the stock group named by its id),
labelledTools and labelBuilder. A group the toolbar doesn't know no
longer throws.PdfEditorView (or a PdfEditorCommandsScope), a
viewer tool shortcut now arms through the commands, so M asks for the
measuring scale before arming a measure tool and H asks for a signature
when none is saved, exactly as the toolbar does. A bare PdfViewer arms
directly, as before.PdfEditorView the toolbar's open group and recent tools now live in
the view's commands, so they survive the toolbar remounting (a dock or
breakpoint change).PdfEditorPresenter, how the editor shows things: dialog, sheet,
menu (an anchor rectangle plus PdfMenuItem/PdfMenuDivider entries),
notice (message, kind, optional Undo), and the prompts text,
styledText, confirm, link, color (PdfColorResult.picked or
.sampleFromPage), font, formChoice, measurementScale,
measurementInput (calibration length, volume depth), pageRange,
splitRanges and signature, each with a small immutable request type.
Every method defaults to today's stock UI; extend the class (don't
implement it) and override the ones you want. PdfEditorView, PdfViewer
and PdfReader take presenter:, or put a PdfEditorScope (an
InheritedTheme) above them; PdfEditorPresenter.of(context) finds it.
Stock dialogs carry the scope into their routes, so the prompts they open
in turn - the stamp editor's colour picker and signature pad, the
annotation library's rename, colour processing's picker - ask the same
presenter. Every editor notice, popup menu, bottom sheet and dialog now
goes through it (tool/check_design_imports.dart's showMenu,
showModalBottomSheet and ScaffoldMessenger counters are at 0).PdfEditorView.textPrompt/styledTextPrompt and
PdfViewer.editingTextPrompt/editingStyledTextPrompt keep working and,
when set, take precedence over the presenter's text prompts for that
widget's subtree. That fixes the places that ignored them: the author-name
prompt, the annotation library's four rename/group prompts, and a saved
annotation's name from the annotation menu. The text-selection "Add link"
and the link tool now ask PdfEditorPresenter.link (there was no way to
replace that dialog). The six colour pickers that called
showPdfColorPicker directly ask PdfEditorPresenter.color.
PdfEditingToolbar.textPrompt/styledTextPrompt and the textPrompt
of showPdfAnnotationMenu/showPdfFormFieldMenu default to the new
pdfPresentTextPrompt/pdfPresentStyledTextPrompt, which ask the
presenter (stock UI unchanged).PdfFontChoice (sealed:
PdfStandardFontChoice, PdfBundledFontChoice, PdfPlatformFontChoice,
PdfDocumentFontChoice, PdfLoadFontChoice) and its catalogue rows,
PdfFontCatalogEntry. showPdfFontMenu still builds the catalogue and
applies the pick; only the picker in between is the presenter's.showPdfDialog keeps its signature and route (in-view, no native-window
promotion; Enter submits through PdfDialogSubmit). It no longer asserts
MaterialLocalizations, and its barrier label comes from the editor's own
localizations (new string dialogDismiss).showPdfRemoveSignatureDialog is now a stock confirm (unchanged look).PdfViewer, PdfReader,
PdfEditorView and PdfComparisonView work under a CupertinoApp or a
plain WidgetsApp as well as a MaterialApp. Each wraps its content in
the new PdfMaterialHost, which supplies what the stock (Material) chrome
needs and the host lacks - Material and Cupertino localizations (from
flutter_localizations, English where a locale has none), a Theme
derived from the host's CupertinoTheme or, failing that, its platform
brightness, DefaultSelectionStyle and IconTheme, and a transparent
Material surface. Under a host that already has a Theme and both
localizations it adds nothing. Wrap any stock widget you mount on its own
(a PdfEditingToolbar beside your own viewer) in PdfMaterialHost the
same way.showPdfDialog
(so it now opens from any context, not just from inside the editor), the
presenter's popup menus, its bottom sheets (a library-owned route,
showModalBottomSheet's presentation unchanged) and the fullscreen reflow
image.ScaffoldMessenger above,
PdfEditorPresenter.notice's default now shows the notice (and its Undo)
as a SnackBar-styled toast in the root overlay instead of returning false.SelectableText) uses the
new pdfTextContextMenu, the platform's stock context menu with the
localizations it needs re-injected - a right-click or long-press under a
non-Material host used to paint an error widget. Under a Material host it
is the default menu. Use it on text fields of your own dialogs.DropdownButton/DropdownButtonFormFields (line type, line
endings, scale and calibration units, stamp date/time format, the styled
text font family) are now a dropdown that opens through
PdfEditorPresenter.menu, drawn like the DropdownButton it replaces and
keeping its keys; its options open as a popup menu over the button.
DropdownButton's menu route had no hook for running under a non-Material
host.AFNumber_Keystroke, AFRange_Validate, ...), refusing
characters and invalid values exactly as reading mode does. Both modes
fill through one component (the page's form layer); the form tool keeps
its own taps (select, move, resize) and hands its double-tap over.tool/check_design_imports.dart also counts text fields without the
shared context menu; it and the DropdownButton counter are at 0.PdfEditorThemeData, the editor's design tokens: success/warning/
danger/info status colours (the signature and review pills), the
sectionLabel style, compactWidth and toastLift, plus canvas tokens in
viewer. Provide it with PdfEditorView(theme:) or
PdfEditorScope(theme:); read it with PdfEditorThemeData.of(context).
Defaults equal the old literals. PdfEditorScope also gains platform
and PdfEditorScope.platformOf (the in-page text editors' Apple caret
correction reads it instead of the Material theme's platform).PdfViewerThemeData gains merge, copyWith, lerp and the canvas
tokens that were hard-coded: marqueeColor, snapGridColor,
alignmentGuideColor, redactionHatchColor, rulerBackgroundColor/
rulerForegroundColor/rulerAccentColor, chipColor/
chipForegroundColor, handleSize, inlineSelectionHandleColor and
diffInsertedColor/diffDeletedColor/diffReplacedColor;
PdfScrollbarThemeData gains markerColor, merge, copyWith and
lerp; PdfViewerTheme.maybeOf. The stock fallbacks now resolve in one
place.PdfEditorView.headerBuilder, which builds the header from
PdfHeaderParts (page number, zoom, search, view options, panel switch,
save, the compact Controls button, compact, the stock header, and
bar(...) in the stock look). Export pdfShellCompactWidth.annotationMenuEntries,
textMenuEntries and formFieldMenuEntries (on PdfViewer and
PdfEditorView; textMenuEntries on PdfReader) receive the stock rows
and return the rows to show. PdfMenuEntry.id names stock rows by their
pdf-* key; pdfAnnotationMenuEntry/pdfTextMenuEntry build rows in the
stock style; PdfFormFieldMenuRequest describes the field menu.
showPdfAnnotationMenu/showPdfFormFieldMenu take entriesBuilder:.PdfEditorPresenter.actionBar and readout, which draw the floating
chips (PdfActionBarRequest: the touch annotation selection, touch text
selection and image crop chips with their actions as data;
PdfReadoutRequest: the measurement and style readouts). The defaults
return the stock chips unchanged.PdfViewer.showInlineTextStyleChip (and on PdfEditorView) to turn
off the touch text-style chip over an in-place text editor.PdfViewerController.globalRectOf(page, rect), a page-space
rectangle's on-screen position, and selectionGlobalRect, a
ValueListenable<Rect?> of the selection's on-screen bounds.PdfEditingToolbar.mobileBreakpoint is
700; a PdfEditorThemeData.compactWidth moves both.PdfReader.headerBuilder: the reader's header from the same
PdfHeaderParts PdfEditorView hands out (page number, zoom, search, view
options, panel switch, the compact Controls part; save is always null).PdfHeaderParts.saveButton(enabledWhenUnchanged:), a save button that
stays enabled while the document is unchanged and saves when pressed - for
hosts whose save shares or exports. The ⌘S / Ctrl+S shortcut still saves
only when there is something to save (or with alwaysAllowSave).PdfEditorView.extraPanels and PdfEditorPanel: a host's own dock
panels beside the stock ones, with a panel switch toggle, a resizable frame
whose move handle redocks them to any edge, and a bottom sheet on compact
layouts. Their dock, width and visibility persist by id
(PdfEditingPreferences.extraPanelDock/extraPanelWidth/
extraPanelOpen), or the host keeps visibility in a ValueNotifier
(PdfEditorPanel.open). PdfSidebarPanelFrame.hostPanel gives a host
panel's frame its move handle. Host panels dock standalone; they do not
join a stock panel's tab group.PdfCopyIntent,
PdfCutIntent, PdfPasteIntent, PdfSelectAllIntent, PdfDismissIntent,
PdfUndoIntent, PdfRedoIntent, PdfDeleteSelectionIntent,
PdfAutosizeTextBoxIntent, PdfNudgeSelectionIntent and
PdfArmToolIntent. pdfViewerDefaultShortcuts holds the stock bindings
(unchanged); PdfViewer.shortcuts (and viewerShortcuts on
PdfEditorView and PdfReader) replaces them. A Shortcuts above the
viewer can bind more keys to the intents, and an Actions above it
overrides what one does (the viewer's actions are Action.overridable).PdfSignaturePad and PdfSignaturePadController, the signature
dialog's drawing surface as a widgets-only widget: pointer and stylus
capture with pressure, the predicted lead, and trackpad drawing, over a
controller holding the strokes, ink and pen (toSignature()).
PdfSignatureDialog is built on it, with the same keys and behaviour.PdfPreferencesStore and PdfEditingPreferences(store:), so the
preferences can live somewhere other than the device's shared_preferences
(PdfSharedPreferencesStore is the default; PdfMemoryPreferencesStore
keeps them in memory).PdfEditorView/PdfReader: handing in a
controller where the shell owned one disposed the old controller while the
viewer's pages still used it ("_PdfForwardingListenable used after being
disposed"), and swapping one host controller for another left the new one
unbound. The viewer is now rebuilt bound to the new controller, and a
replaced owned controller is disposed at the end of the frame.pdf-* keys for tests that should not depend on Material widget types
(they keep working after the move to material_ui): the text prompt and its
field, the signature dialog's Done/Cancel, the colour picker's OK/Cancel,
the stamp editor's Save, annotation list rows and checkboxes, the link
dialog's fields, the thumbnail list and its delete buttons, the toolbar's
save, ink confirm/discard, delete, guides dialog and sliders, the identity
name field, the stock popup menu divider, the text context menu, and the
loading indicators.Bump the app to 5.1.1+41 and the lockstep package suite to 5.1.1 (dart_pdf_cli 0.2.2, dart_pdf_editor_flutter_gpu 0.4.2, dart_pdf_printing 0.2.2), wit
Bump the app to 5.1.1+41 and the lockstep package suite to 5.1.1
(dart_pdf_cli 0.2.2, dart_pdf_editor_flutter_gpu 0.4.2, dart_pdf_printing
0.2.2), with every runtime inter-package constraint at ^.
This is a patch release: no public API breaks since 5.1.0, and one addition
integrators may see:
Write the 5.1.1 changelog sections from the one commit since app-v5.1.0,
the ink afterimage fix (#986): quick back-to-back ink commits each hid the
previous one on screen until the page re-rendered, because the editing
overlay kept only the latest commit as its afterimage. Commits now
accumulate and retire per page once the raster and annotation layer are
current. The other packages carry a version-bump entry. Dev dependency
ranges (<6.0.0) already admit 5.1.1.
Store notes cover the ink fix and note that 5.1.1 includes 5.1.0's
improvements, written platform-neutral per release-notes/README.md, across
20 iOS locales, 21 Play changelogs (41.txt) and both Linux metainfo copies.
The forms guide now says it applies to 5.1.1.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
PdfEditingController.committedInksOn(page), every ink commit on a page
that has not reached its raster yet (oldest first), and
retireCommittedInk(page, throughRevision:), which the viewer calls once a
page shows that revision. committedInkOn is unchanged and returns the
newest of them.Bump the app to 5.1.0+40 and the lockstep package suite to 5.1.0 (dart_pdf_cli 0.2.1, dart_pdf_editor_flutter_gpu 0.4.1, dart_pdf_printing 0.2.1), wit
Bump the app to 5.1.0+40 and the lockstep package suite to 5.1.0
(dart_pdf_cli 0.2.1, dart_pdf_editor_flutter_gpu 0.4.1, dart_pdf_printing
0.2.1), with every runtime inter-package constraint at ^.
This is a minor release: no public API breaks since 5.0.0, with two things
integrators should know:
Write the 5.1.0 changelog sections from the commit bodies since
app-v5.0.0: the P-521 order fix, faster ECDSA, tolerant zlib inflate on
the web, the object-cache key and its side map, T-table AES, web SHA-2,
JPEG 2000, in-place updates on recovered documents, rollbackTo and
openAppended(password:) in pdf_cos; the page-loss fix under a short /Count,
linear page loops, reusable signature crypto cores and onFields in
pdf_document; the flagged masked-image output change, codec v10/v11,
cached luminosity masks, the revision-stable colour context, ICC, colorant
buffer and text-extraction speedups in pdf_graphics; trackpad signatures,
annotation previews, touch row menus, the moved-stamp white box, the web
worker fixes and in-place revisions in dart_pdf_editor; the new overprint
and ICC fixtures. Dev dependency ranges (<6.0.0) already admit 5.1.0.
Store notes cover trackpad signatures, annotation previews, touch row
menus, the moved-stamp fix, the page-loss fix, P-521 signatures and the
speedups, written platform-neutral per release-notes/README.md, across 20
iOS locales, 21 Play changelogs (40.txt) and both Linux metainfo copies.
The forms guide now says it applies to 5.1.0.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
DartPdfEditorLocalizations gained abstract getters sigUseTrackpad and
sigTrackpadHint. A custom subclass must implement them; extending a
bundled locale class picks them up.showPdfSignatureDialog / PdfSignatureDialog
get a trackpad: capture (defaulting to
PdfTrackpadSignatureCapture.platform) whose isAvailable() reports one:
the trackpad surface maps absolutely onto the pad, a finger down is the pen
down, any key finishes, clicks are absorbed and losing app focus ends it.
Flutter pointer events carry no absolute finger positions, so the host
supplies the capture; the DartPDF app does on macOS, Windows and Android.PdfAnnotationAppearancePreview),
falling back to the subtype icon when there is no appearance stream.DecompressionStream refused a payload, the unobserved output future
escaped as an uncaught error, fired Worker.onerror, and every later page
of the document fell back to main-thread rendering.build_web_worker takes -O<n> / --optimization-level
(default 3) and now exits non-zero when the compile fails.PdfRenderWorker.updateRevisionTo. The web worker takes revisions in place
too instead of restarting per edit, undo and redo; an older cached worker
bundle keeps the restart path.PdfBudgetedCache.lookup counts a hit without touching recency, for
admission-only caches.PdfPageRenderer.rasterizeViaLayer) instead of
replaying the transcript a second time on the UI isolate.PdfPageRenderer.collectImageRequests(distinctCells: true) for the decode
callers), so a bitmap-font page's picture builds in 37 ms instead of 456 ms.Roll the Unreleased sections over with Breaking changes subsections and migration notes, and write the ones the batch never got: AF* scripts, comb/Max…
Bump the app to 5.0.0+39 and the lockstep package suite to 5.0.0
(dart_pdf_cli 0.2.0, dart_pdf_editor_flutter_gpu 0.4.0, dart_pdf_printing
0.2.0 - their dependency majors moved under types they expose). This is a
major release because public behaviour and API changed incompatibly since
4.5.0:
Roll the Unreleased sections over with Breaking changes subsections and
migration notes, and write the ones the batch never got: AF* scripts,
comb/MaxLen/password fields, XFA detection, encrypted signing and tab
order in pdf_document; openAppended in pdf_cos; the /ImageMask box filter,
justified-text reflow spaces and multi-select field context in
pdf_graphics; the form-layer, secret-store, Tab navigation and
thumbnail drag-out work in dart_pdf_editor; multi-select values in the
CLI; the print range and copies fixes in dart_pdf_printing; the new
fixtures. Dev dependency ranges on workspace packages now admit <6.0.0 so
the workspace resolves and publishing still accepts the hosted 4.5.0.
Store notes cover form calculations and checks, Tab and multi-select,
password fields kept out of the file, field creation, signing encrypted
PDFs, revocation checks with EU/Adobe trust lists, and Calibri via
Carlito, across 20 iOS locales, 21 Play changelogs, and both Linux
metainfo copies. The forms guide now says it applies to 5.0.0.
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
PdfFormFieldKind gained radioGroup, comboBox, listBox and
signature. Exhaustive switches over it need the new cases (or a
default).PdfBundledSubstitute gained carlito. Exhaustive switches over it need
the new case.PdfEditingController.setFormFieldText now treats the value as user entry
(PdfEditor.enterTextValue): a field's recognised keystroke and validate
scripts (AFNumber_Keystroke, AFDate_KeystrokeEx, AFRange_Validate, ...)
run first, so it returns false for a refused value and stores the
normalised one. Through setTextValue it also truncates to /MaxLen,
recalculates calculated fields and drops stale /XFA. Call
checkFormFieldText first to learn why a value would be refused. With a
formSecretStore, a password field's value goes to the store instead of
/V.PdfEditorView and PdfReader given no viewMode: now own a
PdfViewModeController of their own, seeded from the preferences once they
load. The shell no longer follows later writes to
preferences.viewMode / showReflowView / showThumbnailView, so a host
that switched the shell's mode by writing those must create a
PdfViewModeController and pass it as viewMode:, then drive that.DartPdfEditorLocalizations gained abstract getters for the new form,
XFA and signature-revocation strings (formXfaUnsupportedNotice,
sidebarSignatureRevokedStatus, menuConvertToRadioGroup,
formOptionsTitle, ...). A custom subclass must implement them; extending a
bundled locale class picks them up.PdfEditingController.signatureTrustAction lets a host offer a one-click
way to trust an unknown signer, for example by loading a trust list. The
signature panel now also names the trust list a root came from.
The signature panel checks revocation when the controller has a
revocationClient. It shows a Revoked status, whether revocation was
confirmed online or from embedded data or could not be checked, and it names
self-signed signers and untrusted issuers.
Multi-select list boxes take several values (#933):
PdfEditingController.setFormChoiceValues and pickFormChoiceOption
(which toggles an option on a multi-select box), and the form option menus
show checkable items for those fields, each pick toggling one option.
The form tool creates radio groups, combo boxes, list boxes and empty
signature fields (#934): PdfFormFieldKind gains radioGroup,
comboBox, listBox and signature, and the new-field and field-type
menus list them. A selected radio group offers "Add button to group"
(PdfEditingController.addFormRadioButton), a selected choice field
"Edit options…" (showPdfFormOptionsDialog / PdfFormOptionsEditor,
applied through setFormFieldOptions), and every field converts to the
new kinds.
Draw cold annotation appearances against a frame budget instead of one per
frame. With an editing or form controller attached, marks are drawn by the
page's annotation overlay on the platform thread, and each render-scheduler
grant used to draw exactly one appearance - so a drawing carrying 1,000
stamps filled in over eight seconds at 120 Hz (sixteen at 60 Hz) while the
thread sat idle for most of every frame. A grant now keeps drawing until
PdfPageRenderScheduler.appearanceFrameBudget (4 ms) is spent, publishing
once per batch rather than once per mark. One appearance still draws per
grant however long it takes, so heavy appearances keep the old pacing.
Add PdfViewerController.isAnnotationAppearanceBusy and
annotationAppearanceProgress, notified through pageRenderActivity. The
overlay finishes after the page raster, so isPageRenderBusy and
isPageRasterReady read done while marks are still landing; these report
the overlay's own outstanding work on the pages it is live for, from the
moment a pass is queued until the frame that paints its last appearance.
Draw unembedded Calibri in Carlito instead of TeX Gyre Heros.
pdfBundledSubstituteFor had no Calibri entry, so it fell through to the
default sans, and Helvetica's advances are much wider than Calibri's - with
every character pinned to the PDF's own pen offset by
exactSubstitutedGlyphPlacement, the surplus had nowhere to go and the
glyphs crowded into each other - which is what an Office-printed cover page
looked like. Carlito matches Calibri's advances exactly, in all four styles.
The faces come from the optional dart_pdf_editor_assets package; without
it, the fallback chain now names a host Carlito or Calibri before anything
else. PdfBundledSubstitute gained assetSuffix (Carlito is TrueType where
the TeX Gyre faces are CFF) and fontFaceFormat, which the web worker's
FontFace now names instead of assuming opentype.
Give each window its own view mode. PdfEditingPreferences is one object per
process, so reading the live mode off it meant switching to the page grid (or
reflow) in one window switched every other window with it. The live mode now
belongs to the window: PdfViewModeController holds it, PdfEditorView and
PdfReader take it as viewMode:, and a multi-window host creates one per
window and hands it to every shell that window builds - so all of that
window's tabs share a mode and no other window follows.
PdfEditingPreferences.viewMode still persists each choice, now as the mode
the NEXT window starts in and the one the next launch restores. A shell given
no controller owns one seeded from - and written back to - the preferences,
so a single-window host is unchanged. pdfShellViewModeControls takes
viewMode: in place of preferences:, and PdfShellViewOptionsButton takes
an optional viewMode: that falls back to its preferences.
Hold Shift while dragging a line, polyline or polygon vertex handle to straighten the segment being reshaped onto the nearest 45° axis, the same constraint the tools already apply while drawing. A vertex with a neighbour on each side (every vertex of a polygon, whose ends wrap) takes whichever of its two segments the pointer was already closest to lining up. Callout leader handles keep their free aim.
Run the recognised AF* form scripts while filling (#930): a keystroke
script filters typing (a number field won't take letters), Enter on a
refused value keeps the inline editor open with the reason under the field,
leaving a field with a refused value keeps its old value and shows a toast,
and the afterimage shows the formatted value.
PdfEditingController.checkFormFieldText checks a value without editing.
Honour comb fields, /MaxLen and password masking in the inline editors
(#931): they cap input at /MaxLen and obscure password fields, their
afterimages stay masked, and the Edit value prompts no longer prefill a
password. Add PdfFormSecretStore with InMemoryFormSecretStore and
SecureFormSecretStore (flutter_secure_storage), keyed by the document's
permanent id and the field name. PdfEditingController(formSecretStore:)
routes password fills there instead of the file, restores stored values on
open without dirtying the document, keeps the store in step with undo and
redo, and forgetFormSecrets() clears a document's values.
Show a one-time, closable notice when a form is dynamic XFA instead of silently showing no fields (#929). Hybrid forms fill normally.
Tab and Shift+Tab move between form fields (#932), across pages and
wrapping at the ends, in each page's /Tabs order. Text fields open their
inline editor; check boxes, radio buttons and choice fields get a focus
ring (Space toggles, a choice field opens its menu). Multi-line fields move
on Tab instead of typing a tab. PdfViewerController.revealRect scrolls a
rect into view without zooming.
A thumbnail reorder drag carried out of the strip's window is reported
through PdfThumbnailDropController.onPageDragOutside /
onPageDropOutside (PdfPageDragOut) instead of reordering the strip, so a
host can move the pages into another window.
PdfEditingController.removePages removes several pages in one edit. The
thumbnail strip and page grid bind undo/redo themselves, so a paste made
there can be undone while the panel keeps focus, and undo/redo of a
structural edit clears the stale page selection. A held drop is cancelled
when an edit changes the document under it.
Bump the app to 4.5.0+38 and the lockstep package suite to 4.5.0 (dart_pdf_cli 0.1.8, dart_pdf_editor_flutter_gpu 0.3.4, dart_pdf_printing 0.1.1). Not
Bump the app to 4.5.0+38 and the lockstep package suite to 4.5.0
(dart_pdf_cli 0.1.8, dart_pdf_editor_flutter_gpu 0.3.4, dart_pdf_printing
0.1.1). Nothing public was removed or changed incompatibly since 4.4.0 -
showPdfShellViewOptionsSheet lost its reflow/pageGrid parameters, but it is
not exported - so this is a minor release.
Roll the Unreleased sections over and write the ones the 4.4.0..HEAD batch
never got: WinAnsi widths and the DocMDP P=1 signing refusal in pdf_document,
CJK selection metrics in pdf_graphics, selection continuity, the stroked-text
floor, stem darkening and the page-grid State fix in dart_pdf_editor.
Store notes cover What's new, the Linux antialiasing fix, exported pages
opening in a tab, the view-mode picker, metric-compatible standard-14
substitutes, and selection and stroked-text fixes, across 20 iOS locales,
21 Play changelogs, and both Linux metainfo copies.
Co-Authored-By: Claude Opus 5 noreply@anthropic.com
Group the view-options menu around what its rows actually do. Reflow text
and the page grid each REPLACE the page viewer, but they were drawn as two
independent checkmarks among the display overlays, and each silently cleared
the other - so leaving a mode meant unticking the one you ticked, and plain
pages existed only as the absence of both. They are now one SegmentedButton
at the top of the menu, with Pages as a real destination, over a
PdfEditingPreferences.viewMode (PdfViewMode) that owns the exclusivity
the callers kept re-implementing - including the command palette, which
toggled the two bools independently and could show both at once. On compact
layouts the modes move up into the Controls sheet's View section, one tap
from the document: Reflow already had a tile there, and the page grid needed
Controls -> Settings -> scroll -> tick. The Settings sheet keeps only
settings, and showPdfShellViewOptionsSheet no longer takes reflow /
pageGrid.
Draw unembedded standard-14 text in the metric-compatible TeX Gyre faces
bundled by dart_pdf_editor_assets - Heros for Helvetica/Arial, Termes for
Times, Cursor for Courier - ahead of any host font. Substituting a face with
different advances opened white space inside words, because each character is
placed at the PDF's own pen offset: DejaVu Sans, the previous fallback, drew
J at 295/1000 em where Helvetica's table reserves 500, leaving ~2.7pt of air
after every capital J at 12pt. Without the assets package the renderer now
names the host's metric equivalents (Arial, Liberation Sans, Nimbus Sans and
their serif/mono counterparts) before falling back further.
Load only the substitute weights and slants a page actually shows in the canvas2d web worker, and none for an invisible OCR layer.
Export the substitution policy (PdfBundledSubstitute,
pdfBundledSubstituteFor) so a host can resolve the same faces the renderer
does.
Keep a text selection that crosses separately drawn runs continuous:
selection rects and the quads addMarkup saves are normalized to one box
per visual line, joining fragments only across a gap of up to 1.5 line
heights so a column gutter keeps its two boxes.
Hit-test text with each run's own ascent and descent, so CJK lines select over the whole glyph height.
Floor stroked text (rendering modes 1/2/5/6) at one device pixel on both
text paths. A 0 w width no longer becomes a hundredth of an em in the
substituted-font painter, which left stroked text nearly invisible.
Add an off-by-default glyph stem darkening flag,
CanvasPdfDevice.glyphStemDarkening, which darkens thin stems of small text
without widening them.
Keep the viewer's State when the editing toolbar comes and goes, so
double-clicking a page in the page grid lands on that page instead of
rewinding to page 1.
Opt the example's Linux runner out of Impeller (DARTPDF_IMPELLER=1 turns
it back on): on desktop OpenGL Impeller fills PDF glyph paths without
antialiasing.
Storeflight and release-app.yml both created the release for an app-v tag. Storeflight pushes that tag, so its own delivery and the workflow the tag s
Storeflight and release-app.yml both created the release for an app-v tag.
Storeflight pushes that tag, so its own delivery and the workflow the tag
starts were racing to own the same release, and would have attached two sets
of assets for the same platforms under different names.
Storeflight wins, with one exception it cannot cover. A release artifact
there is a single path per platform, and Linux ships two user-facing files -
the portable tarball and the AppImage. Dropping either is not an option:
publish-flatpak.yml downloads dartpdf-linux-x64.tar.gz from the release by
name and verifies its digest, so the Flatpak publisher fails a step later
without it.
So release-app.yml stops creating a release and contributes only the two
Linux assets. It waits for Storeflight's release rather than creating one,
because publishing the tag is what starts it and it can arrive first;
creating one there would be the same race with the roles reversed. It also
asserts the tarball is present under the name the Flatpak publisher looks
for, so a rename fails here rather than ten minutes downstream. The job now
needs only the Linux build, since waiting on the other six delayed that input
for no benefit.
publish-flatpak.yml waits for the asset for the same reason: two workflows
started by one tag have no ordering between them, and an asset still
uploading is not a missing build.
Co-Authored-By: Claude Opus 5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01RNNTEpKG3vAEwMYMvghdvx
Add 4.3.0 Linux release metadata
Add 4.3.0 Linux release metadata
PdfKeyboardAvailability so hosts can hide shortcut hints and shortcut
settings when a physical keyboard is unavailable. Shortcut bindings stay active.PdfDialogSubmit to mark a showPdfDialog primary button for Enter and
numpad Enter submission. Wire the stock editing dialogs to it, preserving
validation, IME composition, Shift+Enter, and keyboard-focused buttons.pasteSnapshotBytes, and systemPdfPasteProvider
on the viewer and editor shell. External PDFs paste as editable vector stamps
through keyboard and context-menu Paste, with image/text fallback.PdfCompressionTask in compression_worker.dart: cancellable PDF
optimisation in native isolates and dedicated browser workers, with exact
savings reports and no main-thread fallback when a worker fails.pdfToolGroups, pdfToolCatalog(),
PdfToolGroup/PdfToolEntry, and pdfEditToolLabel/pdfEditToolTooltip/
pdfMarkupLabel/pdfMarkupTooltip. The dock now reads the same list a host
can enumerate, so a command palette or shortcut sheet stays in step with the
tools the toolbar actually shows.PdfEditingController.exportPageRanges, showPdfSplitDialog, and the
onSplitPages host callback on the editor shell and both thumbnail layouts.
The Split PDF action accepts comma-separated ranges and generates one PDF
per range in a single batch. The example opens extracted results in new tabs.Release dart_pdf_editor 4.2.0
Release dart_pdf_editor 4.2.0
textMenuBuilder, the text-selection counterpart to
annotationMenuBuilder: hosts append their own entries to the right-click
text menu (below a divider, after the stock markup/Copy/Select all) on
PdfViewer, PdfEditorView, and PdfReader, in reader mode as well as
with an editing session. Also expose PdfViewerController.selectAllTextOn
so a host that takes the whole menu over with onContextMenuRequested can
rebuild Select all.Ctrl/Cmd+wheel zoom on the pointer across the fit-width seam, and
carry the focal point through the zoom settle so the web's pinch-reported
Ctrl+wheel also holds the point under the cursor. PdfViewerController.setZoom
now zooms about the viewport centre the reader is looking at./Rotate: the resting rotation now comes from
PdfAnnotation.appearanceRotation in page space rather than from a
view-space quad, so a square annotation on a /Rotate 90 page is no longer
treated as turned a quarter turn (which transposed committed rects). Resize
cursors now follow the handle's on-screen direction.QuadPoints rather than its bounding box.Release dart_pdf_editor 4.1.0
Release dart_pdf_editor 4.1.0
PdfAnnotationSnapshots, with named groups, context-menu capture,
cross-document placement, cursor-following drop previews, repeat Paste, and
a direct path to the custom-stamp collection.PdfEditorView when a host has not supplied a signing handler.Release dart_pdf_editor 4.0.0
Release dart_pdf_editor 4.0.0
Add an optional asynchronous tile-backend retry hook and exact retained-scene re-recording, while preserving the existing Canvas fallback when a retry is unavailable, fails, or remains inexact.
Breaking: classes that implements PdfTileRasterBackend must add
supportsWarmUp, supportsSessionWarmUp, and warmUp(). Extending the base
class keeps the default no-op implementations.
Fit a free-text font to its existing box from the selection toolbar, tighten Alt+Z box autosizing to the font's real vertical metrics, and add selected annotation flattening to the right-click menu.
Add compact docked editing controls and horizontal thumbnail layouts, with steadier panel sizing, scrolling, selection, and recent-document previews.
Collect worker-decoded images inside retained tiling cells, so bitmap Type 3 glyphs keep their image pixels when a command buffer is rebuilt on the UI isolate.
Let optional tile backends prepare view-scoped resources and live-page scene sessions after first useful pixels and a 750 ms quiet window. Foreground rendering cancels and restarts the delay, keeping first paint and immediate navigation uncontended while avoiding cold setup during deep zoom.
Carry exact output-intent colour, overprint, transparency, soft-mask, and high-bit-depth image rendering through Canvas, retained, worker, and tile paths.
Release dart_pdf_editor 3.8.0
Release dart_pdf_editor 3.8.0
PdfViewerFeatures.showSelectionChip for host control of the touch selection
chip.Fix a release-mode crash when an annotated viewer unmounts while a cached annotation picture is still being disposed.
Anchor thumbnail context menus to the correct position when the editor is hosted inside an offset nested navigator.
PdfPageRenderScheduler gains a motion lane: a request declares a
PdfRenderMotionClass, evaluated at grant time rather than baked in, so a
worker-backed page renders during any motion, a small page without a worker
renders in the scroll-quiet window, and anything heavier keeps the old hold.
A page on screen with nothing to paint now asks for its render on every
rebuild (guarded by isQueued), which is what was missing for a page the
reader scrolled onto.PdfPageView.motionSafeMaxImagePixels and PdfPageRenderer.imageDrawPixels
admit the letterhead mark that every page of a corporate report carries,
which the first cut of the gate refused outright.PdfPagePreviewCache.priceRetainedScene
floors an entry at the raster it stands in for - the engine's own picture
estimate under-reports a text page by ~18x - and the budget becomes
platform-aware (pdfDefaultRetainedSceneBytes), so the entry cap goes back
to being a backstop. A cached scene is now adopted when it is sharp at the
current zoom, not only when it carries a fresh render's decode headroom.PdfSearchResultsPanel(editing:)
reveals a replacement field behind a disclosure in the options row, with
Replace and Replace all (one undo step); a null editing leaves it a pure
find panel. Backed by replaceMatchText and replaceTextOnPages on the
editing controller, and persisted through
PdfEditingPreferences.searchReplaceExpanded.replaceElementText, as the selection menu already did.pdf_document's new SimpleFont.PdfPerfLog and prints
a debug warning, and the interpret line distinguishes recorded(no-worker)
from recorded(declined).Add showPdfDialog, a view-local Material dialog helper for hosts using Flutter's desktop multi-window support.
showPdfDialog, a view-local Material dialog helper for hosts using
Flutter's desktop multi-window support.Keep image soft-mask compositing correct on Impeller by applying the mask at the layer boundary, preventing masked images from rendering as black bloc
Sharpen deep-zoom pages visible-first: the foreground render now covers the exact viewport. Once that sharp frame paints, tile-capable pages grow boun
PdfViewerController.pagePreviewLodStats and perf logs.PdfComparisonView receive the same optional tile raster backend as the
reader, editor, and viewer, so hosts can switch every mounted view together.PdfPageView.onScreen now gates the
reduced-resolution image decode and the live-raster reclaim, so pages above
and below no longer soften and blank as they cross the viewport edge on
large-format scans (#657). PdfLiveRasterHolder implementations must add
liveRasterOnScreen.Add a reproducible Chromium/PDFium competitive harness and reduce deep-zoom memory pressure by reserving large rasters for visible-region detail, reus
ImageBitmap LRU capped at 8 MP / 32 MiB per live surface. Five-run gates for
the plan, scan, text, and ultra-dense diagram scenarios now meet every
configured PDFium p50/p95 interaction and RSS budget while the path remains
experimental and default-off.SharedArrayBuffer across
sibling workers instead of copying the full file per worker. A weekly
Chromium/PDFium workflow and tool/perf.sh pdfium-gate run all six acceptance
scenarios with checked-in budgets.PdfAnnotationSnapshotClipboard, shared by default across editing
controllers, so annotations copied in one document can be pasted into
another open document (#653).PdfThumbnailDropController and thumbnail-panel drop targets, enabling
hosts to insert externally dropped PDFs at an exact page position (#654).Fix annotation property edits duplicating an annotation in PDFs that store the page annotation array indirectly (#638).
Add PdfPageRasterWarmPolicy (disabled by default, plus nearby(window:) and document()): the viewer can now spend genuine idle time baking the exact, d
PdfPageRasterWarmPolicy (disabled by default, plus nearby(window:)
and document()): the viewer can now spend genuine idle time baking the
exact, display-sized raster of pages the user has not visited, so arriving on
one paints immediately instead of interpreting and reading back first. On a
16-page vector plan set in real Chrome that is ~2100 ms → ~107 ms; on a 12-page
A3 scan, ~1720 ms → ~49 ms, for 60–85 MB of retained rasters. Warming stands
down for any scroll, zoom, edit, armed tool, deep zoom, or queued page render,
paces itself to one page at a time, prefers the render worker, and declines a
page whose raster PdfPageRasterCachePolicy could not admit before doing any
work. Available on PdfViewer, PdfReader, PdfEditorView, and
PdfComparisonView; diagnostics through
PdfViewerController.pageRasterWarmStats.(page, raster signature) — page
index, physical size, paper colour, annotation visibility, and rotation —
rather than by page index alone, so warming or visiting one size no longer
overwrites a useful raster at another. Up to two geometries per page are
retained, bounded by the same PdfPageRasterCachePolicy byte budget; rasters
belonging to a superseded document revision are dropped on sight. This
supersedes 3.2.0's "discard unusable visited-page cache entries": a lookup at
another geometry is now a plain miss that leaves the raster it did not ask
for alone, because that raster is exactly what a zoom back to fit — or the
idle warm — needs.PdfRasterCache(fullRasters:). Exact page rasters can now survive process
restarts, use an independent size-bounded LRU, validate a versioned payload,
and fall back safely on cache corruption or I/O failure. New
PdfRasterCacheStats and PdfDiskCache counters expose hits, misses,
stores, rejections, evictions, byte totals, and codec latency (#615).PdfAnnotationPropertiesPanel, keep
newly inserted PDF pages in view, and expose PdfViewer.trailingPadding so
floating editor chrome can reserve clearance below the document (#622,
#631, #637).Add PdfPageRasterCachePolicy to configure the in-memory byte budget and per-page limit for exact rasters of previously visited pages. The existing 32
PdfPageRasterCachePolicy to configure the in-memory byte budget and
per-page limit for exact rasters of previously visited pages. The existing
32 MiB total / 16 MiB per-page defaults are unchanged; PdfViewer,
PdfReader, and PdfEditorView can now opt into a much larger desktop
working set. Retained full-page rasters participate in process-wide cache
accounting and memory-pressure cleanup, so multiple viewers share the
coordinated host ceiling. Performance traces now report exact-raster policy,
hit, miss, admission rejection, store, and budget-eviction events, while
cache diagnostics expose lifetime hit/miss/eviction counters. Dense
deep-zoom scenes now bootstrap their worker-built spatial index correctly
instead of remaining on repeated full-viewport detail rasters indefinitely;
the capped base remains visible during that warm-up rather than launching an
obsolete fallback record, and traces split tile replay/raster/slicing costs.PdfViewer, PdfReader, and PdfEditorView
accept onContextMenuRequested; with the stock menu disabled, a
PdfContextMenuRequest reports the resolved text, annotation, locked
annotation, form widget, or empty-page paste target for mouse and touch
gestures (#538)./QuadPoints quads instead of the enclosing
/Rect, so gaps between marked lines no longer steal clicks or show as
selected (#627).Fix intermittent frame drops while scrolling large or visually dense documents. Page recording and raster work now keep the frame scheduler awake betw
Overprint (§8.6.7) now renders faithfully: the interpreter resolves it in a CMYK/spot colorant buffer — including per-sample colorant readings from im
Overprint (§8.6.7) now renders faithfully: the interpreter resolves it in a
CMYK/spot colorant buffer — including per-sample colorant readings from
images — and hands CanvasPdfDevice the composited colour, so a neutral ink
knocks a DeviceCMYK backdrop's process colorants out to grey while a spot
backdrop of the same colour survives. CanvasPdfDevice's darken
approximation remains only for draws the buffer declines (#502, #604).
New tools: a hyperlink tool (PdfEditTool.link) authors external (URI)
and in-document (GoTo) links from a box drag or the current text selection,
via PdfLinkTarget and showPdfAddLinkDialog (#500); crop for placed
images and raster snapshots (PdfImageCropOverlay) (#504); annotation
lock/unlock with Acrobat/Bluebeam interop (#493); and keyboard shortcuts
for every editing tool through Shift-extension bindings (#497).
The annotation properties panel groups its controls into collapsible
sections (#543), and the search panel can search annotation contents
(note bodies, free-text boxes) alongside page text — PdfSearchOptions
gains searchAnnotations (on by default) (#495). Pages can be deleted from
the thumbnail strip and grid with Delete/Backspace (#498).
Rendering is dramatically faster on large or image-heavy documents, and now
progressive: PdfViewer starts a default render worker (#396), streams
partial records as they are produced and reveals pages top-down as content
arrives (on by default, native and web transports) (#564), resumes a
preempted page record instead of restarting (#530), decodes a page's images
concurrently (#454), extracts search text off the UI thread (#396), and
budgets the thumbnail record to its tile size off the platform thread
(#603). A page's image decodes are shared across its records, glyph
outlines are written once per record, the decoded-image cache is keyed by
resolution on every path, and the scheduler no longer grants a page a
second concurrent render (#451).
Annotation sync diffs against a cached baseline instead of re-opening the
previous revision's document (#416). Bundled editor fonts defer off cold
start (#569). The tune (style) button shows on the mobile toolbar (#584);
the image tool hides when no imagePicker is wired (#574); free-text
selection stays visible while the tune popup is open (#573); zoom is held,
not just scroll, when a side panel is resized (#509); overlay hover cursors
paint on their own repaint layer (#403).
The keyboard-shortcuts editor (Settings → Keyboard shortcuts…) now groups tools under tool-category headers (Select, Draw, Shapes, Insert, Measure, Ed
The keyboard-shortcuts editor (Settings → Keyboard shortcuts…) now groups
tools under tool-category headers (Select, Draw, Shapes, Insert, Measure,
Edit) and adds a search box that filters by tool name or bound key. New
public pdfEditToolGroupOf(PdfEditTool); PdfEditToolGroup moved to the
tool_shortcuts library (still exported, so no import change for callers).
Breaking: the six bundled editor fonts and the web render worker moved out
of this package into the optional
dart_pdf_editor_assets package, so viewer-only
apps no longer bundle their ~1.7 MB on every platform (#459). To keep the
historical full-featured behaviour, add that package and call
registerBundledEditorAssets() once at startup. Missing assets degrade
gracefully: the font menu drops its "bundled" group, composite-text fallback
is skipped, and web rendering falls back to the main thread.
pdfBundledFonts is now a mutable, empty-by-default registry (a
PdfBundledFont can also carry a loadBytes byte loader for
application-provided fonts), and pdfRenderWorkerScriptUrl defaults to null.
On web, if page rendering falls back to the main thread because no
render-worker script is configured, a one-time debug-only warning is now
logged pointing at registerBundledEditorAssets(), so an app that forgot to
opt into the worker asset notices the silent performance cliff. Release and
profile builds stay silent.
contextMenuEnabled to suppress the built-in annotation/text context
menus for hosts that supply their own (#463)./Rotate so it
is not spun when moved across pages of differing rotation (#460)./Rect so a move repaints the
annotation (#467), and fix stray dots in reduced-opacity ink annotations
(#482).Add a reflow reading view: lazy scrolling over the extracted text, in-view navigation, a saved reading position, and a figure viewer (#380).
Add a reflow reading view: lazy scrolling over the extracted text, in-view navigation, a saved reading position, and a figure viewer (#380).
Expose progressive open on the reusable viewer widgets, so a host can render a document as its bytes arrive rather than after the last one (#378).
Grid-cull region replay and size-gate hover hit-testing on dense pages, so a CAD sheet's replay touches only the commands overlapping the region (#383), and build the region-replay grid index on the render-worker isolate to keep it off the UI thread (#389).
Scope tile invalidation to the pages it names: the ordering counter is now separate from the staleness test, so invalidating one page no longer discards in-flight tiles for every other page (#374).
Apply incremental revisions in place on the commit path instead of reopening the document (#395).
Resolve the hovered page once per pointer event rather than once per hit-test candidate (#403).
Let a page leave its sticky render worker when that worker is busier than another active one, so a queued page is not held behind an unrelated backlog (#456).
Fix a failed deep-zoom detail render stranding the full-image refinement, and give each render its own vector-first detail completer so concurrent renders cannot complete each other's futures (#420).
Add an unstable render-trace diagnostics entry point,
package:dart_pdf_editor/perf_log.dart (deliberately not exported from the
package entry, mirroring package:pdf_cos/perf.dart). PdfPerfLog gains a
sink so a host can route the trace into its own log, and the interpret
trace splits into wait/build and decode/replay phases (#454).
Make the viewer scroll-indicator API axis-aware: PdfScrollMetrics now
describes the viewer's main layout axis and carries an Axis scrollAxis
saying which. In PdfPageLayout.horizontalContinuous,
PdfViewer.scrollIndicatorBuilder replaces the stock bottom bar (not just
the right-edge bar in vertical layout), the metrics report the horizontal
position/extent/pixels, and jumpToNormalized moves along the horizontal
axis; the cross-axis (zoom-window) scrollbar is unchanged. Vertical behavior
is source-compatible (scrollAxis defaults to Axis.vertical) (#428).
Add X-strip transcript banding to bound retained memory on extreme-aspect
pages (PdfBandedTranscript): partition a page's PdfRenderCommand
transcript into N vertical strips along the horizontal pan axis, retain only
the strips overlapping the viewport, and re-materialize an evicted strip on
demand. PdfRetainedScene gains bandTranscript/bands/reband,
dropRegionIndex, and debugUnitBandHistogram; the viewer's memory-pressure
path now sheds retained-scene spatial metadata via
PdfRetainedScene.handleMemoryPressure (dropped indices rebuild identically,
evicted strips re-materialize, so there is no visual regression) (#385).
Breaking: remove the pure style forwarders from PdfEditingController. The ~19 tool-style properties that only mirrored preferences (strokeWidth, corne
PdfEditingController.
The ~19 tool-style properties that only mirrored preferences
(strokeWidth, cornerRadius, eraserRadius, fontSize, textAlign,
opacity, lineStyle, lineScale, lineStartEnding, lineEndEnding,
textFillColor, textBorderColor, shapeFillColor, author,
stampDateFormat, stampTimeFormat, fingerDrawsInk, measurementScale,
signature) are gone; read and write them through
controller.preferences.<name> instead. The setters that carried editing
side effects stay on the controller (color still recolours the active
stamp and honours the colour lock; fontFamily still clears the embedded
activeFont), as do the computed helpers (dashedStroke,
hasMeasurementScale) and every signature/measurement behaviour method
(placeSignature, calibrateScale, measuredDistance, …) (#317).PdfScrollMetrics snapshot (page count, current page,
normalized position/extent, pixel offsets, zoom) via
PdfViewerController.scrollMetrics, page-aware commands
jumpToNormalized and animateToPage alongside the existing
jumpToPage, and a PdfViewer.scrollIndicatorBuilder that replaces the
built-in vertical scrollbar with a host widget (#326).PdfViewer: the new pageLayout
parameter takes a PdfPageLayout - verticalContinuous() (the default,
top-to-bottom) or horizontalContinuous() (left-to-right, book-like
reading and wide documents). The horizontal layout keeps every viewer
behaviour along the new axis - virtualization, zoom/pan, current-page
tracking, search and destination navigation, text selection, overlays,
links, forms/annotation hit-testing, keyboard navigation, and mixed page
sizes (pages fit the viewport height and centre on the cross axis).
PdfPageLayout is a value type with named constructors so further layouts
(facing/two-page) can be added without changing the viewer's API.
PdfReader and PdfEditorView forward the option (#324).PdfTileStore),
now enabled by default on every platform: past the raster caps the viewer
renders and caches the visible slice at native resolution instead of
upscaling, with a budget-vs-demand guard against eviction thrash (#314).PdfByteSource so the first
page paints before the whole file is read/downloaded (#359, #328).PdfEditToolBehavior as the single source of tool identity, and
collapse PdfViewer's separate document + editing inputs into one revision
source (#311, #319).Print through each platform's native print system: the Dart engine renders every page itself and streams it to the OS (Windows, macOS, iOS, Android, L
printing plugin
and its bundled PDFium so broken-but-renderable documents no longer
crash on print. rasterizePdfForPrinting and printPdfBytes back the
path (#291).PdfPageClipboard: controller gains
copyPages/cutPages/pastePages (and the *SelectedPages variants),
wired into the context menu, bulk-selection bar, header menu, and
Cmd/Ctrl+C/X/V (#299).restyleSelected(cornerRadius:),
canRoundSelectedCorners, selectedCornerRadius) (#297).restyleSelected(scale:), selectedLineScale), so a thin
outline can carry big puffs or a heavy line tight dashes (#300).addSelectedVertexAt, removeSelectedVertexNear,
canAddSelectedVertex, canRemoveSelectedVertex (#288).recolorSnapshotSelected,
canRecolorSnapshotSelected (#301).documentAnnotationColors), via pickEditingColor (#292).PdfSliderValueField fieldMin/fieldMax;
point/size values up to kPdfTypedSizeMax = 1000, opacity a true
0–100%, line spacing 0.1–100x) (#302).PdfEditorView.alwaysAllowSave keeps Save enabled so the
first save routes to Save As (#294).pdfRenderWorkerCacheMaxEntries, default 64), so a long document's memory
no longer grows unbounded in the page count.PdfPageObjectCache (pdfViewerPageObjectCacheMaxEntries, default
128), so revisiting pages still hits but retention no longer grows one
entry per page visited for the life of the viewer (issue #283).PdfImageCache
default 256 MB desktop, 128 MB mobile/web, 64 MB on a ≤2 GB browser
device), measured against the corpus, and clear the image + preview
caches on didHaveMemoryPressure (#284, issue #281).PdfRenderTrace value type that
both isolates fill (worker parse/interpret/serialize; main isolate
transfer/deserialize/replay/rasterize), surfaced via
PdfRenderTrace.captureOffThread and PdfRenderWorker.lastRenderTrace
(free unless PdfPerfLog is on). Adds PdfRenderPhaseBudget and a
default-on render-trace gate test guarding against per-phase
regressions; PdfWorkerPhaseTimings is now an alias of the new type
(#321).Expose edit-and-style and markup actions when text is selected in an editor-backed viewer, on both touch and desktop context menus.
applyRemoteChange as an undo checkpoint: local edits made after
a remote apply stay undoable, but undo can no longer remove remote state or
cross into older local history.Correct selection and copy ordering for multi-word Arabic and other right-to-left page text.
Regenerate the bundled web render worker from the current sources so web consumers receive the 1.4.3 form and fragmented-strip rendering fixes.
Bake page rotation into regenerated form appearances so existing and newly authored fields remain upright after rotating the document.
PdfDigitalSignatureIdentity and addDigitalSignature, including key/cert
matching, validation before commit, and undo/redo support.Varies) values for multi-selected annotations in
the properties panel, with bulk edits for compatible appearance, line,
contents, and author properties.Keep touch scrolling responsive on zoomed mixed-width documents when a gesture starts on the canvas or in an inter-page gap, and keep the current page
Add callout annotations and rich-text styling for in-place document text edits, including the editor controls and annotation presentation support.
Color processing: add a Bluebeam-style tool that can list document colors, replace one or more selected colors across selected pages or the whole docu
pdfRenderWorkerScriptUrl unless they want to self-host the worker.Viewer rendering: annotation appearances now paint in a separate overlay from the base page raster, so annotation-only edits no longer invalidate the
PdfAnnotationTapHandler callback.Font menu: offer the host platform's installed fonts as embeddable choices alongside the base-14 families and bundled fonts. A host fills the new pdfP
pdfPlatformFonts registry once at startup (the example/app scan the OS
font directories on native; web stays empty), and every font menu picks
them up by default. Picking one embeds its outlines into the document so
the text renders and prints everywhere. New PdfPlatformFont type and an
optional platformFonts argument on PdfFontMenuButton/showPdfFontMenu.PdfEditorView can now replace the stock bottom editing toolbar via
toolbarBuilder, in addition to the existing leading/trailing toolbar
extension points.PdfEditor.applyOcr now accepts a PdfOcrRasterizer, so hosts and
tests can provide their own rasterization backend while still using the
built-in text-layer injection flow.PdfPageRenderPlan carries page color, annotation visibility,
and view rotation through the renderer paths, keeping viewer rasters,
color sampling, and worker replay in sync.Nothing published for this version
Free text: align a text box left, center, or right. The alignment buttons sit in the text style popup and the annotation properties panel - they apply
View rotation: rotate the displayed page in 90° steps without changing the document's page orientation; selection, overlays, and hit-testing follow th
Shorten the package description so pub.dev awards the full pubspec score.
Responsive shell and mobile editing chrome improvements, including compact tab switching, mobile header controls, bottom-sheet shell options, and clea
Full font selection for text boxes: a font menu (in the style popup and the properties panel) offers the standard families, a set of bundled full-Unic
PdfFontPicker for any .ttf/.otf file. The chosen
font embeds into the document so the text renders and prints
identically everywhere. PdfEditingController.activeFont/setCustomFont
drive new text; editing an embedded-font box keeps its font.PdfEditingController.rotatePages/rotateSelectedPages turn pages
clockwise (or counterclockwise) without shifting page indices, so the
page selection survives the edit.PdfEditTool.snapshot, in the Edit toolbar): drag a
region to capture it, Bluebeam-style. The captured region is rendered to
a PNG handed to PdfViewer.onSnapshot (copy/save/share) AND kept on the
controller as detached vector graphics. Paste it back into the PDF
with ⌘V/Ctrl+V or the right-click Paste (PdfEditingController. pasteSnapshot) and it stays vector, crisp at any zoom.PdfRenderWorker runs page interpretation and image decode in a
background isolate (native) or a dedicated Web Worker (web); set
pdfRenderWorkerScriptUrl and build the worker bundle with
dart run dart_pdf_editor:build_web_worker to enable it on the web. The
viewer also paints a low-res preview of pages still rendering during a
fast scroll, and cancels superseded prefetches.PdfReflowView.showImages (default true) toggles back to text-only.
The view now scrolls through a single non-lazy list so the scrollbar
no longer jumps as pages of differing heights (text vs. images) come
into view.PdfEditingToolbar.groups (and PdfEditorFeatures.toolGroups) takes a
set of PdfEditToolGroup values (Select, Markup, Draw, Shapes, Insert,
Measure, Edit). Pass a subset to hide whole tool types at once,
without enumerating each tool in tools.PdfEditor.addCheckMark.First stable release. Highlights since 0.1.0:
First stable release. Highlights since 0.1.0:
PdfEditingController.addBlankPage (sized to its
neighbour by default), insertPagesFrom/insertPagesFromBytes (merge
pages from another PDF), and exportPages/exportPageRange (split off a
standalone PDF). The thumbnail strip gained an "Add page" footer button
(shown when allowPageEditing), so PdfEditorView gets it out of the box.
PdfEditorView also exposes the other two in its header via
onPickPdfToInsert (host returns a PDF to merge after the current page)
and onExportPages (host saves the exported range); the range is chosen
with the new exported showPdfPageRangeDialog.PdfOcrEngine (a host-supplied recognizer such as ML Kit,
Tesseract WASM, a cloud API; none ships in-tree) plus
PdfEditor.applyOcr(pageIndex, engine), which rasterizes the page, runs
the engine, and injects an invisible selectable/searchable text layer.
PdfOcrPageImage.userSpaceRect maps the engine's pixel boxes back to PDF
user space (crop box and /Rotate aware).PdfViewport (a
resolution-independent scroll-position + zoom snapshot),
PdfViewerController.captureViewport/restoreViewport,
PdfViewer.initialViewport, and per-document persistence in
PdfEditingPreferences (viewportFor/setViewport). The PdfReader
and PdfEditorView shells remember and restore each document's
position automatically. Pass documentId for a stable key, or let it
derive one from the bytes (pdfDocumentKey).pdfEditToolShortcuts and surfaced in
the toolbar tooltips (e.g. "Rectangle (R)").Drop-in widgets: PdfEditorView (the full editor: header bar with search and panel toggles, all panels, the editing toolbar, save) and PdfReader (view-
Initial release.
PdfEditorView (the full editor: header bar with
search and panel toggles, all panels, the editing toolbar, save) and
PdfReader (view-only with search, page navigation, and a read-only
thumbnail strip), both theme-following and configurable via
PdfEditorFeatures/PdfReaderFeatures (features and tools toggle
off; styling via the Material theme and PdfViewerTheme).PdfViewer: zooming/panning viewer with text selection, search,
link navigation, page-fit modes, deep-zoom detail rendering,
low-res page previews under fast scrolling (PdfPagePreviewCache +
background prerender), theming (PdfViewerTheme), dark mode, and
custom page colors.PdfEditingController + tool overlays: highlight/ink (pressure +
Catmull-Rom smoothing)/shapes/free text/notes/stamps/signatures,
select/move/resize/rotate with live previews, slicing eraser,
clipboard, undo/redo as incremental saves.PdfMeasurementScale, showPdfScaleDialog, persisted in
preferences) and a live readout chip that rides the cursor for mouse
and floats above the finger for touch/stylus.PdfViewer.highlightFormFields, on by default)./F flags +
canEditAnnotation predicate) and a hide-all-annotations toggle.annotationChanges feed + applyRemoteChange for
collaborative annotation stores.Your coding agent can read these notes before it upgrades. Set up the MCP server →