001: /**
002: * Copyright (c) 2004-2005, www.pdfbox.org
003: * All rights reserved.
004: *
005: * Redistribution and use in source and binary forms, with or without
006: * modification, are permitted provided that the following conditions are met:
007: *
008: * 1. Redistributions of source code must retain the above copyright notice,
009: * this list of conditions and the following disclaimer.
010: * 2. Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: * 3. Neither the name of pdfbox; nor the names of its
014: * contributors may be used to endorse or promote products derived from this
015: * software without specific prior written permission.
016: *
017: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
018: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
019: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
020: * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
021: * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
022: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
023: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
024: * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
025: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
026: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
027: *
028: * http://www.pdfbox.org
029: *
030: */package org.pdfbox.pdmodel.fdf;
031:
032: import org.pdfbox.cos.COSArray;
033: import org.pdfbox.cos.COSBase;
034: import org.pdfbox.cos.COSDictionary;
035:
036: import org.pdfbox.pdmodel.common.COSObjectable;
037: import org.pdfbox.pdmodel.common.PDRange;
038:
039: /**
040: * This represents an Icon fit dictionary for an FDF field.
041: *
042: * @author <a href="mailto:ben@benlitchfield.com">Ben Litchfield</a>
043: * @version $Revision: 1.3 $
044: */
045: public class FDFIconFit implements COSObjectable {
046: private COSDictionary fit;
047:
048: /**
049: * A scale option.
050: */
051: public static final String SCALE_OPTION_ALWAYS = "A";
052: /**
053: * A scale option.
054: */
055: public static final String SCALE_OPTION_ONLY_WHEN_ICON_IS_BIGGER = "B";
056: /**
057: * A scale option.
058: */
059: public static final String SCALE_OPTION_ONLY_WHEN_ICON_IS_SMALLER = "S";
060: /**
061: * A scale option.
062: */
063: public static final String SCALE_OPTION_NEVER = "N";
064:
065: /**
066: * Scale to fill with of annotation, disregarding aspect ratio.
067: */
068: public static final String SCALE_TYPE_ANAMORPHIC = "A";
069: /**
070: * Scale to fit width or height, smaller of two, while retaining aspect ration.
071: */
072: public static final String SCALE_TYPE_PROPORTIONAL = "P";
073:
074: /**
075: * Default constructor.
076: */
077: public FDFIconFit() {
078: fit = new COSDictionary();
079: }
080:
081: /**
082: * Constructor.
083: *
084: * @param f The icon fit dictionary.
085: */
086: public FDFIconFit(COSDictionary f) {
087: fit = f;
088: }
089:
090: /**
091: * Convert this standard java object to a COS object.
092: *
093: * @return The cos object that matches this Java object.
094: */
095: public COSBase getCOSObject() {
096: return fit;
097: }
098:
099: /**
100: * Convert this standard java object to a COS object.
101: *
102: * @return The cos object that matches this Java object.
103: */
104: public COSDictionary getCOSDictionary() {
105: return fit;
106: }
107:
108: /**
109: * This will get the scale option. See the SCALE_OPTION_XXX constants. This
110: * is guaranteed to never return null. Default: Always
111: *
112: * @return The scale option.
113: */
114: public String getScaleOption() {
115: String retval = fit.getNameAsString("SW");
116: if (retval == null) {
117: retval = SCALE_OPTION_ALWAYS;
118: }
119: return retval;
120: }
121:
122: /**
123: * This will set the scale option for the icon. Set the SCALE_OPTION_XXX constants.
124: *
125: * @param option The scale option.
126: */
127: public void setScaleOption(String option) {
128: fit.setName("SW", option);
129: }
130:
131: /**
132: * This will get the scale type. See the SCALE_TYPE_XXX constants. This is
133: * guaranteed to never return null. Default: Proportional
134: *
135: * @return The scale type.
136: */
137: public String getScaleType() {
138: String retval = fit.getNameAsString("S");
139: if (retval == null) {
140: retval = SCALE_TYPE_PROPORTIONAL;
141: }
142: return retval;
143: }
144:
145: /**
146: * This will set the scale type. See the SCALE_TYPE_XXX constants.
147: *
148: * @param scale The scale type.
149: */
150: public void setScaleType(String scale) {
151: fit.setName("S", scale);
152: }
153:
154: /**
155: * This is guaranteed to never return null.<br />
156: *
157: * To quote the PDF Spec
158: * "An array of two numbers between 0.0 and 1.0 indicating the fraction of leftover
159: * space to allocate at the left and bottom of the icon. A value of [0.0 0.0] positions the
160: * icon at the bottom-left corner of the annotation rectangle; a value of [0.5 0.5] centers it
161: * within the rectangle. This entry is used only if the icon is scaled proportionally. Default
162: * value: [0.5 0.5]."
163: *
164: * @return The fractional space to allocate.
165: */
166: public PDRange getFractionalSpaceToAllocate() {
167: PDRange retval = null;
168: COSArray array = (COSArray) fit.getDictionaryObject("A");
169: if (array == null) {
170: retval = new PDRange();
171: retval.setMin(.5f);
172: retval.setMax(.5f);
173: setFractionalSpaceToAllocate(retval);
174: } else {
175: retval = new PDRange(array);
176: }
177: return retval;
178: }
179:
180: /**
181: * This will set frational space to allocate.
182: *
183: * @param space The space to allocate.
184: */
185: public void setFractionalSpaceToAllocate(PDRange space) {
186: fit.setItem("A", space);
187: }
188:
189: /**
190: * This will tell if the icon should scale to fit the annotation bounds. Default: false
191: *
192: * @return A flag telling if the icon should scale.
193: */
194: public boolean shouldScaleToFitAnnotation() {
195: return fit.getBoolean("FB", false);
196: }
197:
198: /**
199: * This will tell the icon to scale.
200: *
201: * @param value The flag value.
202: */
203: public void setScaleToFitAnnotation(boolean value) {
204: fit.setBoolean("FB", value);
205: }
206: }
|