PDAnnotationPolygon.java
/*
* Copyright 2018 The Apache Software Foundation.
*
* Licensed 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 org.apache.pdfbox.pdmodel.interactive.annotation;
import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.graphics.color.PDColor;
import org.apache.pdfbox.pdmodel.interactive.annotation.handlers.PDAppearanceHandler;
import org.apache.pdfbox.pdmodel.interactive.annotation.handlers.PDPolygonAppearanceHandler;
/**
*
* @author Paul King
*/
public class PDAnnotationPolygon extends PDAnnotationMarkup
{
/**
* The type of annotation.
*/
public static final String SUB_TYPE = "Polygon";
private PDAppearanceHandler customAppearanceHandler;
/**
* Constructor.
*/
public PDAnnotationPolygon()
{
getCOSObject().setName(COSName.SUBTYPE, SUB_TYPE);
}
/**
* Constructor.
*
* @param dict The annotations dictionary.
*/
public PDAnnotationPolygon(COSDictionary dict)
{
super(dict);
}
// PDF 32000 specification has "the interior color with which to fill the annotation’s line endings"
// but it is the inside of the polygon.
/**
* This will set interior color.
*
* @param ic color.
*/
public void setInteriorColor(PDColor ic)
{
getCOSObject().setItem(COSName.IC, ic.toCOSArray());
}
/**
* This will retrieve the interior color.
*
* @return object representing the color.
*/
public PDColor getInteriorColor()
{
return getColor(COSName.IC);
}
/**
* This will set the border effect dictionary, specifying effects to be applied when drawing the
* line. This is supported by PDF 1.5 and higher.
*
* @param be The border effect dictionary to set.
*
*/
public void setBorderEffect(PDBorderEffectDictionary be)
{
getCOSObject().setItem(COSName.BE, be);
}
/**
* This will retrieve the border effect dictionary, specifying effects to be applied used in
* drawing the line.
*
* @return The border effect dictionary
*/
public PDBorderEffectDictionary getBorderEffect()
{
COSDictionary be = getCOSObject().getCOSDictionary(COSName.BE);
return be != null ? new PDBorderEffectDictionary(be) : null;
}
/**
* This will retrieve the numbers that shall represent the alternating horizontal and vertical
* coordinates.
*
* @return An array of floats representing the alternating horizontal and vertical coordinates.
*/
public float[] getVertices()
{
COSArray array = getCOSObject().getCOSArray(COSName.VERTICES);
return array != null ? array.toFloatArray() : null;
}
/**
* This will set the numbers that shall represent the alternating horizontal and vertical
* coordinates.
*
* @param points an array with the numbers that shall represent the alternating horizontal and
* vertical coordinates.
*/
public void setVertices(float[] points)
{
COSArray ar = new COSArray();
ar.setFloatArray(points);
getCOSObject().setItem(COSName.VERTICES, ar);
}
/**
* PDF 2.0: This will retrieve the arrays that shall represent the alternating horizontal
* and vertical coordinates for path building.
*
* @return An array of float arrays, each supplying the operands for a path building operator
* (m, l or c). The first array should have 2 elements, the others should have 2 or 6 elements.
*/
public float[][] getPath()
{
COSArray array = getCOSObject().getCOSArray(COSName.PATH);
if (array != null)
{
float[][] pathArray = new float[array.size()][];
for (int i = 0; i < array.size(); ++i)
{
COSBase base2 = array.getObject(i);
if (base2 instanceof COSArray)
{
pathArray[i] = ((COSArray) base2).toFloatArray();
}
else
{
pathArray[i] = new float[0];
}
}
return pathArray;
}
return null;
}
/**
* Set a custom appearance handler for generating the annotations appearance streams.
*
* @param appearanceHandler
*/
public void setCustomAppearanceHandler(PDAppearanceHandler appearanceHandler)
{
customAppearanceHandler = appearanceHandler;
}
@Override
public void constructAppearances()
{
this.constructAppearances(null);
}
@Override
public void constructAppearances(PDDocument document)
{
if (customAppearanceHandler == null)
{
PDPolygonAppearanceHandler appearanceHandler = new PDPolygonAppearanceHandler(this, document);
appearanceHandler.generateAppearanceStreams();
}
else
{
customAppearanceHandler.generateAppearanceStreams();
}
}
}