1
0
Fork 0
mirror of https://github.com/mozilla/pdf.js.git synced 2025-04-19 22:58:07 +02:00

Fix missing annotation parent in using the one from the Fields entry

Fixes #15096.
This commit is contained in:
Calixte Denizet 2024-10-03 21:48:58 +02:00
parent 7c1883a839
commit 3103deaa44
7 changed files with 67 additions and 11 deletions

View file

@ -112,6 +112,7 @@ class AnnotationFactory {
* @params {Object} annotationGlobals
* @param {Object} idFactory
* @param {boolean} [collectFields]
* @param {Object} [orphanFields]
* @param {Object} [pageRef]
* @returns {Promise} A promise that is resolved with an {Annotation}
* instance.
@ -122,6 +123,7 @@ class AnnotationFactory {
annotationGlobals,
idFactory,
collectFields,
orphanFields,
pageRef
) {
const pageIndex = collectFields
@ -134,6 +136,7 @@ class AnnotationFactory {
annotationGlobals,
idFactory,
collectFields,
orphanFields,
pageIndex,
pageRef,
]);
@ -148,6 +151,7 @@ class AnnotationFactory {
annotationGlobals,
idFactory,
collectFields = false,
orphanFields = null,
pageIndex = null,
pageRef = null
) {
@ -173,6 +177,7 @@ class AnnotationFactory {
id,
annotationGlobals,
collectFields,
orphanFields,
needAppearances:
!collectFields && acroForm.get("NeedAppearances") === true,
pageIndex,
@ -623,7 +628,11 @@ function getTransformMatrix(rect, bbox, matrix) {
class Annotation {
constructor(params) {
const { dict, xref, annotationGlobals } = params;
const { dict, xref, annotationGlobals, ref, orphanFields } = params;
const parentRef = orphanFields?.get(ref);
if (parentRef) {
dict.set("Parent", parentRef);
}
this.setTitle(dict.get("T"));
this.setContents(dict.get("Contents"));
@ -3172,6 +3181,11 @@ class ButtonWidgetAnnotation extends WidgetAnnotation {
}
}
if (!this.parent) {
// If there is no parent then we must set the value in the field.
dict.set("V", name);
}
dict.set("AS", name);
dict.set("M", `D:${getModificationDate()}`);
if (flags !== undefined) {

View file

@ -787,12 +787,16 @@ class Page {
if (annots.length === 0) {
return annots;
}
const annotationGlobals =
await this.pdfManager.ensureDoc("annotationGlobals");
const [annotationGlobals, fieldObjects] = await Promise.all([
this.pdfManager.ensureDoc("annotationGlobals"),
this.pdfManager.ensureDoc("fieldObjects"),
]);
if (!annotationGlobals) {
return [];
}
const orphanFields = fieldObjects?.orphanFields;
const annotationPromises = [];
for (const annotationRef of annots) {
annotationPromises.push(
@ -802,6 +806,7 @@ class Page {
annotationGlobals,
this._localIdFactory,
/* collectFields */ false,
orphanFields,
this.ref
).catch(function (reason) {
warn(`_parsedAnnotations: "${reason}".`);
@ -1776,10 +1781,12 @@ class PDFDocument {
async #collectFieldObjects(
name,
parentRef,
fieldRef,
promises,
annotationGlobals,
visitedRefs
visitedRefs,
orphanFields
) {
const { xref } = this;
@ -1797,7 +1804,7 @@ class PDFDocument {
} else {
let obj = field;
while (true) {
obj = obj.getRaw("Parent");
obj = obj.getRaw("Parent") || parentRef;
if (obj instanceof Ref) {
if (visitedRefs.has(obj)) {
break;
@ -1815,6 +1822,15 @@ class PDFDocument {
}
}
if (
parentRef &&
!field.has("Parent") &&
isName(field.get("Subtype"), "Widget")
) {
// We've a parent from the Fields array, but the field hasn't.
orphanFields.put(fieldRef, parentRef);
}
if (!promises.has(name)) {
promises.set(name, []);
}
@ -1825,6 +1841,7 @@ class PDFDocument {
annotationGlobals,
/* idFactory = */ null,
/* collectFields */ true,
orphanFields,
/* pageRef */ null
)
.then(annotation => annotation?.getFieldObject())
@ -1842,10 +1859,12 @@ class PDFDocument {
for (const kid of kids) {
await this.#collectFieldObjects(
name,
fieldRef,
kid,
promises,
annotationGlobals,
visitedRefs
visitedRefs,
orphanFields
);
}
}
@ -1867,13 +1886,16 @@ class PDFDocument {
const visitedRefs = new RefSet();
const allFields = Object.create(null);
const fieldPromises = new Map();
const orphanFields = new RefSetCache();
for (const fieldRef of await acroForm.getAsync("Fields")) {
await this.#collectFieldObjects(
"",
null,
fieldRef,
fieldPromises,
annotationGlobals,
visitedRefs
visitedRefs,
orphanFields
);
}
@ -1890,7 +1912,7 @@ class PDFDocument {
}
await Promise.all(allPromises);
return allFields;
return { allFields, orphanFields };
});
return shadow(this, "fieldObjects", promise);
@ -1914,7 +1936,7 @@ class PDFDocument {
return true;
}
if (fieldObjects) {
return Object.values(fieldObjects).some(fieldObject =>
return Object.values(fieldObjects.allFields).some(fieldObject =>
fieldObject.some(object => object.actions !== null)
);
}

View file

@ -522,7 +522,9 @@ class WorkerMessageHandler {
});
handler.on("GetFieldObjects", function (data) {
return pdfManager.ensureDoc("fieldObjects");
return pdfManager
.ensureDoc("fieldObjects")
.then(fieldObjects => fieldObjects?.allFields || null);
});
handler.on("HasJSActions", function (data) {