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

com.itextpdf.kernel.pdf.PdfObjectWrapper 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;

import com.itextpdf.kernel.exceptions.PdfException;
import com.itextpdf.kernel.exceptions.KernelExceptionMessageConstant;


public abstract class PdfObjectWrapper {


    private T pdfObject = null;

    protected PdfObjectWrapper(T pdfObject) {
        this.pdfObject = pdfObject;
        if (isWrappedObjectMustBeIndirect()) {
            markObjectAsIndirect(this.pdfObject);
        }
    }

    public T getPdfObject() {
        return pdfObject;
    }

    /**
     * Marks object behind wrapper to be saved as indirect.
     *
     * @param document a document the indirect reference belongs to.
     * @param reference a reference which will be assigned for the object behind wrapper.
     * @return object itself.
     */
    public PdfObjectWrapper makeIndirect(PdfDocument document, PdfIndirectReference reference) {
        getPdfObject().makeIndirect(document, reference);
        return this;
    }

    /**
     * Marks object behind wrapper to be saved as indirect.
     *
     * @param document a document the indirect reference will belong to.
     * @return object itself.
     */
    public PdfObjectWrapper makeIndirect(PdfDocument document) {
        return makeIndirect(document, null);
    }

    public PdfObjectWrapper setModified() {
        pdfObject.setModified();
        return this;
    }

    public void flush() {
        pdfObject.flush();
    }

    public boolean isFlushed() {
        return pdfObject.isFlushed();
    }

    /**
     * Defines if the object behind this wrapper must be an indirect object in the
     * resultant document.
     * 

* If this method returns true it doesn't necessarily mean that object * must be in the indirect state at any moment, but rather defines that * when the object will be written to the document it will be transformed into * indirect object if it's not indirect yet. *

* Return value of this method shouldn't depend on any logic, it should return * always true or false. * @return true if in the resultant document the object behind the wrapper * must be indirect, otherwise false. */ protected abstract boolean isWrappedObjectMustBeIndirect(); protected void setPdfObject(T pdfObject){ this.pdfObject = pdfObject; } protected void setForbidRelease() { if (pdfObject != null) { pdfObject.setState(PdfObject.FORBID_RELEASE); } } protected void unsetForbidRelease() { if (pdfObject != null) { pdfObject.clearState(PdfObject.FORBID_RELEASE); } } protected void ensureUnderlyingObjectHasIndirectReference() { if (getPdfObject().getIndirectReference() == null) { throw new PdfException( KernelExceptionMessageConstant.TO_FLUSH_THIS_WRAPPER_UNDERLYING_OBJECT_MUST_BE_ADDED_TO_DOCUMENT); } } protected static void markObjectAsIndirect(PdfObject pdfObject) { if (pdfObject.getIndirectReference() == null) { pdfObject.setState(PdfObject.MUST_BE_INDIRECT); } } /** * Some wrappers use object's indirect reference to obtain the {@code PdfDocument} * to which the object belongs to. For this matter, for these wrappers it is implicitly defined * that they work with indirect objects only. Commonly these wrappers have two constructors: one with * {@code PdfDocument} as parameter to create a new object, and the other one which * wraps around the given {@code PdfObject}. This method should be used in the second * type of constructors to ensure that wrapper will able to obtain the {@code PdfDocument} instance. * * @param object the {@code PdfObject} to be checked if it is indirect. */ protected static void ensureObjectIsAddedToDocument(PdfObject object) { if (object.getIndirectReference() == null) { throw new PdfException(KernelExceptionMessageConstant.OBJECT_MUST_BE_INDIRECT_TO_WORK_WITH_THIS_WRAPPER); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy