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

de.intarsys.pdf.pd.PDAnnotation Maven / Gradle / Ivy

/*
 * Copyright (c) 2007, intarsys consulting GmbH
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * - Redistributions of source code must retain the above copyright notice,
 *   this list of conditions and the following disclaimer.
 *
 * - Redistributions in binary form must reproduce the above copyright notice,
 *   this list of conditions and the following disclaimer in the documentation
 *   and/or other materials provided with the distribution.
 *
 * - Neither the name of intarsys nor the names of its contributors may be used
 *   to endorse or promote products derived from this software without specific
 *   prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
package de.intarsys.pdf.pd;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import de.intarsys.pdf.cds.CDSDate;
import de.intarsys.pdf.cds.CDSRectangle;
import de.intarsys.pdf.cos.COSArray;
import de.intarsys.pdf.cos.COSBasedObject;
import de.intarsys.pdf.cos.COSDictionary;
import de.intarsys.pdf.cos.COSInteger;
import de.intarsys.pdf.cos.COSName;
import de.intarsys.pdf.cos.COSObject;
import de.intarsys.pdf.cos.COSStream;

/**
 * An Annotation is an abstract object that allows a PDF document to be changed
 * and extended in a variety of ways. Annotations are recorded with a page in
 * the PDF document. The behavior of an annotation depends on the subtype.
 */
public abstract class PDAnnotation extends PDObject implements
		IAdditionalActionSupport {
	/**
	 * The meta class implementation
	 */
	public static class MetaClass extends PDObject.MetaClass {
		protected MetaClass(Class instanceClass) {
			super(instanceClass);
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see de.intarsys.pdf.cos.COSBasedObject.MetaClass#doDetermineClass(de.intarsys.pdf.cos.COSObject)
		 */
		@Override
		protected COSBasedObject.MetaClass doDetermineClass(COSObject object) {
			if (!(object instanceof COSDictionary)) {
				return null;
			}
			COSName type = ((COSDictionary) object).get(DK_Subtype).asName();
			if (PDWidgetAnnotation.CN_Subtype_Widget.equals(type)) {
				return PDWidgetAnnotation.META;
			}
			if (PDLinkAnnotation.CN_Subtype_Link.equals(type)) {
				return PDLinkAnnotation.META;
			}
			if (PDMarkupAnnotation.CN_Subtype_Ink.equals(type)) {
				return PDInkAnnotation.META;
			}
			if (PDMarkupAnnotation.CN_Subtype_Square.equals(type)) {
				return PDSquareAnnotation.META;
			}
			if (PDMarkupAnnotation.CN_Subtype_Circle.equals(type)) {
				return PDCircleAnnotation.META;
			}
			if (PDMarkupAnnotation.CN_Subtype_Line.equals(type)) {
				return PDLineAnnotation.META;
			}
			if (PDMarkupAnnotation.CN_Subtype_Polygon.equals(type)) {
				return PDPolygonAnnotation.META;
			}
			if (PDMarkupAnnotation.CN_Subtype_PolyLine.equals(type)) {
				return PDPolylineAnnotation.META;
			}
			if (PDTextMarkupAnnotation.CN_Subtype_Highlight.equals(type)) {
				return PDHighlightAnnotation.META;
			}
			if (PDTextMarkupAnnotation.CN_Subtype_Underline.equals(type)) {
				return PDUnderlineAnnotation.META;
			}
			if (PDTextMarkupAnnotation.CN_Subtype_Squiggly.equals(type)) {
				return PDSquigglyAnnotation.META;
			}
			if (PDTextMarkupAnnotation.CN_Subtype_StrikeOut.equals(type)) {
				return PDStrikeOutAnnotation.META;
			}
			if (PDPopupAnnotation.CN_Subtype_Popup.equals(type)) {
				return PDPopupAnnotation.META;
			}
			if (PDTextAnnotation.CN_Subtype_Text.equals(type)) {
				return PDTextAnnotation.META;
			}
			if (PDFileAttachmentAnnotation.CN_Subtype_FileAttachment
					.equals(type)) {
				return PDFileAttachmentAnnotation.META;
			}
			if (PDStampAnnotation.CN_Subtype_Stamp.equals(type)) {
				return PDStampAnnotation.META;
			}
			return PDAnyAnnotation.META;
		}

		@Override
		public Class getRootClass() {
			return PDAnnotation.class;
		}
	}

	/** The meta class instance */
	public static final MetaClass META = new MetaClass(MetaClass.class
			.getDeclaringClass());

	public static final COSName DK_Contents = COSName.constant("Contents"); //$NON-NLS-1$

	public static final COSName DK_P = COSName.constant("P"); //$NON-NLS-1$

	public static final COSName DK_Rect = COSName.constant("Rect"); //$NON-NLS-1$

	public static final COSName DK_NM = COSName.constant("NM"); //$NON-NLS-1$

	public static final COSName DK_M = COSName.constant("M"); //$NON-NLS-1$

	/**
	 * The name for the F entry.
	 * 

* Currently: *

*
    *
  • Bit 1: Invisible *
  • Bit 2: Hidden *
  • Bit 3: Print *
  • Bit 4: NoZoom *
  • Bit 5: NoRotate *
  • Bit 6: NoView *
  • Bit 7: ReadOnly *
  • Bit 8: Locked *
  • Bit 9: ToggleNoView *
*/ public static final COSName DK_F = COSName.constant("F"); //$NON-NLS-1$ public static final COSName DK_BS = COSName.constant("BS"); //$NON-NLS-1$ public static final COSName DK_Border = COSName.constant("Border"); //$NON-NLS-1$ public static final COSName DK_AP = COSName.constant("AP"); //$NON-NLS-1$ public static final COSName DK_AS = COSName.constant("AS"); //$NON-NLS-1$ public static final COSName DK_C = COSName.constant("C"); //$NON-NLS-1$ public static final COSName DK_CA = COSName.constant("CA"); //$NON-NLS-1$//PDF v1.4 public static final COSName DK_IC = COSName.constant("IC"); //$NON-NLS-1$//PDF v1.4 public static final COSName DK_A = COSName.constant("A"); //$NON-NLS-1$ public static final COSName DK_StructParent = COSName .constant("StructParent"); //$NON-NLS-1$ public static final COSName DK_OC = COSName.constant("OC"); //$NON-NLS-1$ public static final COSName CN_Type_Annot = COSName.constant("Annot"); //$NON-NLS-1$ /** supported additional action triggers */ public static final Set ANNOTATION_ACTION_TRIGGERS; static { ANNOTATION_ACTION_TRIGGERS = new HashSet(11); ANNOTATION_ACTION_TRIGGERS.add("E"); //$NON-NLS-1$ ANNOTATION_ACTION_TRIGGERS.add("X"); //$NON-NLS-1$ ANNOTATION_ACTION_TRIGGERS.add("D"); //$NON-NLS-1$ ANNOTATION_ACTION_TRIGGERS.add("U"); //$NON-NLS-1$ ANNOTATION_ACTION_TRIGGERS.add("Fo"); //$NON-NLS-1$ ANNOTATION_ACTION_TRIGGERS.add("BI"); //$NON-NLS-1$ ANNOTATION_ACTION_TRIGGERS.add("PO"); //$NON-NLS-1$ ANNOTATION_ACTION_TRIGGERS.add("PC"); //$NON-NLS-1$ ANNOTATION_ACTION_TRIGGERS.add("PV"); //$NON-NLS-1$ ANNOTATION_ACTION_TRIGGERS.add("PI"); //$NON-NLS-1$ } /** * Copy the receivers appearance dictionary. * * @param appDict * THe appearance dictionary. * * @return A copy of the appearance dictionary. */ protected static COSDictionary copyAppearanceDict(COSDictionary appDict) { if (appDict == null) { return null; } COSDictionary result = COSDictionary.create(); for (Iterator i = appDict.entryIterator(); i.hasNext();) { Map.Entry entry = (Map.Entry) i.next(); COSName key = (COSName) entry.getKey(); COSObject value = (COSObject) entry.getValue(); if (value instanceof COSDictionary) { COSDictionary oldDict = (COSDictionary) value; value = copyAppearanceDictInner(oldDict); } else { if (value instanceof COSStream) { value = value.copyShallow(); } } result.put(key, value); } return result; } /** * When the appearance dictionary has multiple states, this methos copies * the inner appearance dictionaries. * * @param stateDict * An inner appearance dictionary. * * @return A copy of the inner appearance dict. */ protected static COSDictionary copyAppearanceDictInner( COSDictionary stateDict) { COSDictionary result = COSDictionary.create(); for (Iterator i = stateDict.entryIterator(); i.hasNext();) { Map.Entry entry = (Map.Entry) i.next(); COSName key = (COSName) entry.getKey(); COSObject value = (COSObject) entry.getValue(); if (value instanceof COSStream) { value = value.copyShallow(); } result.put(key, value); } return result; } private AnnotationFlags flags; private PDBorderStyle cachedBorderStyle; private CDSRectangle cachedRectangle; /** * Create the receiver class from an already defined {@link COSDictionary}. * NEVER use the constructor directly. * * @param object * the PDDocument containing the new object */ protected PDAnnotation(COSObject object) { super(object); } /** * Add a {@link PDAction} to be executed when this is "activated". * * @param newAction * The {@link PDAction} to be executed. */ public void addAction(PDAction newAction) { if (newAction != null) { if (getAction() == null) { setAction(newAction); } else { getAction().addNext(newAction); } } } /** * The annotation flags in its integer representation. * * @return The annotation flags in its integer representation. */ public int basicGetFlags() { return getFieldInt(DK_F, 0); } /** * Assign the annotation flags in integer representation. * * @param newFlags * The new annotation flags. */ public void basicSetFlags(int newFlags) { if (newFlags != 0) { // default cosSetField(DK_F, COSInteger.create(newFlags)); } else { cosRemoveField(DK_F); } } /** * true if this can receive the focus in an interactive * viewer. * * @return true if this can receive the focus in an * interactive viewer. */ public boolean canReceiveFocus() { return !isReadOnly() && !isHidden() && !isNoView() && !isInvisible() && !isLocked(); } /** * Check the annotations internal constraints. * */ protected void checkRectangle(CDSRectangle rect) { float newWidth = rect.getWidth(); float newHeight = rect.getHeight(); if (newWidth <= 0 && newHeight <= 0) { newWidth = getDefaultWidth(); newHeight = getDefaultHeight(); } if (newWidth < getMinWidth()) { newWidth = getMinWidth(); } if (newHeight < getMinHeight()) { newHeight = getMinHeight(); } rect.resizeTo(newWidth, newHeight); } /** * Create a copy of the receiver. * * @return A copy of the receiver. */ public PDAnnotation copy() { // can not use copyNet as there are backward references. COSDictionary dict = (COSDictionary) cosGetDict().copyShallow(); PDAnnotation copy = (PDAnnotation) PDAnnotation.META .createFromCos(dict); // kill page parent copy.cosRemoveField(DK_P); // kill form parent copy.cosRemoveField(PDAcroFormField.DK_Parent); // copy.cosRemoveField(PDAcroFormField.DK_T); // copy.cosRemoveField(PDAcroFormField.DK_TU); // kill modification copy.cosRemoveField(DK_M); // kill value from form field copy.cosRemoveField(PDAcroFormField.DK_V); // create new appearance COSDictionary newAppearance = copyAppearanceDict(cosGetField(DK_AP) .asDictionary()); copy.cosSetField(DK_AP, newAppearance); return copy; } /* * (non-Javadoc) * * @see de.intarsys.pdf.pd.PDObject#cosGetExpectedType() */ @Override protected COSName cosGetExpectedType() { return CN_Type_Annot; } /** * @deprecated */ @Deprecated public void dispose() { PDPage page = PDAnnotationTools.getPage(this); if (page != null) { page.removeAnnotation(this); } } /** * The {@link PDAction} to be executed when this is "activated". * * @return The {@link PDAction} to be executed when this is "activated". */ public PDAction getAction() { COSObject cosObject = cosGetField(DK_A); if (cosObject.isNull()) { return null; } return (PDAction) PDAction.META.createFromCos(cosObject); } /* * (non-Javadoc) * * @see de.intarsys.pdf.pd.IAdditionalActionSupport#getAdditionalActions() */ public PDAdditionalActions getAdditionalActions() { COSDictionary field = cosGetField(DK_AA).asDictionary(); return (PDAdditionalActions) PDAdditionalActions.META .createFromCos(field); } /** * The visual appearance of this. * * @return The {@link PDAction} to be executed when this is "activated". */ public PDAppearance getAppearance() { COSObject cosObject = cosGetField(DK_AP); if (cosObject.isNull()) { return null; } return (PDAppearance) PDAppearance.META.createFromCos(cosObject); } /** * The visual appearance state of this. This state selects an appearance * within its {@link PDAppearance}. * * @return The visual appearance state of this. */ public COSName getAppearanceState() { return cosGetField(DK_AS).asName(); } /** * All defined appearance states in this. * * @return All defined appearance states in this. */ public Set getAppearanceStates() { Set result = new HashSet(); COSDictionary ap = cosGetField(DK_AP).asDictionary(); if (ap != null) { COSDictionary states; states = ap.get(PDAppearance.DK_N).asDictionary(); if (states != null) { result.addAll(states.keySet()); } states = ap.get(PDAppearance.DK_D).asDictionary(); if (states != null) { result.addAll(states.keySet()); } states = ap.get(PDAppearance.DK_N).asDictionary(); if (states != null) { result.addAll(states.keySet()); } } return result; } /** * The annotations border style. * * @return The annotations border style. */ public PDBorderStyle getBorderStyle() { if (cachedBorderStyle == null) { COSObject cosObject = cosGetField(DK_BS); if (!cosObject.isNull()) { cachedBorderStyle = (PDBorderStyle) PDBorderStyle.META .createFromCos(cosObject); } } return cachedBorderStyle; } /** * The name of the border style. * * @return The name of the border style. */ public COSName getBorderStyleName() { PDBorderStyle bs = getBorderStyle(); if (bs == null) { return PDBorderStyle.DK_S; } return bs.getStyle(); } /** * The width of the annotations border. * * @return The width of the annotations border. */ public float getBorderStyleWidth() { PDBorderStyle bs = getBorderStyle(); if (bs == null) { return 1; } return bs.getWidth(); } /** * The color values for this. * * @return The color values for this. */ public float[] getColor() { return getFieldFixedArray(DK_C, null); } /** * The contents {@link String} for this. * * @return The contents {@link String} for this. */ public String getContents() { return getFieldMLString(DK_Contents, ""); //$NON-NLS-1$ } /** * The default height this annotation likes to have. * * @return The default height this annotation likes to have. */ public float getDefaultHeight() { return 1; } /** * The default width this annotation likes to have. * * @return The default width this annotation likes to have. */ public float getDefaultWidth() { return 1; } /** * The annotation flags. * * @return The annotation flags. */ public AnnotationFlags getFlags() { if (flags == null) { flags = new AnnotationFlags(this); } return flags; } /** * The minimum height this annotation allows. * * @return The minimum height this annotation allows. */ public float getMinHeight() { // assume we have a rectangle appearance float width = getBorderStyleWidth(); return 2 * width; } /** * The minimum width this annotation allows. * * @return The minimum width this annotation allows. */ public float getMinWidth() { // assume we have a rectangle appearance float width = getBorderStyleWidth(); return 2 * width; } /** * The last modification date. * * @return The last modification date. */ public CDSDate getModified() { return CDSDate.createFromCOS(cosGetField(DK_M).asString()); } /** * The annotations name. * * @return The annotations name. */ public String getName() { return getFieldString(DK_NM, null); } /** * Convenience method to access a normalized copy of the receivers * rectangle. * */ public CDSRectangle getNormalizedRectangle() { CDSRectangle tempRect = getRectangle(); if (tempRect == null) { return null; } return tempRect.copy().normalize(); } /** * Try to access the {@link PDPage} we are on. This may return null, as this * reference is not required by the spec. * * @return Try to access the {@link PDPage} we are on. */ public PDPage getPage() { COSObject cosObject = cosGetField(DK_P); return (PDPage) PDPageNode.META.createFromCos(cosObject); } /** * The {@link CDSRectangle} for the visual appearance of this. * * @return The {@link CDSRectangle} for the visual appearance of this. */ public CDSRectangle getRectangle() { if (cachedRectangle == null) { COSArray array = cosGetField(DK_Rect).asArray(); if (array == null) { return null; } cachedRectangle = CDSRectangle.createFromCOS(array); } return cachedRectangle; } protected Integer getStructParent() { COSInteger cosObject = cosGetField(DK_StructParent).asInteger(); if (cosObject != null) { new Integer(cosObject.intValue()); } return null; } /** * A {@link String} representation of this. * * @return A {@link String} representation of this. */ abstract public String getSubtypeLabel(); /* * (non-Javadoc) * * @see de.intarsys.pdf.pd.IAdditionalActionSupport#getSupportedTriggerEvents() */ public Set getSupportedTriggerEvents() { return ANNOTATION_ACTION_TRIGGERS; } /* * (non-Javadoc) * * @see de.intarsys.pdf.pd.PDObject#initializeFromScratch() */ @Override protected void initializeFromScratch() { super.initializeFromScratch(); CDSRectangle initialRect = new CDSRectangle(0, 0, 0, 0); setRectangle(initialRect); } /* * (non-Javadoc) * * @see de.intarsys.pdf.cos.COSBasedObject#invalidateCaches() */ @Override public void invalidateCaches() { super.invalidateCaches(); cachedBorderStyle = null; cachedRectangle = null; } /** * Convenience method to access "Hidden" flag. */ public boolean isHidden() { return getFlags().isHidden(); } /** * Convenience method to access "Invisible" flag. */ public boolean isInvisible() { return getFlags().isInvisible(); } /** * Convenience method to access "Locked" flag. */ public boolean isLocked() { return getFlags().isLocked(); } /** * true if this is a {@link PDMarkupAnnotation}. * * @return true if this is a {@link PDMarkupAnnotation}. */ public boolean isMarkupAnnotation() { return false; } /** * Convenience method to access "NoRotate" flag. */ public boolean isNoRotate() { return getFlags().isNoRotate(); } /** * Convenience method to access "NoView" flag. */ public boolean isNoView() { return getFlags().isNoView(); } /** * Convenience method to access "NoZoom" flag. */ public boolean isNoZoom() { return getFlags().isNoZoom(); } /** * Convenience method to access "Print" flag. */ public boolean isPrint() { return getFlags().isPrint(); } /** * Convenience method to access "ReadOnly" flag. */ public boolean isReadOnly() { return getFlags().isReadOnly(); } /** * Convenience method to access "ToggleNoView" flag. */ public boolean isToggleNoView() { return getFlags().isToggleNoView(); } /** * true if this is a {@link PDWidgetAnnotation}. * * @return true if this is a {@link PDWidgetAnnotation}. */ public boolean isWidgetAnnotation() { return false; } /** * Set the {@link PDAction} for the "activation" of this. * * @param newAction * Set the {@link PDAction} for the "activation" of this. */ public void setAction(PDAction newAction) { setFieldObject(DK_A, newAction); } /* * (non-Javadoc) * * @see de.intarsys.pdf.pd.IAdditionalActionSupport#setActions(de.intarsys.pdf.pd.PDAdditionalActions) */ public void setAdditionalActions(PDAdditionalActions actions) { setFieldObject(DK_AA, actions); } /** * Assign a {@link PDAppearance} to this. * * @param newAppearance * The new {@link PDAppearance}. */ public void setAppearance(PDAppearance newAppearance) { setFieldObject(DK_AP, newAppearance); } /** * Select a concrete {@link PDForm} from the {@link PDAppearance}. * * @param newAppearanceState * The new state name. */ public void setAppearanceState(COSName newAppearanceState) { cosSetField(DK_AS, newAppearanceState); } /** * Assign a {@link PDBorderStyle}. * * @param newBorderStyle * The new {@link PDBorderStyle} */ public void setBorderStyle(PDBorderStyle newBorderStyle) { setFieldObject(DK_BS, newBorderStyle); } /** * Assign a border style name. * * @param newStyle * The new border style name. */ public void setBorderStyleName(COSName newStyle) { PDBorderStyle bs = getBorderStyle(); if (bs == null) { bs = (PDBorderStyle) PDBorderStyle.META.createNew(); setBorderStyle(bs); } bs.setStyle(newStyle); } /** * Assign a border width. * * @param newWidth * The new Border width. */ public void setBorderStyleWidth(float newWidth) { PDBorderStyle bs = getBorderStyle(); if (bs == null) { bs = (PDBorderStyle) PDBorderStyle.META.createNew(); setBorderStyle(bs); } bs.setWidth(newWidth); } /** * Assign a color. * * @param color * The new color values. */ public void setColor(float[] color) { setFieldFixedArray(DK_C, color); } /** * Assign a content {@link String}. * * @param newContents * The new content {@link String}. */ public void setContents(String newContents) { setFieldString(DK_Contents, newContents); } /** * Convenience method to access "Hidden" flag. */ public void setHidden(boolean f) { getFlags().setHidden(f); } /** * Convenience method to access "Invisible" flag. */ public void setInvisible(boolean f) { getFlags().setInvisible(f); } /** * Convenience method to access "Locked" flag. */ public void setLocked(boolean f) { getFlags().setLocked(f); } protected void setModified(String newModified) { setFieldString(DK_M, newModified); } /** * Assign a name. * * @param newName * The new name. */ public void setName(String newName) { setFieldString(DK_NM, newName); } /** * Convenience method to access "NoRotate" flag. */ public void setNoRotate(boolean f) { getFlags().setNoRotate(f); } /** * Convenience method to access "NoView" flag. */ public void setNoView(boolean f) { getFlags().setNoView(f); } /** * Convenience method to access "NoZoom" flag. */ public void setNoZoom(boolean f) { getFlags().setNoZoom(f); } protected void setPage(PDPage newPage) { setFieldObject(DK_P, newPage); } /** * Convenience method to access "Print" flag. */ public void setPrint(boolean f) { getFlags().setPrint(f); } /** * Convenience method to access "ReadOnly" flag. */ public void setReadOnly(boolean readOnly) { getFlags().setReadOnly(readOnly); } /** * Assign a {@link CDSRectangle} for the visual appearance of this. * * @param newRectangle * Assign a {@link CDSRectangle} for the visual appearance of * this. */ public void setRectangle(CDSRectangle newRectangle) { checkRectangle(newRectangle); COSObject oldValue = setFieldObject(DK_Rect, newRectangle); CDSRectangle oldRectangle = CDSRectangle.createFromCOS(oldValue .asArray()); if (oldRectangle != null) { updateStateRectangle(oldRectangle, newRectangle); } } protected void setStructParent(Integer newStructParent) { if (newStructParent != null) { setFieldInt(DK_StructParent, newStructParent.intValue()); } else { cosRemoveField(DK_StructParent); } } /** * Convenience method to access "ToggleNoView" flag. */ public void setToggleNoView(boolean f) { getFlags().setToggleNoView(f); } /** * true if print flag can be selected/changed for this kind * of annotation. * * @return true if print flag can be selected/changed for * this kind of annotation. */ public boolean supportsPrint() { return true; } /* * (non-Javadoc) * * @see de.intarsys.pdf.pd.PDObject#toString() */ @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("Annotation: "); //$NON-NLS-1$ sb.append(cosGetSubtype()); sb.append(" "); //$NON-NLS-1$ if (isWidgetAnnotation()) { PDAcroFormField field = (PDAcroFormField) PDAcroFormField.META .createFromCos(cosGetDict()); sb.append(field.getQualifiedName()); sb.append(" "); //$NON-NLS-1$ } sb.append(super.toString()); return sb.toString(); } /** * Assign the current date as the date of last modification. */ public void touch() { setFieldObject(PDAnnotation.DK_M, new CDSDate()); } /** * Some annotations need to update internal state after changing the * rectangle. */ protected void updateStateRectangle(CDSRectangle oldRectangle, CDSRectangle newRectangle) { // } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy