Skip to content

Release v3.2.0

Latest

Choose a tag to compare

@github-actions github-actions released this 11 Nov 23:25
e074ee8

@cloudpdf/contract@3.2.0

Minor Changes

  • #1071 by @bobsingor – The contract has the change op annotations.copy (refs, page, offset, objectNumbers) and its result item (annotations, refMap, dropped, meta). openapi.json describes both.

  • #1075 by @bobsingor – The contract has the change op forms.copy (fields, widgets, page, offset, values, objectNumbers) and its result item (fields, widgets, refMap, dropped, calculationOrder, meta). openapi.json describes both.

@cloudpdf/engine@3.2.0

Minor Changes

  • #1071 by @bobsingor – The cloud engine has doc.annotations.copy(refs, { page?, offset?, objectNumbers? }), and doc.apply takes the op annotations.copy. The copies are made on the server in one request, so nothing is downloaded. Against a server older than 3.2 the change is refused with NotImplemented before anything is sent.

  • #1056 by @bobsingor – The cloud engine works with a server that is older or newer than it for change kinds. A change with a kind of op the server doesn't have yet is refused on its own, before anything is sent, with NotImplemented; its details name the op (kind), the version that has it (needs) and the server's (serverVersion). The changes called beside it still go out. A change from another session of a kind this version doesn't know now reads as stream.desynced with reason: 'unknown-change', so everything is read again; before, it became an event without a type and reads stayed stale.

  • #1075 by @bobsingor – The cloud engine has doc.forms.copy(fields, { page?, offset?, values?, widgets?, objectNumbers? }), and doc.apply takes the op forms.copy. The copies are made on the server in one request. Against a server older than 3.2 the change is refused with NotImplemented before anything is sent.

@cloudpdf/sdk@3.2.0

Minor Changes

  • #1071 by @bobsingor – The SDK has the change op annotations.copy and its result item: ChangeOp.AnnotationsCopy and ChangeItem.AnnotationsCopy.

  • #1075 by @bobsingor – The SDK has the change op forms.copy and its result item: ChangeOp.FormsCopy and ChangeItem.FormsCopy.

@cloudpdf/server@3.2.0

Minor Changes

  • #1071 by @bobsingor – POST …/changes takes the new op annotations.copy: copies of annotations in the same document, with a stamp's drawing and an attachment's file copied on the server. It needs doc.annotate.read and the right to create each kind, not doc.download. A ref the document doesn't have refuses the change with NotFound. On the event stream, a client that says a version before 3.2 gets full-refresh in place of a change with this op. A copy stays within the server's bundleLimits: past one, its change is refused with PayloadTooLarge, and details.limit names the limit.

  • #1056 by @bobsingor – The event stream answers each client as its version reads. A change with a kind that arrived after the client's EmbedPDF-Version goes out as full-refresh in the row's place, and the stream carries on with the rows after it; a full-refresh now says why in its data (reason). An op of POST …/changes with a field the server doesn't know refuses the request with InvalidArg, naming the field, where the field used to be dropped and the op applied without it. An item of a kind the server doesn't know is withheld from a connection that may not read everything.

  • #1075 by @bobsingor – POST …/changes takes the new op forms.copy: a new field from each field named, with its widgets, made on the server. It needs doc.forms.modify, and doc.forms.script to keep scripts, submits and links. A field the form doesn't have refuses the change with NotFound. On the event stream, a client that says a version before 3.2 gets full-refresh in place of a change with this op. A copy stays within the server's bundleLimits: more fields than items refuses its change with PayloadTooLarge.

@embedpdf/core-annotation@3.2.0

Minor Changes

  • #1071 by @bobsingor – New isMovable(record): whether an annotation is one people move at all. Its kind moves, and it isn't bound to text, as a highlight or a redaction of words is. canMove(model, id) uses it, and adds the lock, the session's rights and its editable rule.

@embedpdf/core@3.2.0

Minor Changes

  • #1054 by @bobsingor – A plugin can stage a change that one of the engine's own verbs makes, such as an import: ctx.changes.stage({ label, send }). The queue calls send(doc, { opId }) when it sends the change, so the verb keeps its place among the other changes, and the history records it as one step. opId names the change when the caller of the verb chose an id, and history: false keeps it out of the history. The new HistoryOptions type is the history?: false option a verb takes from its caller.

Patch Changes

  • #1056 by @bobsingor – The page list is read again when the event stream skipped events (stream.desynced). A page inserted or deleted by someone else while a viewer was too far behind used to show only after the document was opened again.

@embedpdf/engine-core@3.2.0

Minor Changes

  • #1071 by @bobsingor – New change op annotations.copy, and doc.annotations.copy(refs, { page?, offset?, objectNumbers? }) for it: copies of annotations inside one document, made as one change that one undo takes away. A copy carries every field of its kind, locked included, and a stamp's drawing or an attachment's file, so doc.download isn't needed. It gets its own ref and a fresh nm, and the session is its author. Links between copies stay: a reply to an annotation that is copied too replies to that one's copy, so a copied group is a group of its own. The result holds the copies, refMap and dropped, with the reasons an import uses. planAnnotationCopies(sources, placement) is the rule itself, without zod, for a viewer that shows the copies before the engine answers. The op arrived in 3.2 (CHANGE_KIND_SINCE), so an older server is never sent it and an older client reads everything again. runAnnotationCopyConformance checks an engine against it. A copy stays within the bundle limits (items, resources, resourceBytes and bundleBytes); past one it is refused with PayloadTooLarge, and details.limit names the limit.

  • #1056 by @bobsingor – Every kind of change op and result item says the version it arrived in, so a client and a server of different versions can tell which kinds the other has. CHANGE_KIND_SINCE lists the kinds that arrived after 3.0 (pages.setScale in 3.1), changeKindsUnknownTo(version, kinds) names the kinds a side of that version lacks, and lacksWhatArrivedIn(version, since) makes the comparison for anything else that arrived in a version. stream.desynced has a second reason, 'unknown-change': a change of a kind this version doesn't know arrived. Each op of a POST …/changes request is now strict about its own fields: an op with a field the schema doesn't name is refused, where the field used to be dropped.

  • #1075 by @bobsingor – New change op forms.copy, and doc.forms.copy(fields, { page?, offset?, values?, widgets?, objectNumbers? }) for it: a new field from each field named, made as one change that one undo takes away. A copy has its source's settings, scripts and default value, and each widget's place, look, flags and actions, moved by offset or put on page. It is named after its source with the next free number (email becomes email_2, billing.name becomes billing.name_2), and it has its source's value unless values is false; a signature never comes along. widgets names the widgets to copy when it isn't all of them. The result holds the new fields, their widgets, refMap and dropped, with the reasons a form import uses, and its events are one forms.created per field. planFormCopies is the rule itself, without zod, for a viewer that shows the copies before the engine answers; copyNameOf and fieldNameTaken name a copy. The op arrived in 3.2 (CHANGE_KIND_SINCE), so an older server is never sent it and an older client reads everything again. runFormCopyConformance checks an engine against it. A form import and a copy now also carry a widget's check style and its dash pattern. fields names at most as many fields as the bundle limits' items; more is refused with PayloadTooLarge, and details.limit names the limit.

  • #1049 by @bobsingor – An annotation update can change nm. A new name renames the annotation in place, and nm: null removes its name. A new name must be free on its page, checked against the page as the change's earlier ops left it; an undo puts back the name the annotation had. The conformance suites check renames, and runChangeConformance's open option takes the PDF to open, such as NAMES_FIXTURE_PDF, a file with missing and shared names.

@embedpdf/engine@3.2.0

Minor Changes

  • #1071 by @bobsingor – The local engine has doc.annotations.copy(refs, { page?, offset?, objectNumbers? }): copies of annotations in the same document, as one change that one undo takes away. In a change of your own it is the op annotations.copy.

  • #1075 by @bobsingor – The local engine has doc.forms.copy(fields, { page?, offset?, values?, widgets?, objectNumbers? }): a new field from each field named, as one change that one undo takes away. In a change of your own it is the op forms.copy.

@embedpdf/engine-services@3.2.0

Minor Changes

  • #1071 by @bobsingor – The worker applies the new op annotations.copy. It reads each named annotation, creates the copies as one change, all or nothing, and records the reverse, so an undo deletes them. A copied stamp places the drawing its original places, so the document gets no second drawing, and a copied attachment gets the same file bytes with its dates. Every create is checked before the first write: the session needs doc.annotate.read and the right to create each kind. A copy carries what a bundle may: as many annotations, and as many drawings and files, of that size each and together. A drawing counts once however many copies place it. Past a limit the copy is refused with PayloadTooLarge before anything is written. document.applyChanges takes the deployment's limits; without them the defaults apply.

  • #1075 by @bobsingor – The worker applies the new op forms.copy. It reads the form, plans the copies before the first write, and creates each new field as a design import creates one: with its widgets, their flags, its value when asked, and its place in the calculation order. Its reverse deletes the fields it made, the last first. It needs doc.forms.modify; a script, a submit or a link is left out and reported without doc.forms.script. A copy names at most as many fields as the bundle limits' items; more is refused with PayloadTooLarge before the form is read.

  • #1049 by @bobsingor – annotations.update and forms.updateWidget write a new nm to the annotation's own /NM, or remove it for null. The object, its replies, its appearance and its other keys stay as they are. A name another annotation on the page has is refused with InvalidArg. An empty name removes /NM, as a create given one writes none.

@embedpdf/angular@3.2.0

Minor Changes

  • #1071 by @bobsingor – EpdfAnnotation has duplicate(refs, options), canDuplicate(refs), isMovable(ref), selection.duplicate(options) and selection.canDuplicate().

  • #1075 by @bobsingor – EpdfForm has duplicate(fields, options) and duplicateWidgets(widgets, options).

Patch Changes

  • #1074 by @bobsingor – <epdf-form-layer> draws a field's picture where the field is now. A field that was moved, in Form design or with updateWidget(), kept its picture at the old place until the page's pictures were loaded again: the field showed in one place and took clicks in another.

@embedpdf/web@3.2.0

Minor Changes

  • #1051 by @bobsingor – The Stage's wheel handling asks the Stage whether a wheel is its own, through the host's new wheelBy, and cancels only the wheels the Stage takes. A wheel the Stage leaves alone reaches the browser, which scrolls the page around the viewer with it. A zoom wheel (Ctrl or Cmd) is always cancelled. A wheel event that isn't cancelable is ignored: the browser is already scrolling the page with it. A test that sends its own wheel events needs cancelable: true on them.

@embedpdf/plugin-annotation@3.2.0

Minor Changes

  • #1071 by @bobsingor – New duplicate(refs, { page?, offset?, select? }) copies annotations in the same document. The copies show at once, it is one step to undo, labelled annotation.duplicate, and it resolves { annotations, dropped }. A stamp keeps its drawing and an attachment its file, with nothing to download, and an annotation keeps its link. selection.duplicate({ offset? }) copies the selection 10 points right and down, or left or up near the page's edge, and selects the copies. canDuplicate(refs) and selection.canDuplicate() are false without the right to create and for a locked annotation, whose copy would be locked too; code can still copy one. isMovable(ref) says whether an annotation is one people move: false for one that sits on text, such as a highlight. Past the engine's bundle limits (10,000 annotations by default) duplicate() is refused with invalid-input, and nothing is copied.

  • #1075 by @bobsingor – selection.duplicate() copies a form's widgets too, in design mode: their owner says how (a radio button's copy joins its group, any other widget's is a new field), and the copies are made in the same change as the annotations', so a selection of both is one step to undo. selection.canDuplicate() asks the owner for them. duplicate(refs) still refuses a widget. For a plugin that lends records (AnnotationLender): copyOps(refs, placement) gives the ops that copy its records, and getAuthority() also says copy.

  • #1054 by @bobsingor – import() is now one step to undo: an undo takes away every annotation the import added, and a redo brings them back under the same refs. It is sent after the changes staged before it, typed text included. An app that imports by itself, such as loading stored annotations when a document opens, passes history: false to keep the import out of undo and redo: annotation.import(bundle, { history: false }).

@embedpdf/plugin-form@3.2.0

Minor Changes

  • #1075 by @bobsingor – New duplicate(fields, { page?, offset?, values? }) copies whole fields: each copy is a new field named after its original (email_2), with its settings, scripts and widgets, and no answer unless values is true. New duplicateWidgets(widgets, options) copies widgets as Duplicate does in a form designer: a radio button's copy is another button of its group, with the next free Choice<n>, and any other widget's copy is a new field; widgets of one field copied together become one new field. Both show their copies at once, are one step to undo, and resolve { fields, widgets, dropped }. In design mode the annotation plugin's selection.duplicate() copies the selected widgets through this plugin. addWidget() now shows its new widget before the engine answers. getSelectedField() is also the field when several of its widgets are selected, such as a radio group's buttons. Past the engine's item limit (10,000 fields by default) the call is refused with invalid-input, and nothing is copied.

  • #1054 by @bobsingor – import() is now one step to undo: an undo takes away the fields the import added, and a redo brings them back. An app that adds fields by itself passes history: false to keep the import out of undo and redo: form.import(bundle, { history: false }).

@embedpdf/plugin-stage@3.2.0

Minor Changes

  • #1051 by @bobsingor – A wheel or trackpad scroll over the Stage no longer gets stuck at the end of the pages. A scroll that begins where the pages can't scroll any further the way it pushes now scrolls the page around the viewer, as it does at the end of any scrolling element. A scroll that reaches the end stops there, momentum included, and the next one scrolls the page. On a trackpad the next swipe is the next one, also while the last still coasts. In paged flow a push past the edge still turns the page while there is one to turn to, and on a trackpad every swipe now turns one: a swipe that began while the last one still coasted turned nothing. The new scrollChaining setting is on by default. Set it to false in an app where the viewer fills the window, and the Stage keeps every wheel over it, as before: a sideways swipe the pages can't follow then never reaches the browser's back gesture.

@embedpdf/viewer-chrome@3.2.0

Minor Changes

  • #1071 by @bobsingor – New command annotation:duplicate, with Ctrl/Cmd+D and a button in the bar over a selection. It copies the selected annotations beside the originals and selects the copies, as one step to undo. The button shows for annotations people move, so not for a highlight, and is greyed out while a locked annotation is selected. New icon duplicate and label commands.annotate.duplicate, in all 15 languages.

  • #1075 by @bobsingor – Duplicate (annotation:duplicate, Ctrl/Cmd+D) now copies form fields in Form design: a radio button's copy joins its group as a new choice, and any other field's copy is a new field named after the original. The form design sidebar has Duplicate group for a radio group, which copies the whole group as a new one. New label formDesign.duplicateGroup, in all 15 languages.

Patch Changes

  • #1069 by @TbhVishal – A comment and a reply show their time as well as their day, with the year once it isn't this year's, and the whole date and time in a tooltip. Dates, times and file sizes are written in the language the viewer shows, the way the reader's region writes them: an English viewer reads 14 Sept, 17:30 in a British browser and Sep 14, 5:30 PM in an American one, and a locale that names a region, such as 'en-GB', writes them that way for everyone. A language whose code the browser can't read is written in the browser's own formats.

@embedpdf/default-fallback-fonts@1.0.1

Patch Changes

  • #1070 by @bobsingor – The package's page on npm says what the fonts are and which packages bring them, with the fonts' license notice under it. The notice is a file of the package too, NOTICE.md.

@embedpdf/default-signature-fonts@1.0.1

Patch Changes

  • #1070 by @bobsingor – The package's page on npm shows how to give the three fonts to the stamp plugin, with the fonts' license notice under it. The notice is a file of the package too, NOTICE.md.

@embedpdf/react@3.2.0

Patch Changes

  • #1074 by @bobsingor – <FormLayer> draws a field's picture where the field is now. A field that was moved, in Form design or with updateWidget(), kept its picture at the old place until the page's pictures were loaded again: the field showed in one place and took clicks in another.

@embedpdf/svelte@3.2.0

Patch Changes

  • #1074 by @bobsingor – <FormLayer> draws a field's picture where the field is now. A field that was moved, in Form design or with updateWidget(), kept its picture at the old place until the page's pictures were loaded again: the field showed in one place and took clicks in another.

  • #1073 by @bobsingor – Opening another document while one is shown in a <Stage>, or closing the shown one, no longer throws Cannot read properties of null (reading 'getLensId') (in Safari, null is not an object (evaluating '$$props.stage.getLensId')) and leaves the Stage blank. A page stays readable until its layers are gone: a layer that reads usePage() in a cleanup gets the page as it last was.

@embedpdf/vue@3.2.0

Patch Changes

  • #1074 by @bobsingor – <FormLayer> draws a field's picture where the field is now. A field that was moved, in Form design or with updateWidget(), kept its picture at the old place until the page's pictures were loaded again: the field showed in one place and took clicks in another.

@cloudpdf/web@3.2.0

@cloudpdf/plugin-protected-display@3.2.0

@cloudpdf/server-modules@3.2.0

@cloudpdf/viewer-angular@3.2.0

@cloudpdf/viewer@3.2.0

@cloudpdf/viewer-react@3.2.0

@cloudpdf/viewer-svelte@3.2.0

@cloudpdf/viewer-vue@3.2.0

@embedpdf/core-acrojs@3.2.0

@embedpdf/core-fonts@3.2.0

@embedpdf/core-form@3.2.0

@embedpdf/core-geometry@3.2.0

@embedpdf/core-js-sandbox@3.2.0

@embedpdf/core-signature@3.2.0

@embedpdf/core-stage@3.2.0

@embedpdf/core-text@3.2.0

@embedpdf/core-ui@3.2.0

@embedpdf/engine-runtime@3.2.0

@embedpdf/engine-runtime-darwin-arm64@3.2.0

@embedpdf/engine-runtime-darwin-x64@3.2.0

@embedpdf/engine-runtime-linux-arm64@3.2.0

@embedpdf/engine-runtime-linux-x64@3.2.0

@embedpdf/engine-runtime-linuxmusl-arm64@3.2.0

@embedpdf/engine-runtime-linuxmusl-x64@3.2.0

@embedpdf/engine-runtime-wasm32@3.2.0

@embedpdf/engine-runtime-win32-arm64@3.2.0

@embedpdf/engine-runtime-win32-x64@3.2.0

@embedpdf/plugin-actions@3.2.0

@embedpdf/plugin-attachment@3.2.0

@embedpdf/plugin-commands@3.2.0

@embedpdf/plugin-fonts@3.2.0

@embedpdf/plugin-history@3.2.0

@embedpdf/plugin-i18n@3.2.0

@embedpdf/plugin-interaction@3.2.0

@embedpdf/plugin-link@3.2.0

@embedpdf/plugin-measurement@3.2.0

@embedpdf/plugin-metadata@3.2.0

@embedpdf/plugin-outline@3.2.0

@embedpdf/plugin-page-edit@3.2.0

@embedpdf/plugin-redaction@3.2.0

@embedpdf/plugin-render@3.2.0

@embedpdf/plugin-search@3.2.0

@embedpdf/plugin-selection@3.2.0

@embedpdf/plugin-shell@3.2.0

@embedpdf/plugin-signature@3.2.0

@embedpdf/plugin-stamp@3.2.0

@embedpdf/plugin-view-manager@3.2.0

@embedpdf/viewer-angular@3.2.0

@embedpdf/viewer@3.2.0

@embedpdf/viewer-react@3.2.0

@embedpdf/viewer-svelte@3.2.0

@embedpdf/viewer-vue@3.2.0