`

利用servlet生成报表表头斜线

阅读更多

      最近,一直在做报表的展示,其中表头斜线实现是个技术问题,组内讨论,有经验的同事,说直接用servlet产生图片就可以了,于是,对产生表头图片的例子做了测试,测试通过了,给大家show一下,同时,自己在学习中也得到了提高,下面是展现的效果。
 

中式报表表头斜线

最关键的servlet代码如下:

package com.cvicse.report.portal.servlet;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/**
 * 生成单元格斜线图片
 * 
 */
public class CreateImageServlet extends HttpServlet {

	/* (non-Javadoc)
	 * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("image/jpeg");
		String type = (String) request.getParameter("type");
		try {
			if (type.equals("1"))
				createImage1(request, response.getOutputStream());
			else if (type.equals("2"))
				createImage2(request, response.getOutputStream());
			else if (type.equals("3"))
				createImage3(request, response.getOutputStream());
			else
				System.out.println("Error slash type");
		} catch (Exception ex) {
			throw new ServletException(ex);
		}
	}

	// topdown
	/**
	 * @param request
	 * @param out
	 * @throws Exception
	 */
	private void createImage1(HttpServletRequest request, OutputStream out)
			throws Exception {
		int width = new Integer(request.getParameter("width"));
		int height = new Integer(request.getParameter("height"));
		String borderweight = request.getParameter("borderweight") == null ? "0"
				: request.getParameter("borderweight");
		String bordercolor = request.getParameter("bordercolor");
		String backcolor = request.getParameter("backcolor");
		String forecolor = request.getParameter("forecolor");
		String str1 = request.getParameter("str1");
		String str2 = request.getParameter("str2");
		String fontname = request.getParameter("fontname");
		int fontsize = new Integer(request.getParameter("fontsize")) * 96 / 72;
		boolean isBold = new Boolean(request.getParameter("isBold"));
		boolean isItalic = new Boolean(request.getParameter("isItalic"));
		boolean isUnderline = new Boolean(request.getParameter("isUnderline"));
		boolean isStrikeThrough = new Boolean(request
				.getParameter("isStrikeThrough"));
		int style = 0;
		if (!(isBold && isItalic))
			style = Font.PLAIN;
		else {
			if (isItalic)
				style = Font.ITALIC;
			if (isBold)
				style += Font.BOLD;
		}

		BufferedImage bi = new BufferedImage(width - 1, height - 1,
				BufferedImage.TYPE_INT_RGB);
		Graphics2D g = bi.createGraphics();
		// set background:
		g.setBackground(new Color(Integer.parseInt(backcolor, 16)));
		// g.clearRect(borderweight, borderweight, width-borderweight*2,
		// height-borderweight*2);
		g.clearRect(0, 0, width - 1, height - 1);
		// set border color:
		g.setColor(new Color(Integer.parseInt(bordercolor, 16)));

		// 2009.03.25 设置线条粗细
		float linewidth = Float.parseFloat(borderweight);
		BasicStroke bs = new BasicStroke(linewidth);
		g.setStroke(bs);

		// start draw:
		g.drawLine(0, 0, width - 1, height - 1);
		Font font = new Font(fontname, style, fontsize);
		g.setFont(font);
		FontMetrics fm = g.getFontMetrics(font);
		int ascent2 = fm.getMaxAscent();
		int width2 = fm.stringWidth(str2);
		int height1 = fm.getHeight();

		// g.drawString(str2, width-2-width2,ascent2);
		g.drawString(str2, width - width2, ascent2);
		// g.drawString(str1, 0,height-2);
		g.drawString(str1, 0, height - fm.getMaxDescent());
		// end draw:
		g.dispose();
		bi.flush();
		// encode:
		JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
		JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
		param.setQuality(1.0f, false);
		encoder.setJPEGEncodeParam(param);
		try {
			encoder.encode(bi);
		} catch (IOException ioe) {
			ioe.printStackTrace();
		}
	}

	// aggregation
	/**
	 * @param request
	 * @param out
	 */
	private void createImage2(HttpServletRequest request, OutputStream out) {
		int width = new Integer(request.getParameter("width"));
		int height = new Integer(request.getParameter("height"));
		String borderweight = request.getParameter("borderweight") == null ? "0"
				: request.getParameter("borderweight");
		String bordercolor = request.getParameter("bordercolor");
		String backcolor = request.getParameter("backcolor");
		String forecolor = request.getParameter("forecolor");
		String str1 = request.getParameter("str1");
		String str2 = request.getParameter("str2");
		String str3 = request.getParameter("str3");
		String fontname = request.getParameter("fontname");
		int fontsize = new Integer(request.getParameter("fontsize")) * 96 / 72;
		boolean isBold = new Boolean(request.getParameter("isBold"));
		boolean isItalic = new Boolean(request.getParameter("isItalic"));
		boolean isUnderline = new Boolean(request.getParameter("isUnderline"));
		boolean isStrikeThrough = new Boolean(request
				.getParameter("isStrikeThrough"));
		int style = 0;
		if (!(isBold && isItalic))
			style = Font.PLAIN;
		else {
			if (isItalic)
				style = Font.ITALIC;
			if (isBold)
				style += Font.BOLD;
		}
		BufferedImage bi = new BufferedImage(width - 2, height - 2,
				BufferedImage.TYPE_INT_RGB);
		Graphics2D g = bi.createGraphics();

		// set background:
		g.setBackground(new Color(Integer.parseInt(backcolor, 16)));
		g.clearRect(0, 0, width, height);

		// set border color:
		g.setColor(new Color(Integer.parseInt(bordercolor, 16)));

		// 2009.03.25 设置线条粗细
		float linewidth = Float.parseFloat(borderweight);
		BasicStroke bs = new BasicStroke(linewidth);
		g.setStroke(bs);

		// start draw:
		g.drawLine(width / 2, 1, width - 1, height - 1);
		g.drawLine(1, height / 2, width - 1, height - 1);

		Font font = new Font(fontname, style, fontsize);
		g.setFont(font);
		FontMetrics fm = g.getFontMetrics(font);
		int ascent = fm.getMaxAscent();
		int width1 = fm.stringWidth(str1);
		int width2 = fm.stringWidth(str2);
		int width3 = fm.stringWidth(str3);
		g.drawString(str1, 0, height);
		g.drawString(str2, 0, ascent);
		g.drawString(str3, width - width3, ascent);
		// end draw:
		g.dispose();
		bi.flush();
		// encode:
		JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
		JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
		param.setQuality(1.0f, false);
		encoder.setJPEGEncodeParam(param);
		try {
			encoder.encode(bi);
		} catch (IOException ioe) {
			ioe.printStackTrace();
		}
	}

	// radiation
	/**
	 * @param request
	 * @param out
	 */
	private void createImage3(HttpServletRequest request, OutputStream out) {
		int width = new Integer(request.getParameter("width"));
		int height = new Integer(request.getParameter("height"));
		String borderweight = request.getParameter("borderweight") == null ? "0"
				: request.getParameter("borderweight");
		String bordercolor = request.getParameter("bordercolor");
		String backcolor = request.getParameter("backcolor");
		String forecolor = request.getParameter("forecolor");
		String str1 = request.getParameter("str1");
		String str2 = request.getParameter("str2");
		String str3 = request.getParameter("str3");
		String fontname = request.getParameter("fontname");
		int fontsize = new Integer(request.getParameter("fontsize")) * 96 / 72;
		boolean isBold = new Boolean(request.getParameter("isBold"));
		boolean isItalic = new Boolean(request.getParameter("isItalic"));
		boolean isUnderline = new Boolean(request.getParameter("isUnderline"));
		boolean isStrikeThrough = new Boolean(request
				.getParameter("isStrikeThrough"));
		int style = 0;
		if (!(isBold && isItalic))
			style = Font.PLAIN;
		else {
			if (isItalic)
				style = Font.ITALIC;
			if (isBold)
				style += Font.BOLD;
		}

		BufferedImage bi = new BufferedImage(width - 1, height - 1,
				BufferedImage.TYPE_INT_RGB);
		Graphics2D g = bi.createGraphics();
		// set background:
		g.setBackground(new Color(Integer.parseInt(backcolor, 16)));
		g.clearRect(0, 0, width - 1, height - 1);
		// set border color:
		g.setColor(new Color(Integer.parseInt(bordercolor, 16)));

		// 2009.03.25 设置线条粗细
		float linewidth = Float.parseFloat(borderweight);
		BasicStroke bs = new BasicStroke(linewidth);
		g.setStroke(bs);

		// start draw:
		g.drawLine(0, 0, width - 1, height / 2 - 1);
		g.drawLine(0, 0, width / 2 - 1, height - 1);
		Font font = new Font(fontname, style, fontsize);
		g.setFont(font);
		FontMetrics fm = g.getFontMetrics(font);
		int ascent = fm.getMaxAscent();
		int width1 = fm.stringWidth(str1);
		int width2 = fm.stringWidth(str2);
		int width3 = fm.stringWidth(str3);
		g.drawString(str1, 0, height - 2);
		g.drawString(str2, width - 2 - width2, height - 2);
		g.drawString(str3, width - 2 - width3, ascent);
		// end draw:
		g.dispose();
		bi.flush();
		// encode:
		JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
		JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
		param.setQuality(1.0f, false);
		encoder.setJPEGEncodeParam(param);
		try {
			encoder.encode(bi);
		} catch (IOException ioe) {
			ioe.printStackTrace();
		}
	}
}

 

 

  • 大小: 17.8 KB
分享到:
评论

相关推荐

    jsp+servlet生成报表

    慕课网上jsp+servlet技术生成报表 一课的源码。并不完全,且要配数据库,但是基础知识点都是用到的,且能正常运行。希望对初学者有所帮助。我也是花了很多时间编写和调试的。

    JSP中利用Servlet生成验证码图片

    ### JSP中利用Servlet生成验证码图片 在Web应用开发中,验证码被广泛应用于用户登录、表单提交等场景,以防止自动化的恶意攻击。本文将详细介绍如何在Java Server Pages (JSP) 和 Servlet 技术的基础上,实现一个...

    利用servlet动态生成验证码

    本教程主要讲解如何利用Servlet来实现动态生成验证码的功能,这对于防止机器人或恶意自动化程序在网站上进行非法操作至关重要。验证码通常由一串随机字符组成,用户需要正确输入才能完成特定操作,如注册、登录或...

    利用servlet技术实现一个简单的聊天室

    实验1: 利用servlet实现一个简单的聊天室 实验目的 (1) 理解servlet的工作原理 (2) 掌握servlet编程基本技能 实验内容及要求 1. 利用servlet技术实现一个简单的聊天室,实现多人同时交流。当发送聊天信息时,信息...

    使用Servlet生成图片验证码

    在IT行业中,Servlet是一种Java平台上的服务器端编程技术,用于生成动态Web内容。本文将深入讲解如何使用Servlet来创建图片验证码,确保用户交互的安全性。验证码的主要目的是防止自动化程序(如机器人)对网站进行...

    Servlet生成图片验证码

    在这个场景中,我们使用Servlet来生成图片验证码,这是一种防止恶意自动化程序(如机器人)进行非法操作的安全机制。验证码通常是一串随机生成的字符,以图像形式显示,用户需要在输入框中正确输入才能完成验证。 ...

    用Servlet实现的二维码图片生成

    下面将详细解释如何通过Servlet实现二维码图片生成的原理和步骤。 首先,理解二维码的基本概念。二维码是一种二维条形码,可以存储比传统一维条形码更多的信息,如文本、网址、联系人信息等。它由黑白相间的模块...

    servlet生成验证码图片

    `servlet`生成验证码图片是通过服务器端动态创建一个包含随机字符的图像,用户需要输入图像中显示的文字或数字来验证其身份。以下将详细解释这个过程及其相关知识点: 1. **Servlet**:Servlet是Java中用于扩展...

    java servlet生成二维码

    这是当初初学zxing和sevlet的时候写的,保存路径在ToBeZxing里,这里用的是绝对路径所以在你的电脑上多半需要更改,有注释应该一眼能看出来。为了防止名字的重复,我使用的md5来为每一个二维码命名。...

    java web笔记之servlet生成验证码

    本笔记将详细探讨如何使用Servlet来生成验证码。 一、验证码的原理与作用 验证码的主要目的是区分人类用户和自动化程序,通过要求用户输入图片上的文字或者完成简单的数学问题,来验证其为真实的人类。这有助于防止...

    Servlet生成动态验证码

    要生成动态验证码,首先需要在Servlet中创建一个`BufferedImage`对象,定义验证码的宽度和高度。然后,通过随机数生成器填充图像,可以绘制不同颜色的线条和字符,增加识别难度。使用`Random`类生成随机字符序列,...

    servlet生成四位数验证码图片

    在servlet中动态生成验证码图片,可被JSP或servlet引用,每次刷新都会改变验证码

    Java-servlet生成验证码

    正在学习Java,在教程书和网上不断的学习。servlet 提供了 Java 强大的 web 交互,在这个小项目中,我用servlet 实现了在web上生成验证码的功能,正在入门Java的同学不妨试试。

    servlet生成随机验证码

    本教程将深入讲解如何使用Servlet生成随机验证码。 首先,让我们了解Servlet的基本概念。Servlet是一个Java类,遵循Servlet API规范,它被部署在Web服务器上,用于扩展服务器的功能,处理来自客户端(如浏览器)的...

    servlet生成验证码

    本文将详细解析如何使用JSP和Servlet技术来生成并刷新验证码。 ### 一、理解Servlet与验证码 Servlet是Java EE的重要组成部分,它是一种运行在服务器端的小程序,主要用于处理来自客户端的HTTP请求,并生成响应。...

    servlet生成动态验证码

    servlet生成动态验证码

    利用Servlet求平方根的完美实例

    在这个"利用Servlet求平方根的完美实例"中,我们可能会看到以下关键步骤: 1. **创建Servlet类**:在Java中,Servlet是一个实现了`javax.servlet.Servlet`或`javax.servlet.http.HttpServlet`接口的类。在这个例子...

    用户登陆注册码生成Servlet

    用servlet生成用户登陆或者注册时的验证码

    jsp+servlet 生成验证码

    总的来说,"jsp+servlet 生成验证码"是一个典型的前后端交互的例子,它展示了如何利用Java Web技术实现动态的、安全的验证码功能,为Web应用提供了一道基础的安全屏障。对于初学者来说,理解和实现这个过程有助于...

Global site tag (gtag.js) - Google Analytics