All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.itextpdf.kernel.pdf.layer.PdfLayerMembership Maven / Gradle / Ivy

There is a newer version: 9.0.0
Show newest version
/*
    This file is part of the iText (R) project.
    Copyright (c) 1998-2023 Apryse Group NV
    Authors: Apryse Software.

    This program is offered under a commercial and under the AGPL license.
    For commercial licensing, contact us at https://itextpdf.com/sales.  For AGPL licensing, see below.

    AGPL licensing:
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see .
 */
package com.itextpdf.kernel.pdf.layer;

import com.itextpdf.kernel.pdf.PdfArray;
import com.itextpdf.kernel.pdf.PdfDictionary;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfIndirectReference;
import com.itextpdf.kernel.pdf.PdfName;
import com.itextpdf.kernel.pdf.PdfObject;
import com.itextpdf.kernel.pdf.PdfObjectWrapper;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * Content typically belongs to a single optional content group,
 * and is visible when the group is ON and invisible when it is OFF. To express more
 * complex visibility policies, content should not declare itself to belong to an optional
 * content group directly, but rather to an optional content membership dictionary
 * represented by this class.
 *
 * 

* To be able to be wrapped with this {@link PdfObjectWrapper} the {@link PdfObject} * must be indirect. */ public class PdfLayerMembership extends PdfObjectWrapper implements IPdfOCG { /** * Creates a new, empty membership layer. * * @param doc a {@link PdfDocument} where a new empty membership layer creates */ public PdfLayerMembership(PdfDocument doc) { super(new PdfDictionary()); makeIndirect(doc); getPdfObject().put(PdfName.Type, PdfName.OCMD); } /** * Creates a new PdfLayerMembership instance by its PdfDictionary, which must be an indirect object. * * @param membershipDictionary the membership dictionary, must have an indirect reference. */ public PdfLayerMembership(PdfDictionary membershipDictionary) { super(membershipDictionary); ensureObjectIsAddedToDocument(membershipDictionary); if (!PdfName.OCMD.equals(membershipDictionary.getAsName(PdfName.Type))) throw new IllegalArgumentException("Invalid membershipDictionary."); } /** * Gets the collection of the layers this layer membership operates with. * * @return list of {@link PdfLayer layers} this layer membership operates with */ public Collection getLayers() { final PdfObject layers = getPdfObject().get(PdfName.OCGs); if (layers instanceof PdfDictionary) { List list = new ArrayList<>(); list.add(new PdfLayer((PdfDictionary) ((PdfDictionary) layers).makeIndirect(getDocument()))); return list; } else if (layers instanceof PdfArray) { List layerList = new ArrayList<>(); for (int ind = 0; ind < ((PdfArray) layers).size(); ind++) { layerList.add(new PdfLayer(((PdfArray) (((PdfArray) layers).makeIndirect(getDocument()))).getAsDictionary(ind))); } return layerList; } return null; } /** * Adds a new layer to the current layer membership. * @param layer the layer to be added */ public void addLayer(PdfLayer layer) { PdfArray layers = getPdfObject().getAsArray(PdfName.OCGs); if (layers == null) { layers = new PdfArray(); getPdfObject().put(PdfName.OCGs, layers); } layers.add(layer.getPdfObject()); layers.setModified(); } /** * Sets the visibility policy for content belonging to this * membership dictionary. Possible values are AllOn, AnyOn, AnyOff and AllOff. * AllOn - Visible only if all of the entries are ON. * AnyOn - Visible if any of the entries are ON. * AnyOff - Visible if any of the entries are OFF. * AllOff - Visible only if all of the entries are OFF. * The default value is AnyOn. * @param visibilityPolicy the visibility policy */ public void setVisibilityPolicy(PdfName visibilityPolicy) { if (visibilityPolicy == null || !PdfName.AllOn.equals(visibilityPolicy) && !PdfName.AnyOn.equals(visibilityPolicy) && !PdfName.AnyOff.equals(visibilityPolicy) && !PdfName.AllOff.equals(visibilityPolicy)) throw new IllegalArgumentException("Argument: visibilityPolicy"); getPdfObject().put(PdfName.P, visibilityPolicy); getPdfObject().setModified(); } /** * Gets the visibility policy for content belonging to this optional content membership dictionary. * @return the visibility policy for content belonging to this membership dictionary */ public PdfName getVisibilityPolicy() { PdfName visibilityPolicy = getPdfObject().getAsName(PdfName.P); if (visibilityPolicy == null || !visibilityPolicy.equals(PdfName.AllOn) && !visibilityPolicy.equals(PdfName.AllOff) && !visibilityPolicy.equals(PdfName.AnyOn) && !visibilityPolicy.equals(PdfName.AnyOff)) return PdfName.AnyOn; return visibilityPolicy; } /** * Sets the visibility expression for content belonging to this * membership dictionary. * @param visibilityExpression A (nested) array of which the first value is /And, /Or, or /Not * followed by a series of indirect references to OCGs or other visibility * expressions. */ public void setVisibilityExpression(PdfVisibilityExpression visibilityExpression) { getPdfObject().put(PdfName.VE, visibilityExpression.getPdfObject()); getPdfObject().setModified(); } /** * Gets the visibility expression for content belonging to this optional content membership dictionary. * @return the visibility expression for content belonging to this membership dictionary, if not set return null */ public PdfVisibilityExpression getVisibilityExpression() { PdfArray ve = getPdfObject().getAsArray(PdfName.VE); return ve != null ? new PdfVisibilityExpression(ve) : null; } @Override public PdfIndirectReference getIndirectReference() { return getPdfObject().getIndirectReference(); } @Override protected boolean isWrappedObjectMustBeIndirect() { return true; } /** * Gets the {@link PdfDocument} that owns that layer membership. * * @return the {@link PdfDocument} that owns that layer membership */ protected PdfDocument getDocument() { return getPdfObject().getIndirectReference().getDocument(); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy