Example usage for org.apache.poi.xslf.usermodel XSLFSimpleShape getXmlObject

List of usage examples for org.apache.poi.xslf.usermodel XSLFSimpleShape getXmlObject

Introduction

In this page you can find the example usage for org.apache.poi.xslf.usermodel XSLFSimpleShape getXmlObject.

Prototype

public final XmlObject getXmlObject() 

Source Link

Usage

From source file:de.kiwiwings.jasperreports.exporter.PptxShapeExporter.java

License:Open Source License

/**
 *
 *//* w w w. j  a  v a2  s . c o m*/
public void exportImage(JRPrintImage image) throws JRException {
    int leftPadding = image.getLineBox().getLeftPadding().intValue();
    int topPadding = image.getLineBox().getTopPadding().intValue();//FIXMEDOCX maybe consider border thickness
    int rightPadding = image.getLineBox().getRightPadding().intValue();
    int bottomPadding = image.getLineBox().getBottomPadding().intValue();

    double availableImageWidth = image.getWidth() - leftPadding - rightPadding;
    availableImageWidth = availableImageWidth < 0 ? 0 : availableImageWidth;

    double availableImageHeight = image.getHeight() - topPadding - bottomPadding;
    availableImageHeight = availableImageHeight < 0 ? 0 : availableImageHeight;

    Renderable renderer = image.getRenderable();

    if (renderer == null || availableImageWidth == 0 || availableImageHeight == 0)
        return;

    if (renderer.getTypeValue() == RenderableTypeEnum.IMAGE) {
        // Non-lazy image renderers are all asked for their image data at some point.
        // Better to test and replace the renderer now, in case of lazy load error.
        renderer = RenderableUtil.getInstance(jasperReportsContext).getOnErrorRendererForImageData(renderer,
                image.getOnErrorTypeValue());
        if (renderer == null)
            return;
    }

    double normalWidth = availableImageWidth;
    double normalHeight = availableImageHeight;

    // Image load might fail.
    Renderable tmpRenderer = RenderableUtil.getInstance(jasperReportsContext)
            .getOnErrorRendererForDimension(renderer, image.getOnErrorTypeValue());
    Dimension2D dimension = tmpRenderer == null ? null : tmpRenderer.getDimension(jasperReportsContext);
    // If renderer was replaced, ignore image dimension.
    if (tmpRenderer == renderer && dimension != null) {
        normalWidth = dimension.getWidth();
        normalHeight = dimension.getHeight();
    }

    double cropTop = 0;
    double cropLeft = 0;
    double cropBottom = 0;
    double cropRight = 0;

    switch (image.getScaleImageValue()) {
    case FILL_FRAME:
        //            width = availableImageWidth;
        //            height = availableImageHeight;
        break;

    default:
    case RETAIN_SHAPE:
        if (availableImageWidth > 0 && availableImageHeight > 0) {
            if (normalWidth > availableImageWidth) {
                normalHeight /= normalWidth / availableImageWidth;
                normalWidth = availableImageWidth;
            }
            if (normalHeight > availableImageHeight) {
                normalWidth /= normalHeight / availableImageHeight;
                normalHeight = availableImageHeight;
            }
        }
        // nobreak

    case CLIP:
        if (availableImageWidth > 0 && availableImageHeight > 0) {
            double reducedWidth = getOffsetInPercent(normalWidth, availableImageWidth);
            switch (image.getHorizontalAlignmentValue()) {
            default:
            case LEFT:
                cropRight = reducedWidth;
                break;
            case RIGHT:
                cropLeft = reducedWidth;
                break;
            case CENTER:
                cropLeft = cropRight = reducedWidth / 2d;
                break;
            }
            double reducedHeight = getOffsetInPercent(normalHeight, availableImageHeight);
            switch (image.getVerticalAlignmentValue()) {
            default:
            case BOTTOM:
                cropTop = reducedHeight;
                break;
            case TOP:
                cropBottom = reducedHeight;
                break;
            case MIDDLE:
                cropTop = cropBottom = reducedHeight / 2;
                break;
            }
        }
        break;
    }

    XSLFSimpleShape backgroundShape;
    XSLFShape hyperlinkShape;

    if (renderer instanceof DrawChartRenderer) {
        Rectangle2D rect = new Rectangle2D.Double(image.getX(), image.getY(), image.getWidth(),
                image.getHeight());
        PptxGraphics2D grx2 = new PptxGraphics2D(rect, this, slide);
        // Background color is applied to whole Image
        backgroundShape = grx2.getShape(rect);
        renderer.render(jasperReportsContext, grx2, rect);

        // hyperlinks are only available for visible elements of the chart
        XSLFGroupShape grp = grx2.getShapeGroup();
        CTNonVisualDrawingProps cp = grp.getXmlObject().getNvGrpSpPr().getCNvPr();
        cp.setName(cp.getName().replaceFirst("[^ ]+", "JFreeChart"));
        hyperlinkShape = grp;
    } else {
        //   if (image.isLazy())//FIXMEDOCX learn how to link images            
        Renderable imgRenderer = image.getRenderable();
        if (imgRenderer.getTypeValue() == RenderableTypeEnum.SVG) {
            imgRenderer = new JRWrappingSvgRenderer(imgRenderer,
                    new Dimension(image.getWidth(), image.getHeight()),
                    ModeEnum.OPAQUE == image.getModeValue() ? image.getBackcolor() : null);
        }

        ImageTypeEnum mimeType = imgRenderer.getImageTypeValue();
        if (mimeType == null)
            mimeType = ImageTypeEnum.JPEG;
        int xsMime;
        switch (mimeType) {
        default:
        case UNKNOWN:
        case JPEG:
            xsMime = XSLFPictureData.PICTURE_TYPE_JPEG;
            break;
        case GIF:
            xsMime = XSLFPictureData.PICTURE_TYPE_GIF;
            break;
        case PNG:
            xsMime = XSLFPictureData.PICTURE_TYPE_PNG;
            break;
        case TIFF:
            xsMime = XSLFPictureData.PICTURE_TYPE_TIFF;
            break;
        }

        byte pictureData[] = imgRenderer.getImageData(jasperReportsContext);

        int idx = ppt.addPicture(pictureData, xsMime);
        backgroundShape = slide.createPicture(idx);
        hyperlinkShape = backgroundShape;
        CTPicture ct = (CTPicture) backgroundShape.getXmlObject();

        if (cropTop != 0 || cropRight != 0 || cropBottom != 0 || cropLeft != 0) {
            //            CTRelativeRect rrect = ct.getBlipFill().getStretch().getFillRect();
            CTRelativeRect rrect = ct.getBlipFill().addNewSrcRect();
            rrect.setT((int) cropTop);
            rrect.setR((int) cropRight);
            rrect.setB((int) cropBottom);
            rrect.setL((int) cropLeft);
        }

        Rectangle2D rect = new Rectangle2D.Double(image.getX() + getOffsetX() + leftPadding,
                image.getY() + getOffsetY() + topPadding, availableImageWidth, availableImageHeight);
        backgroundShape.setAnchor(rect);
    }

    exportElementAttributes(backgroundShape, image, image.getLinePen(), image, hyperlinkShape);
}