@@ -24,25 +24,37 @@ This file is part of the iText (R) project.
24
24
25
25
import com .itextpdf .commons .utils .MessageFormatUtil ;
26
26
import com .itextpdf .io .font .constants .StandardFonts ;
27
+ import com .itextpdf .io .image .ImageData ;
28
+ import com .itextpdf .io .image .ImageDataFactory ;
27
29
import com .itextpdf .io .source .ByteArrayOutputStream ;
28
30
import com .itextpdf .kernel .exceptions .KernelExceptionMessageConstant ;
29
31
import com .itextpdf .kernel .exceptions .PdfException ;
30
32
import com .itextpdf .kernel .font .PdfFont ;
31
33
import com .itextpdf .kernel .font .PdfFontFactory ;
34
+ import com .itextpdf .kernel .geom .Rectangle ;
35
+ import com .itextpdf .kernel .pdf .OcgPropertiesCopierTest ;
32
36
import com .itextpdf .kernel .pdf .PdfDictionary ;
33
37
import com .itextpdf .kernel .pdf .PdfDocument ;
34
38
import com .itextpdf .kernel .pdf .PdfName ;
39
+ import com .itextpdf .kernel .pdf .PdfPage ;
35
40
import com .itextpdf .kernel .pdf .PdfReader ;
41
+ import com .itextpdf .kernel .pdf .PdfResources ;
36
42
import com .itextpdf .kernel .pdf .PdfWriter ;
43
+ import com .itextpdf .kernel .pdf .annot .PdfAnnotation ;
44
+ import com .itextpdf .kernel .pdf .annot .PdfTextAnnotation ;
37
45
import com .itextpdf .kernel .pdf .canvas .PdfCanvas ;
38
46
import com .itextpdf .kernel .pdf .PdfIndirectReference ;
47
+ import com .itextpdf .kernel .pdf .xobject .PdfFormXObject ;
48
+ import com .itextpdf .kernel .pdf .xobject .PdfImageXObject ;
39
49
import com .itextpdf .kernel .utils .CompareTool ;
40
50
import com .itextpdf .test .ExtendedITextTest ;
41
51
import java .io .IOException ;
42
52
import java .util .ArrayList ;
43
53
import java .util .Collection ;
44
54
import java .util .Collections ;
45
55
import java .util .List ;
56
+ import java .util .Set ;
57
+
46
58
import org .junit .jupiter .api .AfterAll ;
47
59
import org .junit .jupiter .api .Assertions ;
48
60
import org .junit .jupiter .api .BeforeAll ;
@@ -440,6 +452,141 @@ public void testInStamperMode2() throws IOException, InterruptedException {
440
452
Assertions .assertNull (new CompareTool ().compareByContent (destinationFolder + "output_layered.pdf" , sourceFolder + "cmp_output_layered.pdf" , destinationFolder , "diff" ));
441
453
}
442
454
455
+ @ Test
456
+ public void testReadAllLayersFromPage1 () throws IOException , InterruptedException {
457
+ PdfDocument pdfDoc = new PdfDocument (new PdfReader (sourceFolder + "input_layered.pdf" ),
458
+ CompareTool .createTestPdfWriter (destinationFolder + "output_layered_2.pdf" ));
459
+
460
+ PdfCanvas canvas = new PdfCanvas (pdfDoc , 1 );
461
+
462
+ //create layer on page
463
+ PdfLayer newLayer = new PdfLayer ("appended" , pdfDoc );
464
+ canvas .setFontAndSize (PdfFontFactory .createFont (StandardFonts .HELVETICA ), 18 );
465
+ PdfLayerTestUtils .addTextInsideLayer (newLayer , canvas , "APPENDED CONTENT" , 200 , 600 );
466
+
467
+ List <PdfLayer > layersFromCatalog = pdfDoc .getCatalog ().getOCProperties (true ).getLayers ();
468
+ Assertions .assertEquals (13 , layersFromCatalog .size ());
469
+ PdfPage page = pdfDoc .getPage (1 );
470
+ Set <PdfLayer > layersFromPage = page .getPdfLayers ();
471
+ Assertions .assertEquals (11 , layersFromPage .size ());
472
+
473
+ pdfDoc .close ();
474
+ Assertions .assertNull (new CompareTool ().compareByContent (destinationFolder + "output_layered_2.pdf" , sourceFolder + "cmp_output_layered_2.pdf" , destinationFolder , "diff" ));
475
+ }
476
+
477
+ @ Test
478
+ public void testReadAllLayersFromPage2 () throws IOException , InterruptedException {
479
+ PdfDocument pdfDoc = new PdfDocument (new PdfReader (sourceFolder + "input_layers_in_resources_xobject.pdf" ));
480
+
481
+ List <PdfLayer > layersFromCatalog = pdfDoc .getCatalog ().getOCProperties (true ).getLayers ();
482
+ Assertions .assertEquals (16 , layersFromCatalog .size ());
483
+ PdfPage page = pdfDoc .getPage (2 );
484
+ Set <PdfLayer > layersFromPage = page .getPdfLayers ();
485
+ //There is 8 ocgs nested under the resources xobject on 2nd page
486
+ Assertions .assertEquals (8 , layersFromPage .size ());
487
+ pdfDoc .close ();
488
+ }
489
+
490
+ @ Test
491
+ public void testReadAllLayersFromDocumentWithComplexOCG () throws IOException , InterruptedException {
492
+ PdfDocument pdfDoc = new PdfDocument (new PdfReader (sourceFolder + "input_complex_layers.pdf" ),
493
+ CompareTool .createTestPdfWriter (destinationFolder + "output_complex_layers.pdf" ));
494
+
495
+ List <PdfLayer > layersFromCatalog = pdfDoc .getCatalog ().getOCProperties (true ).getLayers ();
496
+ Assertions .assertEquals (12 , layersFromCatalog .size ());
497
+ PdfPage page = pdfDoc .getPage (1 );
498
+ Set <PdfLayer > layersFromPage = page .getPdfLayers ();
499
+ Assertions .assertEquals (10 , layersFromPage .size ());
500
+ pdfDoc .close ();
501
+ }
502
+
503
+
504
+ //Read OCGs from different locations (annotations, content streams, xObjects) test block
505
+
506
+ @ Test
507
+ public void testReadOcgFromStreamProperties () throws IOException {
508
+ try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream ()) {
509
+ try (PdfDocument document = new PdfDocument (new PdfWriter (outputStream ))) {
510
+ PdfPage page = document .addNewPage ();
511
+
512
+ PdfResources pdfResource = page .getResources ();
513
+ pdfResource .addProperties (new PdfLayer ("name" , document ).getPdfObject ());
514
+ pdfResource .makeIndirect (document );
515
+
516
+ Set <PdfLayer > layersFromPage = page .getPdfLayers ();
517
+ Assertions .assertEquals (1 , layersFromPage .size ());
518
+ }
519
+ }
520
+ }
521
+
522
+ @ Test
523
+ public void testReadOcgFromAnnotation () throws IOException {
524
+ try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream ()) {
525
+ try (PdfDocument fromDocument = new PdfDocument (new PdfWriter (outputStream ))) {
526
+ PdfPage page = fromDocument .addNewPage ();
527
+ PdfAnnotation annotation = new PdfTextAnnotation (new Rectangle (50 , 10 ));
528
+ annotation .setLayer (new PdfLayer ("name" , fromDocument ));
529
+ page .addAnnotation (annotation );
530
+
531
+ Set <PdfLayer > layersFromPage = page .getPdfLayers ();
532
+ Assertions .assertEquals (1 , layersFromPage .size ());
533
+ }
534
+ }
535
+ }
536
+
537
+ @ Test
538
+ public void testReadOcgFromFlushedAnnotation () throws IOException {
539
+ try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream ()) {
540
+ try (PdfDocument fromDocument = new PdfDocument (new PdfWriter (outputStream ))) {
541
+ PdfPage page = fromDocument .addNewPage ();
542
+ PdfAnnotation annotation = new PdfTextAnnotation (new Rectangle (50 , 10 ));
543
+ annotation .setLayer (new PdfLayer ("name" , fromDocument ));
544
+ page .addAnnotation (annotation );
545
+ annotation .flush ();
546
+
547
+ Set <PdfLayer > layersFromPage = page .getPdfLayers ();
548
+ Assertions .assertEquals (1 , layersFromPage .size ());
549
+ }
550
+ }
551
+ }
552
+
553
+ @ Test
554
+ public void testReadOcgFromApAnnotation () throws IOException {
555
+ try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream ()) {
556
+ try (PdfDocument fromDocument = new PdfDocument (new PdfWriter (outputStream ))) {
557
+ PdfPage page = fromDocument .addNewPage ();
558
+
559
+ PdfAnnotation annotation = new PdfTextAnnotation (new Rectangle (50 , 10 ));
560
+
561
+ PdfFormXObject formXObject = new PdfFormXObject (new Rectangle (50 , 10 ));
562
+ formXObject .setLayer (new PdfLayer ("someName1" , fromDocument ));
563
+ formXObject .makeIndirect (fromDocument );
564
+ PdfDictionary nDict = new PdfDictionary ();
565
+ nDict .put (PdfName .ON , formXObject .getPdfObject ());
566
+ annotation .setAppearance (PdfName .N , nDict );
567
+
568
+ formXObject = new PdfFormXObject (new Rectangle (50 , 10 ));
569
+ formXObject .setLayer (new PdfLayer ("someName2" , fromDocument ));
570
+ PdfResources formResources = formXObject .getResources ();
571
+ formResources .addProperties (new PdfLayer ("someName3" , fromDocument ).getPdfObject ());
572
+ formXObject .makeIndirect (fromDocument );
573
+ PdfDictionary rDict = new PdfDictionary ();
574
+ rDict .put (PdfName .OFF , formXObject .getPdfObject ());
575
+ annotation .setAppearance (PdfName .R , rDict );
576
+
577
+ formXObject = new PdfFormXObject (new Rectangle (50 , 10 ));
578
+ formXObject .setLayer (new PdfLayer ("someName4" , fromDocument ));
579
+ formXObject .makeIndirect (fromDocument );
580
+ annotation .setAppearance (PdfName .D , formXObject .getPdfObject ());
581
+
582
+ page .addAnnotation (annotation );
583
+
584
+ Set <PdfLayer > layersFromPage = page .getPdfLayers ();
585
+ Assertions .assertEquals (4 , layersFromPage .size ());
586
+ }
587
+ }
588
+ }
589
+
443
590
//TODO DEVSIX-8490 remove this test when implemented
444
591
@ Test
445
592
public void addSecondParentlayerTest () throws IOException {
0 commit comments