NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #3147 most downloaded on pub.dev
Document-level PDF semantics: page tree, annotations, AcroForm filling, digital signatures, and an incremental-save editor. Pure Dart, web-ready.
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 42 of 43 stable releases
Nothing withdrawn
no release was ever pulled
3 months old
43 releases · first in 2026
One column per month.
Add DartPDF 7.0.0 AppStream release notes
Add DartPDF 7.0.0 AppStream release notes
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
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
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
removePage, movePage, insertBlankPage and
appendPagesFrom rebuilt the tree from that list on a cold page cache.
They now take the true leaf order.PdfDocument.pages once instead of calling page(i) for
every index, and a page(i) lookup caches the leaf siblings after the page
it finds, so a forward loop resolves each page about once. On a 3,000-page
file after an annotation edit, movePage goes from 720 to 2.4 ms and a form
fill from 718 to 0.8 ms.validate and validateOnline take
cores: (a PdfSignatureCoreResolver) that supplies a
PdfSignatureCryptoCore - digest, CMS/PKCS#1/RFC 3161 verification,
certificates, signing time - for the signature and every document
timestamp; PdfSignature.cryptoCore() computes one and
hasSignableByteRange says whether one can exist. A PAdES document
timestamp reuses its own row's validation instead of hashing again. The
problems and certificates lists of a validation are now unmodifiable,
since results are shared. With pdf_cos's P-521 fix, P-521 signatures
validate.PdfDocument.rollbackTo(length), wrapping CosDocument.rollbackTo and
dropping the page-tree caches.PdfDocument.openAppended accepts an earlier revision's prefix and takes a
password for a revision whose /Encrypt differs.PdfAcroForm.of takes an onFields hook, called once with the field list
the first time anything reads it.pdfFallbackDocumentId, the SHA-256 identity pdfPermanentDocumentId
falls back to for a file without a trailer /ID, so callers can take the free
/ID first and hash only when they need to.inflateZlib, so trailing
bytes after the zlib stream no longer empty them on the web.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
PdfFormFilling.setTextValue now truncates the value to the field's
/MaxLen (by code point), then re-runs the form's recognised AF* calculate
scripts in /CO order, rewriting the /V of calculated fields - read-only
totals included. Appearances apply recognised AF* formats, draw password
fields as asterisks and lay comb fields out one character per cell; /V
itself stays the raw value. Callers that compared a field's appearance text
to the value they set, or relied on calculated fields keeping a stale /V,
will see different results.flattenForm) now removes /AcroForm /XFA and the
catalog's /NeedsRendering through the new PdfEditor.removeXfa, so an
XFA-aware viewer reads the AcroForm values rather than stale XFA data. A
hybrid form's XFA packet no longer survives a fill.PdfSignature.validate() sets chainTrusted to false when revocation data
embedded in the document's /DSS says a certificate in the chain is revoked,
even without a trust store (unless a verified timestamp predates the
revocation). embeddedRevocation now requires the issuer to have verified
the signer and an OCSP response to match the full CertID, so some documents
that used to report embedded revocation data no longer do.PdfTrustStore.addCertificate and addDer gained an optional named
{String? source} parameter. Subclasses that override them must add it.Run the built-in Acrobat AF* helpers that most real forms use, without a
JavaScript engine (#930): AFSimple_Calculate and simplified field notation
(re-run in /CO order after every fill, or on demand with
PdfEditor.recalculateFields), AFNumber/AFPercent/AFDate/AFTime/
AFSpecial format and keystroke, and AFRange_Validate. The new
PdfEditor.enterTextValue is the user-entry path: it normalises a value
(1.234,50 in a comma-decimal field stores 1234.50) or throws
PdfFieldInputException with the helper's message. setTextValue stays the
unchecked programmatic setter. Arbitrary scripts never run; they are
reported, with a reason, on PdfFormField.scripts.
Honour comb fields, /MaxLen and password masking (#931).
PdfFormField.maxLength reads the inheritable /MaxLen and isComb the comb
flag (with the new fileSelectFlag/combFlag constants).
PdfFormFilling.setPasswordValue keeps a password out of the file (ISO
32000 12.7.4.3): it removes /V, draws a fixed-length mask so the file does
not reveal the length, and writes a trailer /ID when the file has none.
pdfPermanentDocumentId / pdfTrailerPermanentId return the identity such
a value is filed under.
Detect XFA forms (#929): PdfAcroForm.hasXfa, xfaNeedsRendering and
isDynamicXfa.
Sign encrypted (password-protected) PDFs (#935). Every signing path used to
refuse them; the signature's /Contents is now written unencrypted and
patched after the rest of the revision is encrypted, and validate() reads
the raw CMS, which also fixes validating encrypted files signed by other
tools. PAdES B-LT/B-LTA and addDocumentTimestamp reopen their intermediate
revisions with the new PdfDocument.openAppended, which reuses the
authenticated keys instead of the password. pyHanko validates the encrypted
B-LTA output for RC4-40/128, AES-128 and AES-256.
Add form tab order (#932): PdfFormTabOrder, PdfTabOrder and
PdfPage.tabOrder follow each page's /Tabs (row, column or structure
order), fall back to /Annots order, and skip read-only, hidden, push-button
and signature fields.
fetchAatl downloads Adobe's Approved Trust List through a host
transport, verifies it chains to Adobe Root CA G2 and was signed within a
year (PdfAatl.maxAge), and returns a PEM-serializable snapshot.
PdfTrustStore.sourceOf names the list an anchor came from.
Check signer-chain revocation. validate() now reports a verdict for the
signer and each intermediate from the document's /DSS
(PdfSignatureValidation.revocation, revocationStatus), and the new
validateOnline(revocationClient:) adds live OCSP-then-CRL checks through
the injected PdfRevocationClient. A revoked certificate makes the chain
untrusted unless a verified timestamp predates the revocation.
pdfOnlineRevocationClient turns a host HTTP function into a client.
Add package:pdf_document/trust_lists.dart, opt-in trust anchors with no
bundled data: fetch and XML-signature-verify the EU trusted lists
(fetchEuTrustedLists, PdfTrustLists.eutl), or load an Adobe Approved
Trust List file you supply (parseAatlSecuritySettings).
tool/refresh_trust_lists.dart writes verified PEM snapshots.
Fill multi-select list boxes (#933). PdfFormField gains isMultiSelect
(/Ff bit 22), values (a /V string or array as a list; value still
returns the first entry), selectedIndices (/I, falling back to /V when /I
is missing or stale) and topIndex (/TI). PdfEditor.setChoiceValues
writes /V as an array of export values in option order (a plain string for
exactly one, removed for none), /I as sorted indices, and scrolls /TI to the
first selection. List-box appearances now draw every option row with the
selected rows highlighted, for single-select list boxes too, instead of
showing only the chosen value.
Author every AcroForm field type, not only text, check box and push
button (#934). PdfFormAdmin gains addRadioGroup (one parent field, a
kid widget per on-state with generated /AP /N and /D states) and
addRadioButton to grow a group later, addComboBoxField /
addListBoxField (/Opt as export/display pairs, Edit and MultiSelect
flags) plus setChoiceOptions, and addSignatureField - an unsigned
/FT /Sig widget (with /SigFlags 1) that saveSigned(fieldName:) and the
PAdES/self-signed paths fill later. changeFieldType now converts to all
of them, carrying options between choice kinds and on-states into radio
groups and choice options; it refuses to retype a signed signature.
Authored choice fields are drawn by the same renderer filling uses, so a
new list box shows every option row (selection highlighted) and a combo
box its value. PdfFormField gains the noToggleToOffFlag constant.
Stop the visible signature box clipping its detail lines. On a short, wide "sign on this line" placement the top of the first line and the bottom of the last were sliced off: the box's flat 4pt inner margin took over 40% of a ~20pt-tall box, the auto-fit loop gave up at a hard 4pt floor while the text block was still taller than the room left, and centring that overflow ran it past the clip at both ends at once. The margin is now proportional on small boxes (never more than a tenth of the shorter side), the loop shrinks to 2pt before giving up, and a block that still overflows is top-anchored so the clip can only take the tail. A signature graphic also gets the reclaimed room, so it no longer floats small in a short box.
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
PdfStandardFont widths stopped at code 126 and every emitter wrote
/LastChar 126, so accented text in signature boxes, free-text appearances
and the OCR text layer laid out with the wrong advances or stacked./DocMDP /P 1 (no changes
permitted): saveSigned, saveSignedEcdsa, saveSignedExternal and the
PAdES paths throw CertifiedNoChangesException instead of producing a file
every viewer reports as tampered with. /P 2 and /P 3 and document
timestamps are unaffected.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
PdfFormField
carries the alignment, form_editor regenerates appearances with it, and it
survives a round trip through the document.Add 4.3.0 Linux release metadata
Add 4.3.0 Linux release metadata
PdfVectorSnapshot.toPdfBytes and fromPdfBytes for detached, single-page
PDF interchange with embedded resources and baked page rotation.PdfCompressor.optimize and expand PdfEditor.compress with independent
lossless cleanup, resource deduplication, TrueType/CFF font subsetting, and
opt-in DPI/JPEG image optimisation. Include presets and exact per-pass size
reports; preserve unsupported content and never return a larger file.PdfMerger.merge for bytes-only merging with per-input passwords.PdfSplitter.split, splitRange, and splitExpression for bytes-only
PDF splitting, with validated PdfPageRange batches and one-based range
parsing. PdfDocument.extractPageRanges reuses an already-open document.populatedRanges in PdfDocument.open so copied progressive buffers
keep treating unfetched objects as missing.Release pdf_document 4.2.0
Release pdf_document 4.2.0
PdfAnnotation.appearanceRotation, the rotation an annotation's normal
appearance carries in page space. This is the annotation's own rotation, so
unlike a view-space measurement it is unaffected by the page's display
/Rotate.Release pdf_document 4.1.0
Release pdf_document 4.1.0
archive to 4.2.0.Release pdf_document 4.0.0
Release pdf_document 4.0.0
flattenAnnotations to target a supplied annotation selection and
expose embedded-font descent metrics for accurate free-text box fitting.pdf_document public API changes in this release are additive.Release pdf_document 3.8.0
Release pdf_document 3.8.0
PdfDocument.pages view and keep document caches
coherent through CosDocument.revision.PdfEditImpact.pageOrderOnly and reconcile page-order-only incremental
edits without rebuilding unchanged page objects.Add SimpleFont, the simple-font counterpart to Type0Font: one place that resolves a character code to text the way the renderer does (/ToUnicode, /Enc
SimpleFont, the simple-font counterpart to Type0Font: one place that
resolves a character code to text the way the renderer does (/ToUnicode,
/Encoding /Differences, the built-in Symbol and ZapfDingbats encodings,
then the base encoding), plus the reverse table for re-encoding replacements
and the /Widths lookup.PdfPageElements
decoded a simple font's show string as Latin-1, so a subsetted font reported
text such as -=>-/>?-?@ for a page reading 05/08/2026, and replacements
were written back as raw code units. Element text, both run codecs, the '
and " operators, and paragraph reflow now all go through the font's own
encoding./Differences, or a /ToUnicode entry - so a
subset that dropped a character declines the edit instead of drawing notdef.
Decoding keeps its lenient Latin-1 fallback. A named base encoding declares
printable ASCII (0x20-0x7E) per Annex D.pdf_graphics to
src/fonts/encodings.dart and export them, so the content editor and the
font engine share one copy.Read Bluebeam FreeText paragraph styling from /DS and rich-text /RC when standard PDF entries are absent, preserving alignment, leading, character spa
/DS and rich-text /RC when
standard PDF entries are absent, preserving alignment, leading, character
spacing, horizontal scale, and underline when editing or regenerating an
appearance.Lockstep patch release for the scanned-page rendering fixes in pdf_cos, pdf_graphics, and dart_pdf_editor. No public document API changes.
pdf_cos,
pdf_graphics, and dart_pdf_editor. No public document API changes.Let PdfDocument.openSource expose its requested first-paint page count as a temporary page-count hint when the source deliberately omits the rest of t
PdfDocument.openSource expose its requested first-paint page count as a
temporary page-count hint when the source deliberately omits the rest of the
page-tree walk. The full document opened during progressive handoff remains
authoritative, while sparse page-one previews avoid recovery-scanning every
intentionally absent leaf reference.Preserve the unresolved vector template on authored stamp annotations and expose it through PdfAnnotation.stampTemplate, allowing a placed stamp to re
PdfAnnotation.stampTemplate, allowing a placed stamp to
return to a reusable collection without losing dynamic fields (#651).Fix annotation property edits duplicating the annotation when a page stores its /Annots array indirectly (#638).
/Annots array indirectly (#638).Add lightweight diagnostics to PdfDiskCache for hits, misses, writes, oversize rejections, evictions, and byte totals, with resetStats() and a one-lin
PdfDiskCache for hits, misses, writes,
oversize rejections, evictions, and byte totals, with resetStats() and a
one-line debugStats summary. Manifest writes are coalesced across bursts so
persistent page-raster caches do not rewrite an O(n) manifest for every
entry (#615).Improve FreeText callout interoperability: recognize third-party callouts from their /CL geometry when /IT is missing or private, and clamp malformed
/CL geometry when /IT is missing or private, and clamp
malformed or negative /RD insets to a usable callout text box (#621).Lockstep patch release to align the dart-pdf package suite at 3.1.1. No public pdf_document API changes since 3.1.0.
pdf_document API changes since 3.1.0.Add PdfEditor.compress()/PdfCompressionResult: lossless file-size compaction on save. A whole-graph reachability pass drops the dead objects increment
PdfEditor.compress()/PdfCompressionResult: lossless file-size
compaction on save. A whole-graph reachability pass drops the dead objects
incremental edits accumulate, non-stream objects pack into object streams,
and uncompressed streams are re-deflated (kept only when smaller). Never
returns a larger file, includes pending edits, and refuses encrypted
documents. Decoded stream content is preserved bit-for-bit (#368).addLinkToUri / addLinkToDestination /
addLinkToPage, mirroring the text-markup creators' quad shape so a text
selection turns into a link. /Rect bounds the quads, each quad becomes an
active /QuadPoints region, /Border is suppressed by default, and an
underline or border decoration bakes an /AP (#500).PdfAnnotation.imageStampCrop; opacity restyles and
resizes preserve the crop (#504).PdfAnnotation.isPrint (§12.5.3 print-vs-screen visibility) (#546).Lockstep major release (a breaking change in dart_pdf_editor moves the whole suite to 3.0.0). pdf_document's own public API is additive.
Lockstep major release (a breaking change in dart_pdf_editor moves the whole
suite to 3.0.0). pdf_document's own public API is additive.
PdfEditor.saveSignedExternal: delegates the RSA operation to a
PdfExternalSigner callback so the private key can stay in a hardware keystore
(Android KeyStore, iOS Keychain). PdfSignatureAppearance gains overridable
signedByLabel/dateLabel/reasonLabel/locationLabel, and the visible /M
and signature-box date now preserve a non-UTC signingTime's offset (UTC
input unchanged) (#507).Cache PdfPage instances instead of rebuilding them per access, resolving inherited attributes live: a page holds only ancestor-derived values and read
PdfPage instances instead of rebuilding them per access, resolving
inherited attributes live: a page holds only ancestor-derived values and
reads its own /Rotate, /MediaBox, /CropBox, and /Resources from the
dictionary, so the cache cannot serve a stale value after an edit (#418).pageIndexOf in O(1) through an identity map rather than walking the
page tree (#397)./Widths lookup out of the per-glyph loop (#406).CosUpdater.saveTail()), so an
incremental revision costs the size of the change (#413).Major version bump for the 2.0.0 package suite (breaking change in dart_pdf_editor; the document API is source-compatible with 1.4.7).
dart_pdf_editor; the document API is source-compatible with 1.4.7).PdfByteSource so a remote or large
local PDF can be rendered progressively as bytes arrive, rather than after
the whole file is in memory (#328).PdfSigningIdentity.generate
(P-256 keygen + X.509 v3 self-signed cert) with toPem/fromPem
persistence, PdfEditor.saveSelfSigned / saveSignedEcdsa /
saveSelfSignedPades (ECDSA CMS), a default TSA
(PdfDefaultTimestampAuthority) for trusted B-T time, and org-CA mode
(PdfSigningIdentity.generateCa + ca.issue(...)) so members chain to a
shared CA (#337).fulcioSigningIdentity mints an
ephemeral P-256 key, proves possession, requests a short-lived certificate
from a Fulcio v2 authority (transport injected like the TSA), and wraps the
chain in a PdfSigningIdentity to sign B-T (#322, #355).Type0Font module and one shared TextRunRewriter, and route
text-box appearance generation through a single shared builder.Add a visible signature box for saveSigned/saveSignedPades: PdfSignatureAppearance describes the widget's page/rect, optional handwritten-signature or
saveSigned/saveSignedPades:
PdfSignatureAppearance describes the widget's page/rect, optional
handwritten-signature or logo graphic, detail-line show flags, and
background/border/text colours, rendered into the /AP /N form
(name or graphic on the left, "Digitally signed by / Date / Reason /
Location" auto-sized on the right). Output is byte-identical when no box
is requested; document timestamps never get an appearance (#298).ContentWriter.roundedRect
bakes the radius into the /AP, persisted in /Border (§12.5.4) so it
survives resize; restyleAnnotation(cornerRadius:) rounds or re-squares
a placed rectangle in place (#297).PdfAnnotation.cloudBorderScale) and
restyleAnnotation(cloudScale:) reproduces it across restyle and
reshape; a cloud's /Rect is re-derived from the padded footprint so
growing scallops no longer clip (#300).PdfVectorSnapshotEditing gains
isVectorSnapshotStamp and recolorVectorSnapshot, which forces every
fill/stroke colour operator in the captured Form XObject to a target ink
(recursing into nested forms, forking a private /Cap copy so other
pastes keep their colours) while leaving geometry and images untouched;
paste marks the stamp (DartPdfVectorSnapshot) (#301)./RC.Add operation-scoped page-content text replacement and expose the active font resource on text element snapshots for selection-driven editing.
Version bump to keep the dart-pdf package suite aligned at 1.4.5. No document API changes since 1.4.4.
Version bump to keep the dart-pdf package suite aligned at 1.4.4. No document API changes since 1.4.3.
Add PdfBlankDocument.create for building standalone PDFs with one or more empty pages in a chosen standard or custom page size.
PdfBlankDocument.create for building standalone PDFs with one or more
empty pages in a chosen standard or custom page size.Version bump to keep the dart-pdf package suite aligned at 1.4.2. No document API changes since 1.4.1.
Add callout annotation authoring and editing, and correct cloudy polygon geometry and appearance generation.
Add document color-processing APIs that discover paint colors, replace multiple source colors in one pass, support page ranges, tolerance, and transpa
Add vector stamp templates (PdfStampTemplate and PdfStampTemplateComponent) with text, shapes, images, and saved-signature components. PdfEditor.addTe
PdfStampTemplate and
PdfStampTemplateComponent) with text, shapes, images, and saved-signature
components. PdfEditor.addTemplateStamp writes them as normal stamp
annotations with generated appearance streams.stampType and stampTags) and
resolve dynamic {{field}} placeholders at placement time.Annotation editing now handles malformed or indirect page /Annots entries consistently when adding, removing, reordering, flattening, signing, form ed
/Annots entries
consistently when adding, removing, reordering, flattening, signing, form
editing, redacting, and pasting annotations. Invalid indirect /Annots
values are left untouched and replaced by a valid page-owned array.Nothing published for this version
Free-text annotations carry a horizontal alignment (left/center/right) through the /Q quadding: addFreeText and addFreeTextRich take an align argument
/Q quadding: addFreeText and addFreeTextRich take an
align argument, PdfFreeTextStyle.alignment reads it back, and resizing
or re-editing a box preserves it. Omitting align keeps the previous
behaviour - left for LTR text, right for RTL.(lineWidth + 2*pad) - 2*pad.Embeddable fonts: PdfEmbeddedFont.parse reads a TrueType (.ttf) or OpenType (.otf) file and addFreeText can now author text in it, embedding the font
PdfEmbeddedFont.parse reads a TrueType (.ttf) or
OpenType (.otf) file and addFreeText can now author text in it,
embedding the font as a full-Unicode Type0/CIDFontType2 (Identity-H)
composite with a /ToUnicode CMap - so authored text can use any font,
not just the base-14 faces, and stays selectable, searchable, and
portable. PdfEmbeddedFont.fromFreeText recovers the font from a box's
own appearance for lossless re-editing.?? in free-text annotation
appearances.Add a package example for pub.dev scoring.
OCR text-layer injection is now used by the standalone app's downloadable on-device OCR flow.
Page rotation: PdfEditor.rotatePages(indices, degrees) turns the named pages clockwise by a multiple of 90° (negative for counterclockwise), accumulat
PdfEditor.rotatePages(indices, degrees) turns the named
pages clockwise by a multiple of 90° (negative for counterclockwise),
accumulating onto each page's current /Rotate.PdfEditor.captureVectorSnapshot captures a page
region as detached vector graphics (PdfVectorSnapshot) and
pasteVectorSnapshot re-materializes it onto any page as a /Stamp
annotation whose appearance draws the captured content, so a snapshot
pasted back into the PDF stays vector (crisp at any zoom), Bluebeam-style.PdfEditor.addCheckMark places a Bluebeam-style check-mark
stamp annotation (with PdfAnnotation.isCheckMark/iconName). It is the
building block for a running on-page tally.First stable release. Changes since 0.1.0:
First stable release. Changes since 0.1.0:
PdfMeasure/PdfNumberFormat, scale
calibration (setMeasurementScale), and addMeasurement for
distance/perimeter/area with a /Measure dictionary and a baked-in
formatted caption./Redact regions and burn the underlying content
irreversibly.PdfEditor.addImageStamp places a PNG/JPEG as a stamp
annotation; dashed (/D) stroke patterns for all shape subtypes; and
annotation flip when a resize handle is dragged past the zero point.resizeFormWidget rewrites a field's /Rect and
regenerates its appearance at the new size.PdfEditor.insertBlankPage adds a new empty page at any
position (sized to request, default US Letter), and
PdfDocument.extractPageRange exports a contiguous span of pages as a
standalone PDF alongside the existing appendPagesFrom (insert pages
from another document) and extractPages (arbitrary subset).PdfEditor.injectTextLayer writes recognized
PdfOcrSpans onto a page as invisible (render mode 3) text, sized and
horizontally scaled to sit over each word. A scanned, image-only page
becomes selectable, searchable, and extractable without changing how it
looks. applyOcr (with a pluggable engine) lives in dart_pdf_editor.PdfImageDocument: assemble a brand-new PDF from a list of PNG/JPEG
images, one page per image. This is the pure-Dart half of image/Office
ingestion (multi-page TIFF, scans, camera shots).PdfImportSource: a host-provided seam for converting foreign formats
(DOCX/XLSX/PPTX, …) to PDF bytes. Interface only; dart-pdf does not
implement OOXML→PDF layout.PdfDocument: page tree with inherited attributes, metadata, outlines, text-page lookup.
Initial release.
PdfDocument: page tree with inherited attributes, metadata, outlines,
text-page lookup.PdfEditor: incremental-save editing. Annotation authoring (highlight,
ink with pressure, shapes, free text, notes, stamps), flattening,
page manipulation (reorder, remove, append across documents, extract),
content stamping/deletion/text replacement.PdfMeasure/PdfNumberFormat (parse/emit/format),
scale calibration (setMeasurementScale), and addMeasurement for
distance/perimeter/area annotations with a /Measure dictionary, a
formatted /Contents, and a caption baked into the appearance
(PdfAnnotation.measure/measurementText).PdfSignature.validate() with optional trust-store
chain validation, and signing via saveSigned.Your coding agent can read these notes before it upgrades. Set up the MCP server →