@@ -58,6 +58,7 @@ This file is part of the iText (R) project.
58
58
import com .itextpdf .test .annotations .LogMessage ;
59
59
import com .itextpdf .test .annotations .LogMessages ;
60
60
import com .itextpdf .test .annotations .type .IntegrationTest ;
61
+
61
62
import org .junit .Assert ;
62
63
import org .junit .BeforeClass ;
63
64
import org .junit .Rule ;
@@ -144,22 +145,26 @@ public void reversePagesTest() throws IOException {
144
145
@ Test
145
146
public void reversePagesTest2 () throws Exception {
146
147
String filename = "1000PagesDocument_reversed.pdf" ;
147
- PdfDocument pdfDoc = new PdfDocument (new PdfReader (sourceFolder + "1000PagesDocument.pdf" ), new PdfWriter (destinationFolder + filename ));
148
+ PdfDocument pdfDoc = new PdfDocument (new PdfReader (sourceFolder + "1000PagesDocument.pdf" ),
149
+ new PdfWriter (destinationFolder + filename ));
148
150
int n = pdfDoc .getNumberOfPages ();
149
151
for (int i = n - 1 ; i > 0 ; --i ) {
150
152
pdfDoc .movePage (i , n + 1 );
151
153
}
152
154
pdfDoc .close ();
153
- new CompareTool ().compareByContent (destinationFolder + filename , sourceFolder + "cmp_" + filename , destinationFolder , "diff" );
155
+ new CompareTool ()
156
+ .compareByContent (destinationFolder + filename , sourceFolder + "cmp_" + filename , destinationFolder ,
157
+ "diff" );
154
158
}
155
159
156
160
@ Test
157
161
public void randomObjectPagesTest () throws IOException {
158
162
String filename = "randomObjectPagesTest.pdf" ;
159
163
int pageCount = 10000 ;
160
164
int [] indexes = new int [pageCount ];
161
- for (int i = 0 ; i < indexes .length ; i ++)
165
+ for (int i = 0 ; i < indexes .length ; i ++) {
162
166
indexes [i ] = i + 1 ;
167
+ }
163
168
164
169
Random rnd = new Random ();
165
170
for (int i = indexes .length - 1 ; i > 0 ; i --) {
@@ -196,8 +201,9 @@ public void randomNumberPagesTest() throws IOException {
196
201
String filename = "randomNumberPagesTest.pdf" ;
197
202
int pageCount = 3000 ;
198
203
int [] indexes = new int [pageCount ];
199
- for (int i = 0 ; i < indexes .length ; i ++)
204
+ for (int i = 0 ; i < indexes .length ; i ++) {
200
205
indexes [i ] = i + 1 ;
206
+ }
201
207
202
208
Random rnd = new Random ();
203
209
for (int i = indexes .length - 1 ; i > 0 ; i --) {
@@ -245,8 +251,9 @@ public void insertFlushedPageTest() {
245
251
pdfDoc .addPage (1 , page );
246
252
pdfDoc .close ();
247
253
} catch (PdfException e ) {
248
- if (PdfException .FlushedPageCannotBeAddedOrInserted .equals (e .getMessage ()))
254
+ if (PdfException .FlushedPageCannotBeAddedOrInserted .equals (e .getMessage ())) {
249
255
error = true ;
256
+ }
250
257
}
251
258
252
259
Assert .assertTrue (error );
@@ -267,8 +274,9 @@ public void addFlushedPageTest() {
267
274
pdfDoc .addPage (page );
268
275
pdfDoc .close ();
269
276
} catch (PdfException e ) {
270
- if (PdfException .FlushedPageCannotBeAddedOrInserted .equals (e .getMessage ()))
277
+ if (PdfException .FlushedPageCannotBeAddedOrInserted .equals (e .getMessage ())) {
271
278
error = true ;
279
+ }
272
280
}
273
281
274
282
Assert .assertTrue (error );
@@ -289,7 +297,6 @@ public void removeFlushedPage() throws IOException {
289
297
removedPage .flush ();
290
298
pdfDoc .removePage (removedPage );
291
299
292
-
293
300
for (int i = 0 ; i < pageCount ; i ++) {
294
301
PdfPage page = pdfDoc .addNewPage ();
295
302
page .getPdfObject ().put (PageNum , new PdfNumber (i + 1 ));
@@ -323,8 +330,9 @@ int verifyIntegrity(PdfPagesTree pagesTree) {
323
330
List <PdfPages > parents = pagesTree .getParents ();
324
331
int from = 0 ;
325
332
for (int i = 0 ; i < parents .size (); i ++) {
326
- if (parents .get (i ).getFrom () != from )
333
+ if (parents .get (i ).getFrom () != from ) {
327
334
return i ;
335
+ }
328
336
from = parents .get (i ).getFrom () + parents .get (i ).getCount ();
329
337
}
330
338
return -1 ;
@@ -390,7 +398,7 @@ public void getPageByDictionary() throws IOException {
390
398
String filename = sourceFolder + "1000PagesDocument.pdf" ;
391
399
PdfReader reader = new PdfReader (filename );
392
400
PdfDocument pdfDoc = new PdfDocument (reader );
393
- PdfObject [] pageDictionaries = new PdfObject []{
401
+ PdfObject [] pageDictionaries = new PdfObject [] {
394
402
pdfDoc .getPdfObject (4 ),
395
403
pdfDoc .getPdfObject (255 ),
396
404
pdfDoc .getPdfObject (512 ),
@@ -415,7 +423,8 @@ public void removePageWithFormFieldsTest() throws IOException {
415
423
PdfDocument pdfDoc = new PdfDocument (new PdfReader (filename ));
416
424
pdfDoc .removePage (1 );
417
425
418
- PdfArray fields = pdfDoc .getCatalog ().getPdfObject ().getAsDictionary (PdfName .AcroForm ).getAsArray (PdfName .Fields );
426
+ PdfArray fields = pdfDoc .getCatalog ().getPdfObject ().getAsDictionary (PdfName .AcroForm )
427
+ .getAsArray (PdfName .Fields );
419
428
PdfDictionary field = (PdfDictionary ) fields .get (0 );
420
429
PdfDictionary kid = (PdfDictionary ) field .getAsArray (PdfName .Kids ).get (0 );
421
430
Assert .assertEquals (6 , kid .keySet ().size ());
@@ -443,11 +452,15 @@ public void getPageSizeWithInheritedMediaBox() throws IOException {
443
452
public void pageThumbnailTest () throws Exception {
444
453
String filename = "pageThumbnail.pdf" ;
445
454
String imageSrc = "icon.jpg" ;
446
- PdfDocument pdfDoc = new PdfDocument (new PdfWriter (destinationFolder + filename ).setCompressionLevel (CompressionConstants .NO_COMPRESSION ));
447
- PdfPage page = pdfDoc .addNewPage ().setThumbnailImage (new PdfImageXObject (ImageDataFactory .create (sourceFolder + imageSrc )));
455
+ PdfDocument pdfDoc = new PdfDocument (
456
+ new PdfWriter (destinationFolder + filename ).setCompressionLevel (CompressionConstants .NO_COMPRESSION ));
457
+ PdfPage page = pdfDoc .addNewPage ()
458
+ .setThumbnailImage (new PdfImageXObject (ImageDataFactory .create (sourceFolder + imageSrc )));
448
459
new PdfCanvas (page ).setFillColor (ColorConstants .RED ).rectangle (100 , 100 , 400 , 400 ).fill ();
449
460
pdfDoc .close ();
450
- new CompareTool ().compareByContent (destinationFolder + filename , sourceFolder + "cmp_" + filename , destinationFolder , "diff" );
461
+ new CompareTool ()
462
+ .compareByContent (destinationFolder + filename , sourceFolder + "cmp_" + filename , destinationFolder ,
463
+ "diff" );
451
464
}
452
465
453
466
@ Test
@@ -498,7 +511,8 @@ private boolean testPageTreeParentsValid(String src) throws com.itextpdf.io.IOEx
498
511
PdfDictionary page_root = pdfDocument .getCatalog ().getPdfObject ().getAsDictionary (PdfName .Pages );
499
512
for (int x = 1 ; x < pdfDocument .getNumberOfPdfObjects (); x ++) {
500
513
PdfObject obj = pdfDocument .getPdfObject (x );
501
- if (obj != null && obj .isDictionary () && ((PdfDictionary ) obj ).getAsName (PdfName .Type ) != null && ((PdfDictionary ) obj ).getAsName (PdfName .Type ).equals (PdfName .Pages )) {
514
+ if (obj != null && obj .isDictionary () && ((PdfDictionary ) obj ).getAsName (PdfName .Type ) != null
515
+ && ((PdfDictionary ) obj ).getAsName (PdfName .Type ).equals (PdfName .Pages )) {
502
516
if (obj != page_root ) {
503
517
PdfDictionary parent = ((PdfDictionary ) obj ).getAsDictionary (PdfName .Parent );
504
518
if (parent == null ) {
@@ -554,7 +568,8 @@ public void pageGetMediaBoxTooManyArgumentsTest() throws IOException {
554
568
@ Test
555
569
public void pageGetMediaBoxNotEnoughArgumentsTest () throws IOException {
556
570
junitExpectedException .expect (PdfException .class );
557
- junitExpectedException .expectMessage (MessageFormatUtil .format (PdfException .WRONGMEDIABOXSIZETOOFEWARGUMENTS ,3 ));
571
+ junitExpectedException
572
+ .expectMessage (MessageFormatUtil .format (PdfException .WRONGMEDIABOXSIZETOOFEWARGUMENTS , 3 ));
558
573
559
574
PdfReader reader = new PdfReader (sourceFolder + "helloWorldMediaboxNotEnoughArguments.pdf" );
560
575
@@ -565,18 +580,94 @@ public void pageGetMediaBoxNotEnoughArgumentsTest() throws IOException {
565
580
Assert .fail ("Exception was not thrown" );
566
581
}
567
582
583
+ @ Test
584
+ public void insertIntermediateParentTest () throws IOException {
585
+ String filename = "insertIntermediateParentTest.pdf" ;
586
+ PdfReader reader = new PdfReader (sourceFolder + filename );
587
+ PdfWriter writer = new PdfWriter (new ByteArrayOutputStream ());
588
+ PdfDocument pdfDoc = new PdfDocument (reader , writer , new StampingProperties ().useAppendMode ());
589
+
590
+ PdfPage page = pdfDoc .getFirstPage ();
591
+
592
+ PdfPages pdfPages = new PdfPages (page .parentPages .getFrom (), pdfDoc , page .parentPages );
593
+ page .parentPages .getKids ().set (0 , pdfPages .getPdfObject ());
594
+ page .parentPages .decrementCount ();
595
+ pdfPages .addPage (page .getPdfObject ());
596
+
597
+ pdfDoc .close ();
598
+
599
+ Assert .assertTrue (page .getPdfObject ().isModified ());
600
+ }
601
+
568
602
@ Test
569
603
public void verifyPagesAreNotReadOnOpenTest () throws IOException {
570
604
String srcFile = sourceFolder + "taggedOnePage.pdf" ;
571
605
CustomPdfReader reader = new CustomPdfReader (srcFile );
572
606
PdfDocument document = new PdfDocument (reader );
573
607
document .close ();
574
- Assert .assertFalse (reader .undesiredPageHasBeenRead );
608
+ Assert .assertFalse (reader .pagesAreRead );
575
609
}
576
610
611
+ @ Test
612
+ public void readPagesInBlocksTest () throws IOException {
613
+ String srcFile = sourceFolder + "docWithBalancedPageTree.pdf" ;
614
+ int maxAmountOfPagesReadAtATime = 0 ;
615
+ CustomPdfReader reader = new CustomPdfReader (srcFile );
616
+ PdfDocument document = new PdfDocument (reader );
617
+ for (int page = 1 ; page <= document .getNumberOfPages (); page ++) {
618
+ document .getPage (page );
619
+ if (reader .numOfPagesRead > maxAmountOfPagesReadAtATime ) {
620
+ maxAmountOfPagesReadAtATime = reader .numOfPagesRead ;
621
+ }
622
+ reader .numOfPagesRead = 0 ;
623
+ }
624
+
625
+ Assert .assertEquals (111 , document .getNumberOfPages ());
626
+ Assert .assertEquals (10 , maxAmountOfPagesReadAtATime );
627
+
628
+ document .close ();
629
+ }
630
+
631
+ @ Test
632
+ public void readSinglePageTest () throws IOException {
633
+ String srcFile = sourceFolder + "allPagesAreLeaves.pdf" ;
634
+ CustomPdfReader reader = new CustomPdfReader (srcFile );
635
+ reader .setMemorySavingMode (true );
636
+ PdfDocument document = new PdfDocument (reader );
637
+ int amountOfPages = document .getNumberOfPages ();
638
+
639
+ PdfPages pdfPages = document .catalog .getPageTree ().getRoot ();
640
+ PdfArray pageIndRefArray = ((PdfDictionary ) pdfPages .getPdfObject ()).getAsArray (PdfName .Kids );
641
+
642
+ document .getPage (amountOfPages );
643
+ Assert .assertEquals (1 , getAmountOfReadPages (pageIndRefArray ));
644
+
645
+ document .getPage (amountOfPages / 2 );
646
+ Assert .assertEquals (2 , getAmountOfReadPages (pageIndRefArray ));
647
+
648
+ document .getPage (1 );
649
+ Assert .assertEquals (3 , getAmountOfReadPages (pageIndRefArray ));
650
+
651
+ document .close ();
652
+ }
653
+
654
+ private int getAmountOfReadPages (PdfArray pageIndRefArray ) {
655
+ int amountOfLoadedPages = 0 ;
656
+ for (int i = 0 ; i < pageIndRefArray .size (); i ++) {
657
+ if (((PdfIndirectReference ) pageIndRefArray .get (i , false )).refersTo != null ) {
658
+ amountOfLoadedPages ++;
659
+ }
660
+ }
661
+ return amountOfLoadedPages ;
662
+ }
663
+
664
+
665
+
577
666
private class CustomPdfReader extends PdfReader {
578
667
579
- public boolean undesiredPageHasBeenRead = false ;
668
+ public boolean pagesAreRead = false ;
669
+
670
+ public int numOfPagesRead = 0 ;
580
671
581
672
public CustomPdfReader (String filename ) throws IOException {
582
673
super (filename );
@@ -585,8 +676,10 @@ public CustomPdfReader(String filename) throws IOException {
585
676
@ Override
586
677
protected PdfObject readObject (PdfIndirectReference reference ) {
587
678
PdfObject toReturn = super .readObject (reference );
588
- if (reference .getObjNumber () == 6 ) {
589
- undesiredPageHasBeenRead = true ;
679
+ if (toReturn instanceof PdfDictionary
680
+ && PdfName .Page .equals (((PdfDictionary ) toReturn ).get (PdfName .Type ))) {
681
+ numOfPagesRead ++;
682
+ pagesAreRead = true ;
590
683
}
591
684
return toReturn ;
592
685
}
0 commit comments