Merge pull request #16921 from calixteman/simplify_write

Simplify writeObject function
This commit is contained in:
calixteman 2023-09-08 21:25:44 +02:00 committed by GitHub
commit cf7efdb040
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 24 additions and 98 deletions

View File

@ -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;

View File

@ -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);
}

View File

@ -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("") });
}