* @throws DocumentException on error
* @return the button appearance
*/
public PdfAppearance getAppearance() throws IOException, DocumentException {
PdfAppearance app = getBorderAppearance();
LwgRectangle box = new LwgRectangle(app.getBoundingBox());
if ((text == null || text.length() == 0) && (layout == LAYOUT_LABEL_ONLY || (image == null && template == null && iconReference == null))) {
return app;
}
if (layout == LAYOUT_ICON_ONLY && image == null && template == null && iconReference == null)
return app;
BaseFont ufont = getRealFont();
boolean borderExtra = borderStyle == PdfBorderDictionary.STYLE_BEVELED || borderStyle == PdfBorderDictionary.STYLE_INSET;
float h = box.getHeight() - borderWidth * 2;
float bw2 = borderWidth;
if (borderExtra) {
h -= borderWidth * 2;
bw2 *= 2;
}
float offsetX = (borderExtra ? 2 * borderWidth : borderWidth);
offsetX = Math.max(offsetX, 1);
float offX = Math.min(bw2, offsetX);
tp = null;
float textX = Float.NaN;
float textY = 0;
float fsize = fontSize;
float wt = box.getWidth() - 2 * offX - 2;
float ht = box.getHeight() - 2 * offX;
float adj = (iconFitToBounds ? 0 : offX + 1);
int nlayout = layout;
if (image == null && template == null && iconReference == null)
nlayout = LAYOUT_LABEL_ONLY;
LwgRectangle iconBox = null;
while (true) {
switch (nlayout) {
case LAYOUT_LABEL_ONLY:
case LAYOUT_LABEL_OVER_ICON:
if (text != null && text.length() > 0 && wt > 0 && ht > 0) {
fsize = calculateFontSize(wt, ht);
textX = (box.getWidth() - ufont.getWidthPoint(text, fsize)) / 2;
textY = (box.getHeight() - ufont.getFontDescriptor(BaseFont.ASCENT, fsize)) / 2;
}
case LAYOUT_ICON_ONLY:
if (nlayout == LAYOUT_LABEL_OVER_ICON || nlayout == LAYOUT_ICON_ONLY)
iconBox = new LwgRectangle(box.getLeft() + adj, box.getBottom() + adj, box.getRight() - adj, box.getTop() - adj);
break;
case LAYOUT_ICON_TOP_LABEL_BOTTOM:
if (text == null || text.length() == 0 || wt <= 0 || ht <= 0) {
nlayout = LAYOUT_ICON_ONLY;
continue;
}
float nht = box.getHeight() * 0.35f - offX;
if (nht > 0)
fsize = calculateFontSize(wt, nht);
else
fsize = 4;
textX = (box.getWidth() - ufont.getWidthPoint(text, fsize)) / 2;
textY = offX - ufont.getFontDescriptor(BaseFont.DESCENT, fsize);
iconBox = new LwgRectangle(box.getLeft() + adj, textY + fsize, box.getRight() - adj, box.getTop() - adj);
break;
case LAYOUT_LABEL_TOP_ICON_BOTTOM:
if (text == null || text.length() == 0 || wt <= 0 || ht <= 0) {
nlayout = LAYOUT_ICON_ONLY;
continue;
}
nht = box.getHeight() * 0.35f - offX;
if (nht > 0)
fsize = calculateFontSize(wt, nht);
else
fsize = 4;
textX = (box.getWidth() - ufont.getWidthPoint(text, fsize)) / 2;
textY = box.getHeight() - offX - fsize;
if (textY < offX)
textY = offX;
iconBox = new LwgRectangle(box.getLeft() + adj, box.getBottom() + adj, box.getRight() - adj, textY + ufont.getFontDescriptor(BaseFont.DESCENT, fsize));
break;
case LAYOUT_LABEL_LEFT_ICON_RIGHT:
if (text == null || text.length() == 0 || wt <= 0 || ht <= 0) {
nlayout = LAYOUT_ICON_ONLY;
continue;
}
float nw = box.getWidth() * 0.35f - offX;
if (nw > 0)
fsize = calculateFontSize(wt, nw);
else
fsize = 4;
if (ufont.getWidthPoint(text, fsize) >= wt) {
nlayout = LAYOUT_LABEL_ONLY;
fsize = fontSize;
continue;
}
textX = offX + 1;
textY = (box.getHeight() - ufont.getFontDescriptor(BaseFont.ASCENT, fsize)) / 2;
iconBox = new LwgRectangle(textX + ufont.getWidthPoint(text, fsize), box.getBottom() + adj, box.getRight() - adj, box.getTop() - adj);
break;
case LAYOUT_ICON_LEFT_LABEL_RIGHT:
if (text == null || text.length() == 0 || wt <= 0 || ht <= 0) {
nlayout = LAYOUT_ICON_ONLY;
continue;
}
nw = box.getWidth() * 0.35f - offX;
if (nw > 0)
fsize = calculateFontSize(wt, nw);
else
fsize = 4;
if (ufont.getWidthPoint(text, fsize) >= wt) {
nlayout = LAYOUT_LABEL_ONLY;
fsize = fontSize;
continue;
}
textX = box.getWidth() - ufont.getWidthPoint(text, fsize) - offX - 1;
textY = (box.getHeight() - ufont.getFontDescriptor(BaseFont.ASCENT, fsize)) / 2;
iconBox = new LwgRectangle(box.getLeft() + adj, box.getBottom() + adj, textX - 1, box.getTop() - adj);
break;
}
break;
}
if (textY < box.getBottom() + offX)
textY = box.getBottom() + offX;
if (iconBox != null && (iconBox.getWidth() <= 0 || iconBox.getHeight() <= 0))
iconBox = null;
boolean haveIcon = false;
float boundingBoxWidth = 0;
float boundingBoxHeight = 0;
PdfArray matrix = null;
if (iconBox != null) {
if (image != null) {
tp = new PdfTemplate(writer);
tp.setBoundingBox(new LwgRectangle(image));
writer.addDirectTemplateSimple(tp, PdfName.FRM);
tp.addImage(image, image.getWidth(), 0, 0, image.getHeight(), 0, 0);
haveIcon = true;
boundingBoxWidth = tp.getBoundingBox().getWidth();
boundingBoxHeight = tp.getBoundingBox().getHeight();
}
else if (template != null) {
tp = new PdfTemplate(writer);
tp.setBoundingBox(new LwgRectangle(template.getWidth(), template.getHeight()));
writer.addDirectTemplateSimple(tp, PdfName.FRM);
tp.addTemplate(template, template.getBoundingBox().getLeft(), template.getBoundingBox().getBottom());
haveIcon = true;
boundingBoxWidth = tp.getBoundingBox().getWidth();
boundingBoxHeight = tp.getBoundingBox().getHeight();
}
else if (iconReference != null) {
PdfDictionary dic = (PdfDictionary)PdfReader.getPdfObject(iconReference);
if (dic != null) {
LwgRectangle r2 = PdfReader.getNormalizedRectangle(dic.getAsArray(PdfName.BBOX));
matrix = dic.getAsArray(PdfName.MATRIX);
haveIcon = true;
boundingBoxWidth = r2.getWidth();
boundingBoxHeight = r2.getHeight();
}
}
}
if (haveIcon) {
float icx = iconBox.getWidth() / boundingBoxWidth;