diff --git a/src/core/annotation.js b/src/core/annotation.js index 6194c96bf0eba..61d67c7eaff84 100644 --- a/src/core/annotation.js +++ b/src/core/annotation.js @@ -55,7 +55,6 @@ import { } from "./default_appearance.js"; import { Dict, isName, isRefsEqual, Name, Ref, RefSet } from "./primitives.js"; import { Stream, StringStream } from "./stream.js"; -import { writeDict, writeObject } from "./writer.js"; import { BaseStream } from "./base_stream.js"; import { bidi } from "./bidi.js"; import { Catalog } from "./catalog.js"; @@ -64,6 +63,7 @@ import { FileSpec } from "./file_spec.js"; import { JpegStream } from "./jpeg_stream.js"; import { ObjectLoader } from "./object_loader.js"; import { OperatorList } from "./operator_list.js"; +import { writeObject } from "./writer.js"; import { XFAFactory } from "./xfa/factory.js"; class AnnotationFactory { @@ -336,13 +336,7 @@ class AnnotationFactory { baseFont.set("Encoding", Name.get("WinAnsiEncoding")); const buffer = []; baseFontRef = xref.getNewTemporaryRef(); - const transform = xref.encrypt - ? xref.encrypt.createCipherTransform( - baseFontRef.num, - baseFontRef.gen - ) - : null; - await writeObject(baseFontRef, baseFont, buffer, transform); + await writeObject(baseFontRef, baseFont, buffer, xref); dependencies.push({ ref: baseFontRef, data: buffer.join("") }); } promises.push( @@ -369,19 +363,13 @@ class AnnotationFactory { const buffer = []; if (smaskStream) { const smaskRef = xref.getNewTemporaryRef(); - const transform = xref.encrypt - ? xref.encrypt.createCipherTransform(smaskRef.num, smaskRef.gen) - : null; - await writeObject(smaskRef, smaskStream, buffer, transform); + await writeObject(smaskRef, smaskStream, buffer, xref); dependencies.push({ ref: smaskRef, data: buffer.join("") }); imageStream.dict.set("SMask", smaskRef); buffer.length = 0; } const imageRef = (image.imageRef = xref.getNewTemporaryRef()); - const transform = xref.encrypt - ? xref.encrypt.createCipherTransform(imageRef.num, imageRef.gen) - : null; - await writeObject(imageRef, imageStream, buffer, transform); + await writeObject(imageRef, imageStream, buffer, xref); dependencies.push({ ref: imageRef, data: buffer.join("") }); image.imageStream = image.smaskStream = null; } @@ -1634,20 +1622,14 @@ class MarkupAnnotation extends Annotation { if (ap) { const apRef = xref.getNewTemporaryRef(); annotationDict = this.createNewDict(annotation, xref, { apRef }); - const transform = xref.encrypt - ? xref.encrypt.createCipherTransform(apRef.num, apRef.gen) - : null; - await writeObject(apRef, ap, buffer, transform); + await writeObject(apRef, ap, buffer, xref); dependencies.push({ ref: apRef, data: buffer.join("") }); } else { annotationDict = this.createNewDict(annotation, xref, {}); } buffer.length = 0; - const transform = xref.encrypt - ? xref.encrypt.createCipherTransform(annotationRef.num, annotationRef.gen) - : null; - await writeObject(annotationRef, annotationDict, buffer, transform); + await writeObject(annotationRef, annotationDict, buffer, xref); return { ref: annotationRef, data: buffer.join("") }; } @@ -2063,11 +2045,6 @@ class WidgetAnnotation extends Annotation { dict.set("MK", maybeMK); } - const encrypt = xref.encrypt; - const originalTransform = encrypt - ? encrypt.createCipherTransform(this.ref.num, this.ref.gen) - : null; - const buffer = []; const changes = [ // data for the original object @@ -2080,11 +2057,6 @@ class WidgetAnnotation extends Annotation { dict.set("AP", AP); AP.set("N", newRef); - let newTransform = null; - if (encrypt) { - newTransform = encrypt.createCipherTransform(newRef.num, newRef.gen); - } - const resources = this._getSaveFieldResources(xref); const appearanceStream = new StringStream(appearance); const appearanceDict = (appearanceStream.dict = new Dict(xref)); @@ -2103,7 +2075,7 @@ class WidgetAnnotation extends Annotation { appearanceDict.set("Matrix", rotationMatrix); } - await writeObject(newRef, appearanceStream, buffer, newTransform); + await writeObject(newRef, appearanceStream, buffer, xref); changes.push( // data for the new AP @@ -2118,7 +2090,7 @@ class WidgetAnnotation extends Annotation { } dict.set("M", `D:${getModificationDate()}`); - await writeObject(this.ref, dict, buffer, originalTransform); + await writeObject(this.ref, dict, buffer, xref); changes[0].data = buffer.join(""); @@ -2980,18 +2952,8 @@ class ButtonWidgetAnnotation extends WidgetAnnotation { dict.set("MK", maybeMK); } - const encrypt = evaluator.xref.encrypt; - let originalTransform = null; - if (encrypt) { - originalTransform = encrypt.createCipherTransform( - this.ref.num, - this.ref.gen - ); - } - - const buffer = [`${this.ref.num} ${this.ref.gen} obj\n`]; - await writeDict(dict, buffer, originalTransform); - buffer.push("\nendobj\n"); + const buffer = []; + await writeObject(this.ref, dict, buffer, evaluator.xref); return [{ ref: this.ref, data: buffer.join(""), xfa }]; } @@ -3034,23 +2996,16 @@ class ButtonWidgetAnnotation extends WidgetAnnotation { }; const name = Name.get(value ? this.data.buttonValue : "Off"); - let parentBuffer = null; - const encrypt = evaluator.xref.encrypt; + const buffer = []; + let parentData = null; if (value) { if (this.parent instanceof Ref) { const parent = evaluator.xref.fetch(this.parent); - let parentTransform = null; - if (encrypt) { - parentTransform = encrypt.createCipherTransform( - this.parent.num, - this.parent.gen - ); - } parent.set("V", name); - parentBuffer = [`${this.parent.num} ${this.parent.gen} obj\n`]; - await writeDict(parent, parentBuffer, parentTransform); - parentBuffer.push("\nendobj\n"); + await writeObject(this.parent, parent, buffer, evaluator.xref); + parentData = buffer.join(""); + buffer.length = 0; } else if (this.parent instanceof Dict) { this.parent.set("V", name); } @@ -3064,25 +3019,10 @@ class ButtonWidgetAnnotation extends WidgetAnnotation { dict.set("MK", maybeMK); } - let originalTransform = null; - if (encrypt) { - originalTransform = encrypt.createCipherTransform( - this.ref.num, - this.ref.gen - ); - } - - const buffer = [`${this.ref.num} ${this.ref.gen} obj\n`]; - await writeDict(dict, buffer, originalTransform); - buffer.push("\nendobj\n"); - + await writeObject(this.ref, dict, buffer, evaluator.xref); const newRefs = [{ ref: this.ref, data: buffer.join(""), xfa }]; - if (parentBuffer !== null) { - newRefs.push({ - ref: this.parent, - data: parentBuffer.join(""), - xfa: null, - }); + if (parentData) { + newRefs.push({ ref: this.parent, data: parentData, xfa: null }); } return newRefs; diff --git a/src/core/document.js b/src/core/document.js index 7414940233759..76e842e81e74c 100644 --- a/src/core/document.js +++ b/src/core/document.js @@ -321,16 +321,7 @@ class Page { const savedDict = pageDict.get("Annots"); pageDict.set("Annots", annotationsArray); const buffer = []; - - let transform = null; - if (this.xref.encrypt) { - transform = this.xref.encrypt.createCipherTransform( - this.ref.num, - this.ref.gen - ); - } - - await writeObject(this.ref, pageDict, buffer, transform); + await writeObject(this.ref, pageDict, buffer, this.xref); if (savedDict) { pageDict.set("Annots", savedDict); } diff --git a/src/core/writer.js b/src/core/writer.js index 78a88a669a247..e5193c141dbf0 100644 --- a/src/core/writer.js +++ b/src/core/writer.js @@ -25,7 +25,8 @@ import { SimpleDOMNode, SimpleXMLParser } from "./xml_parser.js"; import { BaseStream } from "./base_stream.js"; import { calculateMD5 } from "./crypto.js"; -async function writeObject(ref, obj, buffer, transform) { +async function writeObject(ref, obj, buffer, { encrypt = null }) { + const transform = encrypt?.createCipherTransform(ref.num, ref.gen); buffer.push(`${ref.num} ${ref.gen} obj\n`); if (obj instanceof Dict) { await writeDict(obj, buffer, transform); @@ -101,7 +102,7 @@ async function writeStream(stream, buffer, transform) { } } - if (transform !== null) { + if (transform) { string = transform.encryptString(string); } @@ -132,7 +133,7 @@ async function writeValue(value, buffer, transform) { } else if (Array.isArray(value)) { await writeArray(value, buffer, transform); } else if (typeof value === "string") { - if (transform !== null) { + if (transform) { value = transform.encryptString(value); } buffer.push(`(${escapeString(value)})`); @@ -253,14 +254,8 @@ async function updateAcroform({ dict.set("NeedAppearances", true); } - const encrypt = xref.encrypt; - let transform = null; - if (encrypt) { - transform = encrypt.createCipherTransform(acroFormRef.num, acroFormRef.gen); - } - const buffer = []; - await writeObject(acroFormRef, dict, buffer, transform); + await writeObject(acroFormRef, dict, buffer, xref); newRefs.push({ ref: acroFormRef, data: buffer.join("") }); }