net.padaf.preflight.graphics.ShadingPattern.java Source code

Java tutorial

Introduction

Here is the source code for net.padaf.preflight.graphics.ShadingPattern.java

Source

/*******************************************************************************
 * Copyright 2010 Atos Worldline SAS
 * 
 * Licensed by Atos Worldline SAS under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * Atos Worldline SAS licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 * 
 *       http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/
package net.padaf.preflight.graphics;

import static net.padaf.preflight.ValidationConstants.DICTIONARY_KEY_TYPE;
import static net.padaf.preflight.ValidationConstants.ERROR_GRAPHIC_INVALID_PATTERN_DEFINITION;
import static net.padaf.preflight.ValidationConstants.PATTERN_KEY_SHADING;
import static net.padaf.preflight.ValidationConstants.PATTERN_KEY_SHADING_TYPE;
import static net.padaf.preflight.ValidationConstants.TRANPARENCY_DICTIONARY_KEY_EXTGSTATE;
import static net.padaf.preflight.ValidationConstants.XOBJECT_DICTIONARY_KEY_COLOR_SPACE;

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

import net.padaf.preflight.DocumentHandler;
import net.padaf.preflight.ValidationException;
import net.padaf.preflight.ValidationResult.ValidationError;
import net.padaf.preflight.graphics.color.ColorSpaceHelper;
import net.padaf.preflight.graphics.color.ColorSpaceHelperFactory;
import net.padaf.preflight.graphics.color.ColorSpaceHelperFactory.ColorSpaceRestriction;
import net.padaf.preflight.utils.COSUtils;

import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSDocument;
import org.apache.pdfbox.cos.COSName;

/**
 * This class process the validation of a ShadingPattern object.
 */
public class ShadingPattern implements XObjectValidator {
    /**
     * COSDictionary which represent the shading pattern.
     */
    private COSDictionary pattern = null;
    /**
     * The COSDocument which contains the shading pattern to check.
     */
    private COSDocument cosDoc = null;
    /**
     * The document handler which contains useful information to process the
     * validation.
     */
    private DocumentHandler documentHandler = null;

    /**
     * @param _handler
     *          DocumentHandler used to initialize "documentHandler" and "cosDoc"
     *          attributes.
     * @param _pattern
     *          COSDictionary used to initialize the shading pattern to validate.
     */
    public ShadingPattern(DocumentHandler _handler, COSDictionary _pattern) {
        this.documentHandler = _handler;
        this.pattern = _pattern;
        this.cosDoc = this.documentHandler.getDocument().getDocument();
    }

    /**
     * Because of a Shading Pattern can be used as an Indirect Object or Directly
     * define in an other dictionary, there are two ways to obtain the Shading
     * Pattern dictionary according to the pattern attribute. This method returns
     * the Shading pattern dictionary represented by the pattern attribute or
     * contained in it.
     * 
     * This is the first method called by the validate method.
     * 
     * @param errors
     *          the list of error to update if there are no Shading pattern in the
     *          pattern COSDictionary.
     * @return the ShadingPattern dictionary
     */
    protected COSDictionary getShadingDictionary(List<ValidationError> errors) {
        if (!"Shading".equals(pattern.getNameAsString(COSName.getPDFName(DICTIONARY_KEY_TYPE)))) {
            COSBase shading = pattern.getItem(COSName.getPDFName(PATTERN_KEY_SHADING));
            if (shading == null) {
                errors.add(new ValidationError(ERROR_GRAPHIC_INVALID_PATTERN_DEFINITION));
                return null;
            }
            return COSUtils.getAsDictionary(shading, cosDoc);
        } else {
            return pattern;
        }
    }

    /**
     * Checks if the given shading pattern contains the ShadingType entry and if
     * the ColorSapce entry is consistent which rules of the PDF Reference and the
     * ISO 190005-1:2005 Specification.
     * 
     * This method is called by the validate method.
     * 
     * @param shadingDict
     *          the Shading pattern dictionary to check
     * @param errors
     *          the list of error to update if the validation fails
     * @return true if the Shading pattern is valid, false otherwise.
     * @throws ValidationException
     */
    protected boolean checkShadingDictionary(COSDictionary shadingDict, List<ValidationError> errors)
            throws ValidationException {
        if (shadingDict.getItem(COSName.getPDFName(PATTERN_KEY_SHADING_TYPE)) == null) {
            errors.add(new ValidationError(ERROR_GRAPHIC_INVALID_PATTERN_DEFINITION));
            return false;
        }

        COSBase csImg = shadingDict.getItem(COSName.getPDFName(XOBJECT_DICTIONARY_KEY_COLOR_SPACE));
        ColorSpaceHelper csh = ColorSpaceHelperFactory.getColorSpaceHelper(csImg, documentHandler,
                ColorSpaceRestriction.NO_PATTERN);
        return csh.validate(errors);
    }

    /**
     * Check the Extended Graphic State contains in the ShadingPattern dictionary
     * if it is present. To check this ExtGState, this method uses the
     * net.awl.edoc.pdfa.validation.graphics.ExtGStateContainer object.
     * 
     * @param errors
     *          the list of error to update if the validation fails
     * @return true is the ExtGState is missing or valid, false otherwise.
     * @throws ValidationException
     */
    protected boolean checkGraphicState(List<ValidationError> errors) throws ValidationException {
        COSDictionary resources = (COSDictionary) this.pattern
                .getDictionaryObject(TRANPARENCY_DICTIONARY_KEY_EXTGSTATE);
        if (resources != null) {
            ExtGStateContainer extContainer = new ExtGStateContainer(resources, cosDoc);
            return extContainer.validateTransparencyRules(errors);
        }
        return true;
    }

    /*
     * (non-Javadoc)
     * 
     * @see net.awl.edoc.pdfa.validation.graphics.XObjectValidator#validate()
     */
    public List<ValidationError> validate() throws ValidationException {
        List<ValidationError> result = new ArrayList<ValidationError>();
        COSDictionary shading = getShadingDictionary(result);
        if (shading != null) {
            boolean isValid = checkShadingDictionary(shading, result);
            isValid = isValid && checkGraphicState(result);
        }
        return result;
    }
}