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

ar.com.fdvs.dj.util.WaterMarkRenderer Maven / Gradle / Ivy

Go to download

DynamicJasper (DJ) is an API that hides the complexity of Jasper Reports, it helps developers to save time when designing simple/medium complexity reports generating the layout of the report elements automatically. It creates reports dynamically, defining at runtime the columns, column width (auto width), groups, variables, fonts, charts, crosstabs, sub reports (that can also be dynamic), page size and everything else that you can define at design time. DJ keeps full compatibility with Jasper Reports since it's a tool that helps create reports programmatically in a easy way (it only interferes with the creation of the report design doing the layout of the elements). You can use the classic .jrxml files as templates while the content and layout of the report elements are handled by the DJ API. http://dynamicjasper.com

There is a newer version: 5.3.9
Show newest version
package ar.com.fdvs.dj.util;

import net.sf.jasperreports.engine.JRAbstractRenderer;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.type.ImageTypeEnum;
import net.sf.jasperreports.engine.type.RenderableTypeEnum;

import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.geom.Dimension2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.util.ArrayList;

/**
 * Created by dj on 01/12/15.
 * Took from: http://stackoverflow.com/questions/11665663/watermark-across-the-page-in-jasperreports
 */
@SuppressWarnings("deprecation")
public class WaterMarkRenderer extends JRAbstractRenderer {
    private boolean m_licenseTrial = false;

    public WaterMarkRenderer(boolean isLicenseTrial)
    {
        m_licenseTrial = isLicenseTrial;
    }

    @Override
    public byte getType()
    {
        // no idea what this does
        return RenderableTypeEnum.SVG.getValue();
    }

    @Override
    public byte getImageType()
    {
        // no idea what this does
        return ImageTypeEnum.UNKNOWN.getValue();
    }

    @Override
    public Dimension2D getDimension() throws JRException
    {
        // A4 in pixel: 595x842
        // this seems to override whatever is configured in jasperreports studio
        return new Dimension(595 - 2 * 40, 700);
    }

    @Override
    public byte[] getImageData() throws JRException
    {
        // no idea what this does
        return new byte[0];
    }

    @Override
    public void render(Graphics2D g2, Rectangle2D rectangle) throws JRException
    {
        if(m_licenseTrial)
        {
            AffineTransform originalTransform = g2.getTransform();

            // just for debugging
            g2.setColor(Color.BLUE);
            g2.draw(rectangle);

            g2.translate(rectangle.getX() + 100, rectangle.getMaxY());
            g2.rotate(-55 * Math.PI / 180);

            Font font = new Font("Arial", Font.PLAIN, 120);
            Shape shape = font.createGlyphVector(g2.getFontRenderContext(), "Trial License").getOutline();
            g2.setColor(new Color(255, 0, 0, 100));
            g2.setStroke(new BasicStroke(1));
            g2.draw(shape);

            g2.setTransform(originalTransform);
        }
    }

    public static BufferedImage rotateText(String text, Font font, int width, int height, int textAngle, Color textColor) {
        if(text==null)
            throw new IllegalArgumentException("text must be not-null ");
        if(text.length()==0)
            throw new IllegalArgumentException("text is empty string");
        if(text.trim().length()==0)
            throw new IllegalArgumentException("text must contain at least one character that is not space");

        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        // make whole image transparent
        for (int i = image.getWidth() - 1; i > -1; i--) {
            for (int j = image.getHeight() - 1; j > -1; j--) {
                if (image.getRGB(i, j) == new Color(255, 255, 255).getRGB()) {
                    image.setRGB(i, j, new Color(0, 0, 0, 0).getRGB());
                }
            }
        }

        Graphics2D g = (Graphics2D) image.getGraphics();
        g.setRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON));
        g.setFont(font);
        FontMetrics fm = g.getFontMetrics();
        double completeWidth = fm.stringWidth(text);

        double caLinesCountD = completeWidth / (double) width;
        int caLinesCount;
        if(caLinesCountD%1.0>0){
            caLinesCount = (int)caLinesCountD+1;
        }else
            caLinesCount = (int)caLinesCountD;


        java.util.List lines = new ArrayList(caLinesCount);

        if(caLinesCount==1)
            lines.add(text);
        else{
            int caSepIdx = text.length()/caLinesCount;
            for(int i=0;inextCaSep){

                    int sepIdx = text.substring(i,nextCaSep+1).lastIndexOf(' ');
                    if(sepIdx==0){
                        i++;

                    }else if(sepIdx==-1){
                        lines.add(text.substring(i,nextCaSep));
                        i+=nextCaSep;
                    }else{
                        lines.add(text.substring(i,i+sepIdx));
                        i+=sepIdx+1;
                    }
                }else{
                    lines.add(text.substring(i));
                    break;
                }
            }
        }

        g.rotate(Math.PI / 180 * textAngle, width / 2, height / 2);
        int textHeight = fm.getMaxAscent();

        int lineY = height/2;
        // shift up for vertical centration
        int halfLines = lines.size()/2;
        double shiftLines = lines.size()%2==0?halfLines-1:halfLines-0.5;
        shiftLines+=0.2;
        lineY-=textHeight*shiftLines;


        for (String line : lines) {
            int lineWidth = fm.stringWidth(line);
            int lineX = (width / 2) - (lineWidth / 2);
            g.setColor(textColor);
            g.drawChars(line.toCharArray(), 0, line.length(), lineX, lineY);
            lineY += textHeight;
        }

        return image;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy