List of usage examples for org.apache.poi.xslf.usermodel XSLFSimpleShape setAnchor
@Override
public void setAnchor(Rectangle2D anchor)
From source file:de.kiwiwings.jasperreports.exporter.PptxShapeExporter.java
License:Open Source License
/** * *//*from w ww . j av a2 s . co 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); }