@@ -24,25 +24,37 @@ This file is part of the iText (R) project.
2424
2525import com .itextpdf .commons .utils .MessageFormatUtil ;
2626import com .itextpdf .io .font .constants .StandardFonts ;
27+ import com .itextpdf .io .image .ImageData ;
28+ import com .itextpdf .io .image .ImageDataFactory ;
2729import com .itextpdf .io .source .ByteArrayOutputStream ;
2830import com .itextpdf .kernel .exceptions .KernelExceptionMessageConstant ;
2931import com .itextpdf .kernel .exceptions .PdfException ;
3032import com .itextpdf .kernel .font .PdfFont ;
3133import com .itextpdf .kernel .font .PdfFontFactory ;
34+ import com .itextpdf .kernel .geom .Rectangle ;
35+ import com .itextpdf .kernel .pdf .OcgPropertiesCopierTest ;
3236import com .itextpdf .kernel .pdf .PdfDictionary ;
3337import com .itextpdf .kernel .pdf .PdfDocument ;
3438import com .itextpdf .kernel .pdf .PdfName ;
39+ import com .itextpdf .kernel .pdf .PdfPage ;
3540import com .itextpdf .kernel .pdf .PdfReader ;
41+ import com .itextpdf .kernel .pdf .PdfResources ;
3642import com .itextpdf .kernel .pdf .PdfWriter ;
43+ import com .itextpdf .kernel .pdf .annot .PdfAnnotation ;
44+ import com .itextpdf .kernel .pdf .annot .PdfTextAnnotation ;
3745import com .itextpdf .kernel .pdf .canvas .PdfCanvas ;
3846import com .itextpdf .kernel .pdf .PdfIndirectReference ;
47+ import com .itextpdf .kernel .pdf .xobject .PdfFormXObject ;
48+ import com .itextpdf .kernel .pdf .xobject .PdfImageXObject ;
3949import com .itextpdf .kernel .utils .CompareTool ;
4050import com .itextpdf .test .ExtendedITextTest ;
4151import java .io .IOException ;
4252import java .util .ArrayList ;
4353import java .util .Collection ;
4454import java .util .Collections ;
4555import java .util .List ;
56+ import java .util .Set ;
57+
4658import org .junit .jupiter .api .AfterAll ;
4759import org .junit .jupiter .api .Assertions ;
4860import org .junit .jupiter .api .BeforeAll ;
@@ -440,6 +452,141 @@ public void testInStamperMode2() throws IOException, InterruptedException {
440452 Assertions .assertNull (new CompareTool ().compareByContent (destinationFolder + "output_layered.pdf" , sourceFolder + "cmp_output_layered.pdf" , destinationFolder , "diff" ));
441453 }
442454
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+
443590 //TODO DEVSIX-8490 remove this test when implemented
444591 @ Test
445592 public void addSecondParentlayerTest () throws IOException {
0 commit comments