From 1a047f843c8b97811451a43702dc1ecf66a7e8ee Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Mon, 5 Jun 2023 15:07:28 +0200 Subject: [PATCH] [Editor] Add the possibility to update an existing annotation with some new properties when saving or printing --- src/core/annotation.js | 18 ++++++-- src/core/document.js | 49 +++++++++++++++++++++- src/core/primitives.js | 17 ++++++++ test/pdfs/.gitignore | 1 + test/pdfs/freetexts.pdf | Bin 0 -> 44273 bytes test/test_manifest.json | 88 +++++++++++++++++++++++++++++++++++++++- 6 files changed, 167 insertions(+), 6 deletions(-) create mode 100755 test/pdfs/freetexts.pdf diff --git a/src/core/annotation.js b/src/core/annotation.js index 7937479d4..c47b79ffb 100644 --- a/src/core/annotation.js +++ b/src/core/annotation.js @@ -264,6 +264,9 @@ class AnnotationFactory { const promises = []; for (const annotation of annotations) { + if (annotation.deleted) { + continue; + } switch (annotation.annotationType) { case AnnotationEditorType.FREETEXT: if (!baseFontRef) { @@ -308,6 +311,9 @@ class AnnotationFactory { const { isOffscreenCanvasSupported } = evaluator.options; const promises = []; for (const annotation of annotations) { + if (annotation.deleted) { + continue; + } switch (annotation.annotationType) { case AnnotationEditorType.FREETEXT: promises.push( @@ -466,6 +472,7 @@ class Annotation { const MK = dict.get("MK"); this.setBorderAndBackgroundColors(MK); this.setRotation(MK); + this.ref = params.ref instanceof Ref ? params.ref : null; this._streams = []; if (this.appearance) { @@ -1467,7 +1474,7 @@ class MarkupAnnotation extends Annotation { } static async createNewAnnotation(xref, annotation, dependencies, params) { - const annotationRef = xref.getNewTemporaryRef(); + const annotationRef = annotation.ref || xref.getNewTemporaryRef(); const ap = await this.createNewAppearanceStream(annotation, xref, params); const buffer = []; let annotationDict; @@ -1497,11 +1504,17 @@ class MarkupAnnotation extends Annotation { const ap = await this.createNewAppearanceStream(annotation, xref, params); const annotationDict = this.createNewDict(annotation, xref, { ap }); - return new this.prototype.constructor({ + const newAnnotation = new this.prototype.constructor({ dict: annotationDict, xref, isOffscreenCanvasSupported: params.isOffscreenCanvasSupported, }); + + if (annotation.ref) { + newAnnotation.ref = newAnnotation.refToReplace = annotation.ref; + } + + return newAnnotation; } } @@ -1511,7 +1524,6 @@ class WidgetAnnotation extends Annotation { const { dict, xref } = params; const data = this.data; - this.ref = params.ref; this._needAppearances = params.needAppearances; data.annotationType = AnnotationType.WIDGET; diff --git a/src/core/document.js b/src/core/document.js index 93f31b795..d5789b543 100644 --- a/src/core/document.js +++ b/src/core/document.js @@ -41,7 +41,7 @@ import { XRefEntryException, XRefParseException, } from "./core_utils.js"; -import { Dict, isName, Name, Ref } from "./primitives.js"; +import { Dict, isName, isRefsEqual, Name, Ref, RefSet } from "./primitives.js"; import { getXfaFontDict, getXfaFontName } from "./xfa_fonts.js"; import { BaseStream } from "./base_stream.js"; import { calculateMD5 } from "./crypto.js"; @@ -258,6 +258,24 @@ class Page { ); } + #replaceIdByRef(annotations, deletedAnnotations) { + for (const annotation of annotations) { + if (annotation.id) { + const ref = Ref.fromString(annotation.id); + if (!ref) { + warn(`A non-linked annotation cannot be modified: ${annotation.id}`); + continue; + } + if (annotation.deleted) { + deletedAnnotations.put(ref); + continue; + } + annotation.ref = ref; + delete annotation.id; + } + } + } + async saveNewAnnotations(handler, task, annotations) { if (this.xfaFactory) { throw new Error("XFA: Cannot save new annotations."); @@ -276,8 +294,13 @@ class Page { options: this.evaluatorOptions, }); + const deletedAnnotations = new RefSet(); + this.#replaceIdByRef(annotations, deletedAnnotations); + const pageDict = this.pageDict; - const annotationsArray = this.annotations.slice(); + const annotationsArray = this.annotations.filter( + a => !(a instanceof Ref && deletedAnnotations.has(a)) + ); const newData = await AnnotationFactory.saveNewAnnotations( partialEvaluator, task, @@ -401,11 +424,14 @@ class Page { const newAnnotationsByPage = !this.xfaFactory ? getNewAnnotationsMap(annotationStorage) : null; + let deletedAnnotations = null; let newAnnotationsPromise = Promise.resolve(null); if (newAnnotationsByPage) { const newAnnotations = newAnnotationsByPage.get(this.pageIndex); if (newAnnotations) { + deletedAnnotations = new RefSet(); + this.#replaceIdByRef(newAnnotations, deletedAnnotations); newAnnotationsPromise = AnnotationFactory.printNewAnnotations( partialEvaluator, task, @@ -446,6 +472,25 @@ class Page { newAnnotationsPromise, ]).then(function ([pageOpList, annotations, newAnnotations]) { if (newAnnotations) { + // Some annotations can already exist (if it has the refToReplace + // property). In this case, we replace the old annotation by the new + // one. + annotations = annotations.filter( + a => !(a.ref && deletedAnnotations.has(a.ref)) + ); + for (let i = 0, ii = newAnnotations.length; i < ii; i++) { + const newAnnotation = newAnnotations[i]; + if (newAnnotation.refToReplace) { + const j = annotations.findIndex( + a => a.ref && isRefsEqual(a.ref, newAnnotation.refToReplace) + ); + if (j >= 0) { + annotations.splice(j, 1, newAnnotation); + newAnnotations.splice(i--, 1); + ii--; + } + } + } annotations = annotations.concat(newAnnotations); } if ( diff --git a/src/core/primitives.js b/src/core/primitives.js index f19976c3a..30f81407b 100644 --- a/src/core/primitives.js +++ b/src/core/primitives.js @@ -279,6 +279,23 @@ class Ref { return `${this.num}R${this.gen}`; } + static fromString(str) { + const ref = RefCache[str]; + if (ref) { + return ref; + } + const m = /^(\d+)R(\d*)$/.exec(str); + if (!m || m[1] === "0") { + return null; + } + + // eslint-disable-next-line no-restricted-syntax + return (RefCache[str] = new Ref( + parseInt(m[1]), + !m[2] ? 0 : parseInt(m[2]) + )); + } + static get(num, gen) { const key = gen === 0 ? `${num}R` : `${num}R${gen}`; // eslint-disable-next-line no-restricted-syntax diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index dafc349b6..7d6b943dd 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -599,3 +599,4 @@ !bug1529502.pdf !issue16500.pdf !issue16538.pdf +!freetexts.pdf diff --git a/test/pdfs/freetexts.pdf b/test/pdfs/freetexts.pdf new file mode 100755 index 0000000000000000000000000000000000000000..c4ff346c025124fc3c33a9cbba15d605e108843b GIT binary patch literal 44273 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 Z&d