public Object createObject(Attributes atts) {
    JasperPrint jasperPrint = (JasperPrint) digester.peek(digester.getCount() - 2);

    JRBasePrintImage image = new JRBasePrintImage(jasperPrint.getDefaultStyleProvider());

    // get image attributes
    ScaleImageEnum scaleImage =
        ScaleImageEnum.getByName(atts.getValue(JRXmlConstants.ATTRIBUTE_scaleImage));
    if (scaleImage != null) {
      image.setScaleImage(scaleImage);
    }

    HorizontalAlignEnum horizontalAlignment =
        HorizontalAlignEnum.getByName(atts.getValue(JRXmlConstants.ATTRIBUTE_hAlign));
    if (horizontalAlignment != null) {
      image.setHorizontalAlignment(horizontalAlignment);
    }

    VerticalAlignEnum verticalAlignment =
        VerticalAlignEnum.getByName(atts.getValue(JRXmlConstants.ATTRIBUTE_vAlign));
    if (verticalAlignment != null) {
      image.setVerticalAlignment(verticalAlignment);
    }

    String isLazy = atts.getValue(JRXmlConstants.ATTRIBUTE_isLazy);
    if (isLazy != null && isLazy.length() > 0) {
      image.setLazy(Boolean.valueOf(isLazy).booleanValue());
    }

    OnErrorTypeEnum onErrorType =
        OnErrorTypeEnum.getByName(atts.getValue(JRXmlConstants.ATTRIBUTE_onErrorType));
    if (onErrorType != null) {
      image.setOnErrorType(onErrorType);
    }

    image.setLinkType(atts.getValue(JRXmlConstants.ATTRIBUTE_hyperlinkType));
    image.setLinkTarget(atts.getValue(JRXmlConstants.ATTRIBUTE_hyperlinkTarget));
    image.setAnchorName(atts.getValue(JRXmlConstants.ATTRIBUTE_anchorName));
    image.setHyperlinkReference(atts.getValue(JRXmlConstants.ATTRIBUTE_hyperlinkReference));
    image.setHyperlinkAnchor(atts.getValue(JRXmlConstants.ATTRIBUTE_hyperlinkAnchor));

    String hyperlinkPage = atts.getValue(JRXmlConstants.ATTRIBUTE_hyperlinkPage);
    if (hyperlinkPage != null) {
      image.setHyperlinkPage(Integer.valueOf(hyperlinkPage));
    }

    image.setHyperlinkTooltip(atts.getValue(JRXmlConstants.ATTRIBUTE_hyperlinkTooltip));

    String bookmarkLevelAttr = atts.getValue(JRXmlConstants.ATTRIBUTE_bookmarkLevel);
    if (bookmarkLevelAttr != null) {
      image.setBookmarkLevel(Integer.parseInt(bookmarkLevelAttr));
    }

    return image;
  }
  protected void setCommonStyle(JRStyle style, Attributes atts) {
    // get JRElement attributes
    ModeEnum mode = ModeEnum.getByName(atts.getValue(JRXmlConstants.ATTRIBUTE_mode));
    if (mode != null) {
      style.setMode(mode);
    }

    String forecolor = atts.getValue(JRXmlConstants.ATTRIBUTE_forecolor);
    style.setForecolor(JRColorUtil.getColor(forecolor, null));

    String backcolor = atts.getValue(JRXmlConstants.ATTRIBUTE_backcolor);
    style.setBackcolor(JRColorUtil.getColor(backcolor, null));

    // get graphic element attributes
    PenEnum pen = PenEnum.getByName(atts.getValue(JRXmlConstants.ATTRIBUTE_pen));
    if (pen != null) {
      if (log.isWarnEnabled()) {
        log.warn("The 'pen' attribute is deprecated. Use the <pen> tag instead.");
      }

      JRPenUtil.setLinePenFromPen(pen, style.getLinePen());
    }

    FillEnum fill = FillEnum.getByName(atts.getValue(JRXmlConstants.ATTRIBUTE_fill));
    if (fill != null) {
      style.setFill(fill);
    }

    // get rectangle attributes
    String radius = atts.getValue(JRXmlConstants.ATTRIBUTE_radius);
    if (radius != null && radius.length() > 0) {
      style.setRadius(Integer.parseInt(radius));
    }

    // get image attributes
    ScaleImageEnum scaleImage =
        ScaleImageEnum.getByName(atts.getValue(JRXmlConstants.ATTRIBUTE_scaleImage));
    if (scaleImage != null) {
      style.setScaleImage(scaleImage);
    }

    HorizontalAlignEnum horizontalAlignment =
        HorizontalAlignEnum.getByName(atts.getValue(JRXmlConstants.ATTRIBUTE_hAlign));
    if (horizontalAlignment != null) {
      style.setHorizontalAlignment(horizontalAlignment);
    }

    VerticalAlignEnum verticalAlignment =
        VerticalAlignEnum.getByName(atts.getValue(JRXmlConstants.ATTRIBUTE_vAlign));
    if (verticalAlignment != null) {
      style.setVerticalAlignment(verticalAlignment);
    }

    // get box attributes
    PenEnum border = PenEnum.getByName(atts.getValue(JRXmlConstants.ATTRIBUTE_border));
    if (border != null) {
      if (log.isWarnEnabled()) {
        log.warn("The 'border' attribute is deprecated. Use the <pen> tag instead.");
      }
      JRPenUtil.setLinePenFromPen(border, style.getLineBox().getPen());
    }

    Color borderColor =
        JRColorUtil.getColor(atts.getValue(JRXmlConstants.ATTRIBUTE_borderColor), null);
    if (borderColor != null) {
      if (log.isWarnEnabled()) {
        log.warn("The 'borderColor' attribute is deprecated. Use the <pen> tag instead.");
      }
      style.getLineBox().getPen().setLineColor(borderColor);
    }

    String padding = atts.getValue(JRXmlConstants.ATTRIBUTE_padding);
    if (padding != null && padding.length() > 0) {
      if (log.isWarnEnabled()) {
        log.warn("The 'padding' attribute is deprecated. Use the <box> tag instead.");
      }
      style.getLineBox().setPadding(Integer.parseInt(padding));
    }

    border = PenEnum.getByName(atts.getValue(JRXmlConstants.ATTRIBUTE_topBorder));
    if (border != null) {
      if (log.isWarnEnabled()) {
        log.warn("The 'topBorder' attribute is deprecated. Use the <pen> tag instead.");
      }
      JRPenUtil.setLinePenFromPen(border, style.getLineBox().getTopPen());
    }

    borderColor =
        JRColorUtil.getColor(atts.getValue(JRXmlConstants.ATTRIBUTE_topBorderColor), Color.black);
    if (borderColor != null) {
      if (log.isWarnEnabled()) {
        log.warn("The 'topBorderColor' attribute is deprecated. Use the <pen> tag instead.");
      }
      style.getLineBox().getTopPen().setLineColor(borderColor);
    }

    padding = atts.getValue(JRXmlConstants.ATTRIBUTE_topPadding);
    if (padding != null && padding.length() > 0) {
      if (log.isWarnEnabled()) {
        log.warn("The 'topPadding' attribute is deprecated. Use the <box> tag instead.");
      }
      style.getLineBox().setTopPadding(Integer.parseInt(padding));
    }

    border = PenEnum.getByName(atts.getValue(JRXmlConstants.ATTRIBUTE_leftBorder));
    if (border != null) {
      if (log.isWarnEnabled()) {
        log.warn("The 'leftBorder' attribute is deprecated. Use the <pen> tag instead.");
      }
      JRPenUtil.setLinePenFromPen(border, style.getLineBox().getLeftPen());
    }

    borderColor =
        JRColorUtil.getColor(atts.getValue(JRXmlConstants.ATTRIBUTE_leftBorderColor), Color.black);
    if (borderColor != null) {
      if (log.isWarnEnabled()) {
        log.warn("The 'leftBorderColor' attribute is deprecated. Use the <pen> tag instead.");
      }
      style.getLineBox().getLeftPen().setLineColor(borderColor);
    }

    padding = atts.getValue(JRXmlConstants.ATTRIBUTE_leftPadding);
    if (padding != null && padding.length() > 0) {
      if (log.isWarnEnabled()) {
        log.warn("The 'leftPadding' attribute is deprecated. Use the <box> tag instead.");
      }
      style.getLineBox().setLeftPadding(Integer.parseInt(padding));
    }

    border = PenEnum.getByName(atts.getValue(JRXmlConstants.ATTRIBUTE_bottomBorder));
    if (border != null) {
      if (log.isWarnEnabled()) {
        log.warn("The 'bottomBorder' attribute is deprecated. Use the <pen> tag instead.");
      }
      JRPenUtil.setLinePenFromPen(border, style.getLineBox().getBottomPen());
    }

    borderColor =
        JRColorUtil.getColor(
            atts.getValue(JRXmlConstants.ATTRIBUTE_bottomBorderColor), Color.black);
    if (borderColor != null) {
      if (log.isWarnEnabled()) {
        log.warn("The 'bottomBorderColor' attribute is deprecated. Use the <pen> tag instead.");
      }
      style.getLineBox().getBottomPen().setLineColor(borderColor);
    }

    padding = atts.getValue(JRXmlConstants.ATTRIBUTE_bottomPadding);
    if (padding != null && padding.length() > 0) {
      if (log.isWarnEnabled()) {
        log.warn("The 'bottomPadding' attribute is deprecated. Use the <box> tag instead.");
      }
      style.getLineBox().setBottomPadding(Integer.parseInt(padding));
    }

    border = PenEnum.getByName(atts.getValue(JRXmlConstants.ATTRIBUTE_rightBorder));
    if (border != null) {
      if (log.isWarnEnabled()) {
        log.warn("The 'rightBorder' attribute is deprecated. Use the <pen> tag instead.");
      }
      JRPenUtil.setLinePenFromPen(border, style.getLineBox().getRightPen());
    }

    borderColor =
        JRColorUtil.getColor(atts.getValue(JRXmlConstants.ATTRIBUTE_rightBorderColor), Color.black);
    if (borderColor != null) {
      if (log.isWarnEnabled()) {
        log.warn("The 'rightBorderColor' attribute is deprecated. Use the <pen> tag instead.");
      }
      style.getLineBox().getRightPen().setLineColor(borderColor);
    }

    padding = atts.getValue(JRXmlConstants.ATTRIBUTE_rightPadding);
    if (padding != null && padding.length() > 0) {
      if (log.isWarnEnabled()) {
        log.warn("The 'rightPadding' attribute is deprecated. Use the <box> tag instead.");
      }
      style.getLineBox().setRightPadding(Integer.parseInt(padding));
    }

    RotationEnum rotation =
        RotationEnum.getByName(atts.getValue(JRXmlConstants.ATTRIBUTE_rotation));
    if (rotation != null) {
      style.setRotation(rotation);
    }

    LineSpacingEnum lineSpacing =
        LineSpacingEnum.getByName(atts.getValue(JRXmlConstants.ATTRIBUTE_lineSpacing));
    if (lineSpacing != null) {
      style.setLineSpacing(lineSpacing);
    }

    style.setMarkup(atts.getValue(JRXmlConstants.ATTRIBUTE_markup));

    String isStyledText = atts.getValue(JRXmlConstants.ATTRIBUTE_isStyledText);
    if (isStyledText != null && isStyledText.length() > 0) {
      if (log.isWarnEnabled()) {
        log.warn("The 'isStyledText' attribute is deprecated. Use the 'markup' attribute instead.");
      }
      style.setMarkup(
          Boolean.valueOf(isStyledText)
              ? JRCommonText.MARKUP_STYLED_TEXT
              : JRCommonText.MARKUP_NONE);
    }

    style.setPattern(atts.getValue(JRXmlConstants.ATTRIBUTE_pattern));

    String isBlankWhenNull = atts.getValue(JRXmlConstants.ATTRIBUTE_isBlankWhenNull);
    if (isBlankWhenNull != null && isBlankWhenNull.length() > 0) {
      style.setBlankWhenNull(Boolean.valueOf(isBlankWhenNull));
    }

    if (atts.getValue(JRXmlConstants.ATTRIBUTE_fontName) != null) {
      style.setFontName(atts.getValue(JRXmlConstants.ATTRIBUTE_fontName));
    }
    if (atts.getValue(JRXmlConstants.ATTRIBUTE_isBold) != null) {
      style.setBold(Boolean.valueOf(atts.getValue(JRXmlConstants.ATTRIBUTE_isBold)));
    }
    if (atts.getValue(JRXmlConstants.ATTRIBUTE_isItalic) != null) {
      style.setItalic(Boolean.valueOf(atts.getValue(JRXmlConstants.ATTRIBUTE_isItalic)));
    }
    if (atts.getValue(JRXmlConstants.ATTRIBUTE_isUnderline) != null) {
      style.setUnderline(Boolean.valueOf(atts.getValue(JRXmlConstants.ATTRIBUTE_isUnderline)));
    }
    if (atts.getValue(JRXmlConstants.ATTRIBUTE_isStrikeThrough) != null) {
      style.setStrikeThrough(
          Boolean.valueOf(atts.getValue(JRXmlConstants.ATTRIBUTE_isStrikeThrough)));
    }
    if (atts.getValue(JRXmlConstants.ATTRIBUTE_fontSize) != null) {
      style.setFontSize(Integer.valueOf(atts.getValue(JRXmlConstants.ATTRIBUTE_fontSize)));
    }
    if (atts.getValue(JRXmlConstants.ATTRIBUTE_pdfFontName) != null) {
      style.setPdfFontName(atts.getValue(JRXmlConstants.ATTRIBUTE_pdfFontName));
    }
    if (atts.getValue(JRXmlConstants.ATTRIBUTE_pdfEncoding) != null) {
      style.setPdfEncoding(atts.getValue(JRXmlConstants.ATTRIBUTE_pdfEncoding));
    }
    if (atts.getValue(JRXmlConstants.ATTRIBUTE_isPdfEmbedded) != null) {
      style.setPdfEmbedded(Boolean.valueOf(atts.getValue(JRXmlConstants.ATTRIBUTE_isPdfEmbedded)));
    }
  }