forked from vanielf/pdf-lib
-
Notifications
You must be signed in to change notification settings - Fork 56
Open
Labels
help wantedExtra attention is neededExtra attention is needed
Description
What are you working on?
I have a pdf from a client, that I unfortunately can't share. Every pdf viewer I tried could open it but in pdf-lib I get the error "Expected instance of _PDFDict, but got instance of PDFNull". I found that in pdf-lib the page tree was missing while here for example it was not missing.
For those that have the same (apparently very rear) issue: My solution was to build and insert the page tree myself:
function fixMissingPageTree(doc: PDFDocument) {
const pagesName = PDFName.of('Pages');
const pages = doc.catalog.lookupMaybe(pagesName, PDFDict);
if (pages) return;
const indirectObjects = doc.context['indirectObjects'] as Map<PDFRef, PDFObject>;
const pageLeafs = indirectObjects.entries()
.filter(([_, obj]) => obj instanceof PDFPageLeaf)
.toArray() as [PDFRef, PDFPageLeaf][];
const structParentsName = PDFName.of('StructParents');
const getIndex = (pageLeaf: PDFPageLeaf) => pageLeaf.lookup(structParentsName, PDFNumber)?.asNumber();
pageLeafs.sort((a, b) => getIndex(a[1]) - getIndex(b[1]));
const kids = PDFArray.withContext(doc.context);
for (const pageLeaf of pageLeafs)
kids.push(pageLeaf[0]);
const pageTree = PDFPageTree.withContext(doc.context);
pageTree.set(PDFName.of('Type'), pagesName);
pageTree.set(PDFName.of('Kids'), kids);
pageTree.set(PDFName.of('Count'), PDFNumber.of(pageLeafs.length));
doc.catalog.set(pagesName, pageTree);
}Additional Notes
No response
Metadata
Metadata
Assignees
Labels
help wantedExtra attention is neededExtra attention is needed