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:
parent
7c1883a839
commit
3103deaa44
7 changed files with 67 additions and 11 deletions
|
@ -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) {
|
||||
|
|
|
@ -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)
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue