From e13a618df358eca47a123b3b5f89f26261a34e74 Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Mon, 10 Nov 2025 21:09:35 +0100 Subject: [PATCH] Merge the structure trees coming from different pdfs (bug 1997379) --- src/core/editor/pdf_editor.js | 641 ++++++++++++++++++++++++++++++- src/core/name_number_tree.js | 7 +- test/pdfs/.gitignore | 2 + test/pdfs/paragraph_and_link.pdf | Bin 0 -> 45232 bytes test/pdfs/two_paragraphs.pdf | Bin 0 -> 25142 bytes test/unit/api_spec.js | 246 ++++++++++++ 6 files changed, 889 insertions(+), 7 deletions(-) create mode 100755 test/pdfs/paragraph_and_link.pdf create mode 100755 test/pdfs/two_paragraphs.pdf diff --git a/src/core/editor/pdf_editor.js b/src/core/editor/pdf_editor.js index 9e4f81c62..2f9d003e3 100644 --- a/src/core/editor/pdf_editor.js +++ b/src/core/editor/pdf_editor.js @@ -17,9 +17,10 @@ /** @typedef {import("../document.js").Page} Page */ /** @typedef {import("../xref.js").XRef} XRef */ -import { Dict, isName, Ref, RefSetCache } from "../primitives.js"; +import { Dict, isName, Name, Ref, RefSet, RefSetCache } from "../primitives.js"; import { getModificationDate, stringToPDFString } from "../../shared/util.js"; import { incrementalUpdate, writeValue } from "../writer.js"; +import { NameTree, NumberTree } from "../name_number_tree.js"; import { BaseStream } from "../base_stream.js"; import { StringStream } from "../stream.js"; import { stringToAsciiOrUTF16BE } from "../core_utils.js"; @@ -49,6 +50,16 @@ class DocumentData { this.dedupNamedDestinations = new Map(); this.usedNamedDestinations = new Set(); this.postponedRefCopies = new RefSetCache(); + this.usedStructParents = new Set(); + this.oldStructParentMapping = new Map(); + this.structTreeRoot = null; + this.parentTree = null; + this.idTree = null; + this.roleMap = null; + this.classMap = null; + this.namespaces = null; + this.structTreeAF = null; + this.structTreePronunciationLexicon = []; } } @@ -82,6 +93,14 @@ class PDFEditor { this.author = author; this.pageLabels = null; this.namedDestinations = new Map(); + this.parentTree = new Map(); + this.structTreeKids = []; + this.idTree = new Map(); + this.classMap = new Dict(); + this.roleMap = new Dict(); + this.namespaces = new Map(); + this.structTreeAF = []; + this.structTreePronunciationLexicon = []; } /** @@ -115,6 +134,12 @@ class PDFEditor { return ref; } + cloneDict(dict) { + const newDict = dict.clone(); + newDict.xref = this.xrefWrapper; + return newDict; + } + /** * Collect the dependencies of an object and create new references for each * dependency. @@ -212,6 +237,232 @@ class PDFEditor { return obj; } + async #cloneStructTreeNode( + parentStructRef, + node, + xref, + removedStructElements, + dedupIDs, + dedupClasses, + dedupRoles, + visited = new RefSet() + ) { + const { + currentDocument: { pagesMap, oldRefMapping }, + } = this; + const pg = node.getRaw("Pg"); + if (pg instanceof Ref && !pagesMap.has(pg)) { + return null; + } + let kids; + const k = (kids = node.getRaw("K")); + if (k instanceof Ref) { + // We're only interested by ref referencing nodes and not an array. + if (visited.has(k)) { + return null; + } + kids = await xref.fetchAsync(k); + if (!Array.isArray(kids)) { + kids = [k]; + } + } + kids = Array.isArray(kids) ? kids : [kids]; + const newKids = []; + const structElemIndices = []; + for (let kid of kids) { + const kidRef = kid instanceof Ref ? kid : null; + if (kidRef) { + if (visited.has(kidRef)) { + continue; + } + visited.put(kidRef); + kid = await xref.fetchAsync(kidRef); + } + if (typeof kid === "number") { + newKids.push(kid); + continue; + } + if (!(kid instanceof Dict)) { + continue; + } + const pgRef = kid.getRaw("Pg"); + if (pgRef instanceof Ref && !pagesMap.has(pgRef)) { + continue; + } + const type = kid.get("Type"); + if (!type || isName(type, "StructElem")) { + let setAsSpan = false; + if (kidRef && removedStructElements.has(kidRef)) { + if (!isName(kid.get("S"), "Link")) { + continue; + } + // A link annotation has been removed but we still need to keep the + // node in order to preserve the structure tree. Mark it as a Span + // so that it doesn't affect the semantics. + setAsSpan = true; + } + const newKidRef = await this.#cloneStructTreeNode( + kidRef, + kid, + xref, + removedStructElements, + dedupIDs, + dedupClasses, + dedupRoles, + visited + ); + if (newKidRef) { + structElemIndices.push(newKids.length); + newKids.push(newKidRef); + if (kidRef) { + oldRefMapping.put(kidRef, newKidRef); + } + if (setAsSpan) { + this.xref[newKidRef.num].setIfName("S", "Span"); + } + } + continue; + } + if (isName(type, "OBJR")) { + if (!kidRef) { + continue; + } + const newKidRef = oldRefMapping.get(kidRef); + if (!newKidRef) { + continue; + } + const newKid = this.xref[newKidRef.num]; + // Fix the missing StructParent entry in the referenced object. + const objRef = newKid.getRaw("Obj"); + if (objRef instanceof Ref) { + const obj = this.xref[objRef.num]; + if ( + obj instanceof Dict && + !obj.has("StructParent") && + parentStructRef + ) { + const structParent = this.parentTree.size; + this.parentTree.set(structParent, [oldRefMapping, parentStructRef]); + obj.set("StructParent", structParent); + } + } + newKids.push(newKidRef); + continue; + } + if (isName(type, "MCR")) { + const newKid = await this.#collectDependencies( + kidRef || kid, + true, + xref + ); + newKids.push(newKid); + continue; + } + if (kidRef) { + const newKidRef = await this.#collectDependencies(kidRef, true, xref); + newKids.push(newKidRef); + } + } + if (kids.length !== 0 && newKids.length === 0) { + return null; + } + + const newNodeRef = this.newRef; + const newNode = (this.xref[newNodeRef.num] = this.cloneDict(node)); + // Don't collect for ID or C since they will be fixed later. + newNode.delete("ID"); + newNode.delete("C"); + newNode.delete("K"); + newNode.delete("P"); + newNode.delete("S"); + await this.#collectDependencies(newNode, false, xref); + + // Fix the class names. + const classNames = node.get("C"); + if (classNames instanceof Name) { + const newClassName = dedupClasses.get(classNames.name); + if (newClassName) { + newNode.set("C", Name.get(newClassName)); + } else { + newNode.set("C", classNames); + } + } else if (Array.isArray(classNames)) { + const newClassNames = []; + for (const className of classNames) { + if (className instanceof Name) { + const newClassName = dedupClasses.get(className.name); + if (newClassName) { + newClassNames.push(Name.get(newClassName)); + } else { + newClassNames.push(className); + } + } + } + newNode.set("C", newClassNames); + } + + // Fix the role name. + const roleName = node.get("S"); + if (roleName instanceof Name) { + const newRoleName = dedupRoles.get(roleName.name); + if (newRoleName) { + newNode.set("S", Name.get(newRoleName)); + } else { + newNode.set("S", roleName); + } + } + + // Fix the ID. + const id = node.get("ID"); + if (typeof id === "string") { + const stringId = stringToPDFString(id, /* keepEscapeSequence = */ false); + const newId = dedupIDs.get(stringId); + if (newId) { + newNode.set("ID", stringToAsciiOrUTF16BE(newId)); + } else { + newNode.set("ID", id); + } + } + + // Table headers may contain IDs that need to be deduplicated. + let attributes = newNode.get("A"); + if (attributes) { + if (!Array.isArray(attributes)) { + attributes = [attributes]; + } + for (let attr of attributes) { + attr = this.xrefWrapper.fetch(attr); + if (isName(attr.get("O"), "Table") && attr.has("Headers")) { + const headers = this.xrefWrapper.fetch(attr.getRaw("Headers")); + if (Array.isArray(headers)) { + for (let i = 0, ii = headers.length; i < ii; i++) { + const newId = dedupIDs.get( + stringToPDFString(headers[i], /* keepEscapeSequence = */ false) + ); + if (newId) { + headers[i] = newId; + } + } + } + } + } + } + + for (const index of structElemIndices) { + const structElemRef = newKids[index]; + const structElem = this.xref[structElemRef.num]; + structElem.set("P", newNodeRef); + } + + if (newKids.length === 1) { + newNode.set("K", newKids[0]); + } else if (newKids.length > 1) { + newNode.set("K", newKids); + } + + return newNodeRef; + } + /** * @typedef {Object} PageInfo * @property {PDFDocument} document @@ -315,6 +566,7 @@ class PDFEditor { } this.#fixPostponedRefCopies(allDocumentData); + await this.#mergeStructTrees(allDocumentData); return this.writePDF(); } @@ -326,7 +578,7 @@ class PDFEditor { */ async #collectDocumentData(documentData) { const { - document: { pdfManager }, + document: { pdfManager, xref }, } = documentData; await Promise.all([ pdfManager @@ -335,7 +587,34 @@ class PDFEditor { pdfManager .ensureCatalog("rawPageLabels") .then(pageLabels => (documentData.pageLabels = pageLabels)), + pdfManager + .ensureCatalog("structTreeRoot") + .then(structTreeRoot => (documentData.structTreeRoot = structTreeRoot)), ]); + const structTreeRoot = documentData.structTreeRoot; + if (structTreeRoot) { + const rootDict = structTreeRoot.dict; + const parentTree = rootDict.get("ParentTree"); + if (parentTree) { + const numberTree = new NumberTree(parentTree, xref); + documentData.parentTree = numberTree.getAll(/* isRaw = */ true); + } + const idTree = rootDict.get("IDTree"); + if (idTree) { + const nameTree = new NameTree(idTree, xref); + documentData.idTree = nameTree.getAll(/* isRaw = */ true); + } + documentData.roleMap = rootDict.get("RoleMap") || null; + documentData.classMap = rootDict.get("ClassMap") || null; + let namespaces = rootDict.get("Namespaces") || null; + if (namespaces && !Array.isArray(namespaces)) { + namespaces = [namespaces]; + } + documentData.namespaces = namespaces; + documentData.structTreeAF = rootDict.get("AF") || null; + documentData.structTreePronunciationLexicon = + rootDict.get("PronunciationLexicon") || null; + } } /** @@ -371,7 +650,6 @@ class PDFEditor { action instanceof Dict ? action.get("D") : annotationDict.get("Dest"); - if ( !dest /* not a destination */ || (Array.isArray(dest) && @@ -431,6 +709,293 @@ class PDFEditor { } } + #visitObject(obj, callback, visited = new RefSet()) { + if (obj instanceof Ref) { + if (!visited.has(obj)) { + visited.put(obj); + this.#visitObject(this.xref[obj.num], callback, visited); + } + return; + } + if (Array.isArray(obj)) { + for (const item of obj) { + this.#visitObject(item, callback, visited); + } + return; + } + let dict; + if (obj instanceof BaseStream) { + ({ dict } = obj); + } else if (obj instanceof Dict) { + dict = obj; + } + if (dict) { + callback(dict); + for (const value of dict.getRawValues()) { + this.#visitObject(value, callback, visited); + } + } + } + + async #mergeStructTrees(allDocumentData) { + let newStructParentId = 0; + const { parentTree: newParentTree } = this; + for (let i = 0, ii = this.newPages.length; i < ii; i++) { + const { + documentData: { + parentTree, + oldRefMapping, + oldStructParentMapping, + usedStructParents, + document: { xref }, + }, + } = this.oldPages[i]; + if (!parentTree) { + continue; + } + const pageRef = this.newPages[i]; + const pageDict = this.xref[pageRef.num]; + + // Visit the new page in order to collect used StructParent entries. + this.#visitObject(pageDict, dict => { + const structParent = + dict.get("StructParent") ?? dict.get("StructParents"); + if (typeof structParent !== "number") { + return; + } + usedStructParents.add(structParent); + let parent = parentTree.get(structParent); + const parentRef = parent instanceof Ref ? parent : null; + if (parentRef) { + const array = xref.fetch(parentRef); + if (Array.isArray(array)) { + parent = array; + } + } + if (Array.isArray(parent) && parent.every(ref => ref === null)) { + parent = null; + } + if (!parent) { + if (dict.has("StructParent")) { + dict.delete("StructParent"); + } else { + dict.delete("StructParents"); + } + return; + } + let newStructParent = oldStructParentMapping.get(structParent); + if (newStructParent === undefined) { + newStructParent = newStructParentId++; + oldStructParentMapping.set(structParent, newStructParent); + newParentTree.set(newStructParent, [oldRefMapping, parent]); + } + if (dict.has("StructParent")) { + dict.set("StructParent", newStructParent); + } else { + dict.set("StructParents", newStructParent); + } + }); + } + + const { + structTreeKids, + idTree: newIdTree, + classMap: newClassMap, + roleMap: newRoleMap, + namespaces: newNamespaces, + structTreeAF: newStructTreeAF, + structTreePronunciationLexicon: newStructTreePronunciationLexicon, + } = this; + // Clone the struct tree nodes for each document. + for (const documentData of allDocumentData) { + const { + document: { xref }, + oldRefMapping, + parentTree, + usedStructParents, + structTreeRoot, + idTree, + classMap, + roleMap, + namespaces, + structTreeAF, + structTreePronunciationLexicon, + } = documentData; + + if (!structTreeRoot) { + continue; + } + + this.currentDocument = documentData; + // Get all the removed StructElem + const removedStructElements = new RefSet(); + for (const [key, value] of parentTree || []) { + if (!usedStructParents.has(key) && value instanceof Ref) { + removedStructElements.put(value); + } + } + + // Deduplicate IDs in the ID tree. + // We keep the old node references since they will be cloned later when + // cloning the struct tree. + const dedupIDs = new Map(); + for (const [id, nodeRef] of idTree || []) { + let _id = id; + if (newIdTree.has(id)) { + for (let i = 1; ; i++) { + const newId = `${id}_${i}`; + if (!newIdTree.has(newId)) { + dedupIDs.set(id, newId); + _id = newId; + break; + } + } + } + newIdTree.set(_id, nodeRef); + } + + const dedupClasses = new Map(); + if (classMap?.size > 0) { + // Deduplicate ClassMap entries. + for (let [className, classDict] of classMap) { + classDict = await this.#collectDependencies(classDict, true, xref); + if (newClassMap.has(className)) { + for (let i = 1; ; i++) { + const newClassName = `${className}_${i}`; + if (!newClassMap.has(newClassName)) { + dedupClasses.set(className, newClassName); + className = newClassName; + break; + } + } + } + newClassMap.set(className, classDict); + } + } + + const dedupRoles = new Map(); + if (roleMap?.size > 0) { + // Deduplicate RoleMap entries. + for (const [roleName, mappedName] of roleMap) { + const newMappedName = newRoleMap.get(roleName); + if (!newMappedName) { + newRoleMap.set(roleName, mappedName); + continue; + } + if (newMappedName === mappedName) { + continue; + } + for (let i = 1; ; i++) { + const newRoleName = `${roleName}_${i}`; + if (!newRoleMap.has(newRoleName)) { + dedupRoles.set(roleName, newRoleName); + newRoleMap.set(newRoleName, mappedName); + break; + } + } + } + } + + if (namespaces?.length > 0) { + for (const namespaceRef of namespaces) { + const namespace = await xref.fetchIfRefAsync(namespaceRef); + let ns = namespace.get("NS"); + if (!ns || newNamespaces.has(ns)) { + continue; + } + ns = stringToPDFString(ns, /* keepEscapeSequence = */ false); + const newNamespace = await this.#collectDependencies( + namespace, + true, + xref + ); + newNamespaces.set(ns, newNamespace); + } + } + + if (structTreeAF) { + for (const afRef of structTreeAF) { + newStructTreeAF.push( + await this.#collectDependencies(afRef, true, xref) + ); + } + } + + if (structTreePronunciationLexicon) { + for (const lexiconRef of structTreePronunciationLexicon) { + newStructTreePronunciationLexicon.push( + await this.#collectDependencies(lexiconRef, true, xref) + ); + } + } + + // Get the kids. + let kids = structTreeRoot.dict.get("K"); + if (!kids) { + continue; + } + kids = Array.isArray(kids) ? kids : [kids]; + for (let kid of kids) { + const kidRef = kid instanceof Ref ? kid : null; + if (kidRef && removedStructElements.has(kidRef)) { + continue; + } + kid = await xref.fetchIfRefAsync(kid); + const newKidRef = await this.#cloneStructTreeNode( + kidRef, + kid, + xref, + removedStructElements, + dedupIDs, + dedupClasses, + dedupRoles + ); + if (newKidRef) { + structTreeKids.push(newKidRef); + } + } + + // Fix the ID tree. + for (const [id, nodeRef] of idTree || []) { + const newNodeRef = oldRefMapping.get(nodeRef); + const newId = dedupIDs.get(id) || id; + if (newNodeRef) { + newIdTree.set(newId, newNodeRef); + } else { + newIdTree.delete(newId); + } + } + } + + for (const [key, [oldRefMapping, parent]] of newParentTree) { + if (!parent) { + newParentTree.delete(key); + continue; + } + // Some nodes haven't been visited while cloning the struct trees so their + // ref don't belong to the oldRefMapping. Remove those nodes. + if (!Array.isArray(parent)) { + const newParent = oldRefMapping.get(parent); + if (newParent === undefined) { + newParentTree.delete(key); + } else { + newParentTree.set(key, newParent); + } + continue; + } + const newParents = parent.map( + ref => (ref instanceof Ref && oldRefMapping.get(ref)) || null + ); + if (newParents.length === 0 || newParents.every(ref => ref === null)) { + newParentTree.delete(key); + continue; + } + newParentTree.set(key, newParents); + } + + this.currentDocument = null; + } + /** * Collect named destinations that are still valid (i.e. pointing to kept * pages). @@ -566,7 +1131,7 @@ class PDFEditor { } if (stFirstIndex !== -1) { const st = currentLabel.get("St"); - currentLabel = currentLabel.clone(); + currentLabel = this.cloneDict(currentLabel); currentLabel.set("St", st + (i - stFirstIndex)); stFirstIndex = -1; } @@ -598,7 +1163,7 @@ class PDFEditor { const { dedupNamedDestinations, oldRefMapping } = documentData; const { xref, rotate, mediaBox, resources, ref: oldPageRef } = page; const pageRef = this.newRef; - const pageDict = (this.xref[pageRef.num] = page.pageDict.clone()); + const pageDict = (this.xref[pageRef.num] = this.cloneDict(page.pageDict)); oldRefMapping.put(oldPageRef, pageRef); if (pointingNamedDestinations) { @@ -796,6 +1361,71 @@ class PDFEditor { ); } + #makeStructTree() { + const { structTreeKids } = this; + if (!structTreeKids || structTreeKids.length === 0) { + return; + } + const { rootDict } = this; + const structTreeRef = this.newRef; + const structTree = (this.xref[structTreeRef.num] = new Dict()); + structTree.setIfName("Type", "StructTreeRoot"); + structTree.setIfArray("K", structTreeKids); + for (const kidRef of structTreeKids) { + const kid = this.xref[kidRef.num]; + const type = kid.get("Type"); + if (!type || isName(type, "StructElem")) { + kid.set("P", structTreeRef); + } + } + if (this.parentTree.size > 0) { + const parentTreeRef = this.#makeNameNumTree( + Array.from(this.parentTree.entries()), + /* areNames = */ false + ); + const parentTree = this.xref[parentTreeRef.num]; + parentTree.setIfName("Type", "ParentTree"); + structTree.set("ParentTree", parentTreeRef); + structTree.set("ParentTreeNextKey", this.parentTree.size); + } + if (this.idTree.size > 0) { + const idTreeRef = this.#makeNameNumTree( + Array.from(this.idTree.entries()), + /* areNames = */ true + ); + const idTree = this.xref[idTreeRef.num]; + idTree.setIfName("Type", "IDTree"); + structTree.set("IDTree", idTreeRef); + } + if (this.classMap.size > 0) { + const classMapRef = this.newRef; + this.xref[classMapRef.num] = this.classMap; + structTree.set("ClassMap", classMapRef); + } + if (this.roleMap.size > 0) { + const roleMapRef = this.newRef; + this.xref[roleMapRef.num] = this.roleMap; + structTree.set("RoleMap", roleMapRef); + } + if (this.namespaces.size > 0) { + const namespacesRef = this.newRef; + this.xref[namespacesRef.num] = Array.from(this.namespaces.values()); + structTree.set("Namespaces", namespacesRef); + } + if (this.structTreeAF.length > 0) { + const structTreeAFRef = this.newRef; + this.xref[structTreeAFRef.num] = this.structTreeAF; + structTree.set("AF", structTreeAFRef); + } + if (this.structTreePronunciationLexicon.length > 0) { + const structTreePronunciationLexiconRef = this.newRef; + this.xref[structTreePronunciationLexiconRef.num] = + this.structTreePronunciationLexicon; + structTree.set("PronunciationLexicon", structTreePronunciationLexiconRef); + } + rootDict.set("StructTreeRoot", structTreeRef); + } + /** * Create the root dictionary. * @returns {Promise} @@ -807,6 +1437,7 @@ class PDFEditor { this.#makePageTree(); this.#makePageLabelsTree(); this.#makeDestinationsTree(); + this.#makeStructTree(); } /** diff --git a/src/core/name_number_tree.js b/src/core/name_number_tree.js index 461711d1f..c5b63dc7b 100644 --- a/src/core/name_number_tree.js +++ b/src/core/name_number_tree.js @@ -34,7 +34,7 @@ class NameOrNumberTree { this._type = type; } - getAll() { + getAll(isRaw = false) { const map = new Map(); if (!this.root) { return map; @@ -68,7 +68,10 @@ class NameOrNumberTree { continue; } for (let i = 0, ii = entries.length; i < ii; i += 2) { - map.set(xref.fetchIfRef(entries[i]), xref.fetchIfRef(entries[i + 1])); + map.set( + xref.fetchIfRef(entries[i]), + isRaw ? entries[i + 1] : xref.fetchIfRef(entries[i + 1]) + ); } } return map; diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index e2bb0f1e8..cb41f1d0a 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -759,3 +759,5 @@ !doc_3_3_pages.pdf !labelled_pages.pdf !extract_link.pdf +!two_paragraphs.pdf +!paragraph_and_link.pdf diff --git a/test/pdfs/paragraph_and_link.pdf b/test/pdfs/paragraph_and_link.pdf new file mode 100755 index 0000000000000000000000000000000000000000..610abe5b8a1d19c61be3036190ddef082fc64740 GIT binary patch literal 45232 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
    Uka;-HRcCU`x__p9!?`q&He=AA_e$ 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 w=A-aA`t73If*@&Et; literal 0 HcmV?d00001 diff --git a/test/unit/api_spec.js b/test/unit/api_spec.js index 34559c4b4..50673ad4b 100644 --- a/test/unit/api_spec.js +++ b/test/unit/api_spec.js @@ -5722,5 +5722,251 @@ small scripts as well as for`); await loadingTask.destroy(); }); }); + + describe("Struct trees", function () { + it("extract pages and merge struct trees", async function () { + let loadingTask = getDocument( + buildGetDocumentParams("two_paragraphs.pdf") + ); + let pdfDoc = await loadingTask.promise; + let pdfPage = await pdfDoc.getPage(1); + const structTree = await pdfPage.getStructTree(); + expect(structTree).toEqual({ + children: [ + { + role: "Document", + children: [ + { + role: "Sect", + children: [ + { + role: "P", + children: [{ type: "content", id: "p19R_mc0" }], + lang: "EN-US", + }, + { + role: "P", + children: [{ type: "content", id: "p19R_mc1" }], + lang: "EN-US", + }, + ], + }, + ], + }, + ], + role: "Root", + }); + const filterItems = item => { + if (item.type === "beginMarkedContentProps") { + return item.id; + } + if (item.str !== undefined) { + return item.str; + } + return null; + }; + let { items } = await pdfPage.getTextContent({ + includeMarkedContent: true, + disableNormalization: true, + }); + expect(items.map(filterItems)).toEqual([ + "p19R_mc0", + "The first paragraph.", + null, + "p19R_mc1", + "", + "The second paragraph.", + null, + ]); + + const data = await pdfDoc.extractPages([ + { document: null }, + { document: null }, + ]); + await loadingTask.destroy(); + + loadingTask = getDocument(data); + pdfDoc = await loadingTask.promise; + + expect(pdfDoc.numPages).toEqual(2); + pdfPage = await pdfDoc.getPage(1); + const structTree1 = await pdfPage.getStructTree(); + expect(structTree1).toEqual({ + children: [ + { + role: "Document", + children: [ + { + role: "Sect", + children: [ + { + role: "P", + children: [{ type: "content", id: "p4R_mc0" }], + lang: "EN-US", + }, + { + role: "P", + children: [{ type: "content", id: "p4R_mc1" }], + lang: "EN-US", + }, + ], + }, + ], + }, + ], + role: "Root", + }); + + ({ items } = await pdfPage.getTextContent({ + includeMarkedContent: true, + disableNormalization: true, + })); + expect(items.map(filterItems)).toEqual([ + "p4R_mc0", + "The first paragraph.", + null, + "p4R_mc1", + "", + "The second paragraph.", + null, + ]); + + pdfPage = await pdfDoc.getPage(2); + const structTree2 = await pdfPage.getStructTree(); + expect(structTree2).toEqual({ + children: [ + { + role: "Document", + children: [ + { + role: "Sect", + children: [ + { + role: "P", + children: [{ type: "content", id: "p19R_mc0" }], + lang: "EN-US", + }, + { + role: "P", + children: [{ type: "content", id: "p19R_mc1" }], + lang: "EN-US", + }, + ], + }, + ], + }, + ], + role: "Root", + }); + + ({ items } = await pdfPage.getTextContent({ + includeMarkedContent: true, + disableNormalization: true, + })); + expect(items.map(filterItems)).toEqual([ + "p19R_mc0", + "The first paragraph.", + null, + "p19R_mc1", + "", + "The second paragraph.", + null, + ]); + + await loadingTask.destroy(); + }); + + it("extract pages with a removed link", async function () { + let loadingTask = getDocument( + buildGetDocumentParams("paragraph_and_link.pdf") + ); + let pdfDoc = await loadingTask.promise; + + const data = await pdfDoc.extractPages([ + { document: null, excludePages: [1] }, + { document: null }, + ]); + await loadingTask.destroy(); + + loadingTask = getDocument(data); + pdfDoc = await loadingTask.promise; + + expect(pdfDoc.numPages).toEqual(3); + let pdfPage = await pdfDoc.getPage(1); + let structTree = await pdfPage.getStructTree(); + expect(structTree).toEqual({ + children: [ + { + role: "Document", + children: [ + { + role: "Sect", + children: [ + { + role: "P", + children: [{ type: "content", id: "p4R_mc0" }], + lang: "EN-US", + }, + { + role: "P", + children: [{ type: "content", id: "p4R_mc3" }], + lang: "EN-US", + }, + { + role: "P", + children: [{ type: "content", id: "p4R_mc6" }], + lang: "EN-US", + }, + ], + }, + ], + }, + ], + role: "Root", + }); + + pdfPage = await pdfDoc.getPage(2); + structTree = await pdfPage.getStructTree(); + + expect(structTree).toEqual({ + children: [ + { + role: "Document", + children: [ + { + role: "Sect", + children: [ + { + role: "P", + children: [{ type: "content", id: "p23R_mc0" }], + lang: "EN-US", + }, + { + role: "P", + children: [ + { + role: "Reference", + children: [{ type: "content", id: "p23R_mc2" }], + lang: "EN-US", + }, + { type: "content", id: "p23R_mc3" }, + ], + lang: "EN-US", + }, + { + role: "P", + children: [{ type: "content", id: "p23R_mc6" }], + lang: "EN-US", + }, + ], + }, + ], + }, + ], + role: "Root", + }); + await loadingTask.destroy(); + }); + }); }); });