@@ -34,17 +34,16 @@ This file is part of the iText (R) project.
3434import com .itextpdf .kernel .pdf .PdfName ;
3535import com .itextpdf .kernel .pdf .PdfNumber ;
3636import com .itextpdf .kernel .pdf .PdfObject ;
37+ import com .itextpdf .kernel .pdf .PdfOutline ;
3738import com .itextpdf .kernel .pdf .PdfPage ;
3839import com .itextpdf .kernel .pdf .PdfStream ;
3940import com .itextpdf .kernel .pdf .PdfString ;
4041import com .itextpdf .kernel .pdf .PdfXrefTable ;
4142import com .itextpdf .kernel .pdf .canvas .CanvasGraphicsState ;
4243import com .itextpdf .kernel .pdf .colorspace .PdfColorSpace ;
4344
44- import java .util .ArrayList ;
4545import java .util .HashMap ;
4646import java .util .HashSet ;
47- import java .util .List ;
4847import java .util .Map ;
4948import java .util .Set ;
5049
@@ -164,7 +163,9 @@ public void checkDocument(PdfCatalog catalog) {
164163 checkCatalog (catalog );
165164 checkLogicalStructure (catalogDict );
166165 checkForm (catalogDict .getAsDictionary (PdfName .AcroForm ));
167- checkOutlines (catalogDict );
166+ if (catalog .getDocument ().hasOutlines ()) {
167+ checkOutlines (catalog .getDocument ().getOutlines (false ));
168+ }
168169 checkPages (catalog .getDocument ());
169170 checkOpenAction (catalogDict .get (PdfName .OpenAction ));
170171 checkColorsUsages ();
@@ -917,34 +918,18 @@ private void checkAnnotations(PdfDictionary page) {
917918 }
918919 }
919920
920- private void checkOutlines (PdfDictionary catalogDict ){
921- PdfDictionary outlines = catalogDict . getAsDictionary ( PdfName . Outlines );
922- if ( outlines != null ) {
923- for ( PdfDictionary outline : getOutlines ( outlines ) ) {
924- PdfDictionary action = outline . getAsDictionary ( PdfName . A );
925- if ( action != null ) {
926- checkAction ( action );
927- }
921+ private void checkOutlines (PdfOutline outline ){
922+ if ( outline != null ) {
923+ final PdfDictionary action = outline . getContent (). getAsDictionary ( PdfName . A );
924+ if ( action != null ) {
925+ checkAction ( action );
926+ }
927+ for ( PdfOutline child : outline . getAllChildren ()) {
928+ checkOutlines ( child );
928929 }
929930 }
930931 }
931932
932- private List <PdfDictionary > getOutlines (PdfDictionary item ) {
933- List <PdfDictionary > outlines = new ArrayList <>();
934- outlines .add (item );
935-
936- PdfDictionary processItem = item .getAsDictionary (PdfName .First );
937- if (processItem != null ){
938- outlines .addAll (getOutlines (processItem ));
939- }
940- processItem = item .getAsDictionary (PdfName .Next );
941- if (processItem != null ){
942- outlines .addAll (getOutlines (processItem ));
943- }
944-
945- return outlines ;
946- }
947-
948933 private void setCheckerOutputIntent (PdfDictionary outputIntent ) {
949934 if (outputIntent != null ) {
950935 pdfAOutputIntentDestProfile = outputIntent .getAsStream (PdfName .DestOutputProfile );
0 commit comments