From 568d22e108448bbdbfc18d735852c7794b22386b Mon Sep 17 00:00:00 2001 From: Davide Raccagni Date: Fri, 25 Feb 2022 14:19:24 +0100 Subject: [PATCH] Fix issue #668 --- .../java/com/lowagie/text/pdf/PdfReader.java | 35 +++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/openpdf/src/main/java/com/lowagie/text/pdf/PdfReader.java b/openpdf/src/main/java/com/lowagie/text/pdf/PdfReader.java index 2cfc0fde6..28193c8bb 100644 --- a/openpdf/src/main/java/com/lowagie/text/pdf/PdfReader.java +++ b/openpdf/src/main/java/com/lowagie/text/pdf/PdfReader.java @@ -3558,7 +3558,11 @@ void readPages() { refsp = null; refsn = new ArrayList<>(); pageInh = new ArrayList<>(); - iteratePages((PRIndirectReference) reader.catalog.get(PdfName.PAGES)); + PdfObject obj = reader.catalog.get(PdfName.PAGES); + if (obj instanceof PRIndirectReference) + iteratePages((PRIndirectReference) obj); + else if (obj instanceof PdfDictionary) + iteratePages((PdfDictionary) obj); pageInh = null; reader.rootPages.put(PdfName.COUNT, new PdfNumber(refsn.size())); } @@ -3739,7 +3743,7 @@ private void iteratePages(PRIndirectReference rpage) { } if (page.get(PdfName.MEDIABOX) == null) { PdfArray arr = new PdfArray(new float[] { 0, 0, - PageSize.LETTER.getRight(), PageSize.LETTER.getTop() }); + PageSize.LETTER.getRight(), PageSize.LETTER.getTop() }); page.put(PdfName.MEDIABOX, arr); } refsn.add(rpage); @@ -3755,7 +3759,32 @@ private void iteratePages(PRIndirectReference rpage) { kidsPR.remove(k); break; } - iteratePages((PRIndirectReference) obj); + if (obj instanceof PRIndirectReference) + iteratePages((PRIndirectReference) obj); + else if (obj instanceof PdfDictionary) + iteratePages((PdfDictionary) obj); + } + popPageAttributes(); + } + } + + private void iteratePages(PdfDictionary page) { + PdfArray kidsPR = page.getAsArray(PdfName.KIDS); + // reference to a leaf + if (kidsPR != null) { + page.put(PdfName.TYPE, PdfName.PAGES); + pushPageAttributes(page); + for (int k = 0; k < kidsPR.size(); ++k) { + PdfObject obj = kidsPR.getPdfObject(k); + if (!obj.isIndirect()) { + while (k < kidsPR.size()) + kidsPR.remove(k); + break; + } + if (obj instanceof PRIndirectReference) + iteratePages((PRIndirectReference) obj); + else if (obj instanceof PdfDictionary) + iteratePages((PdfDictionary) obj); } popPageAttributes(); }