文档章节

因工作需要在j2ee的环境中做电子印章 于是用水印做了一个 支持圆形带五角星 方形印章

番茄酱汁
 番茄酱汁
发布于 2014/04/14 13:04
字数 1074
阅读 590
收藏 12

/**

* 输出图片的公用方法

* @param message

*            弧度上的字 (基本都是从数据库读取)

* @param centerName

*            中间要显示的名字

* @param width

*            中间字体的宽度

* @param height

*            中间字体的高度

* @return

* @throws FileNotFoundException

* @throws IOException

*/

public static BufferedImage bufferedImageUtil(String message,

String centerName, int width, int height)

throws FileNotFoundException, IOException {

BufferedImage image = null;

if (message != null) {

final int CENTERX = 90;

final int CENTERY = 90;

final int radius = 76;

// 获取get_png文件夹

ActionContext ac = ActionContext.getContext();

ServletContext sc = (ServletContext) ac

.get(ServletActionContext.SERVLET_CONTEXT);

String filePath = sc.getRealPath(File.separator + "style"

+ File.separator + "imgs");

String path = filePath;

image = ImageIO.read(new FileInputStream(path + File.separator

+ "newIcon.jpg"));

Graphics2D g2 = image.createGraphics();// 得到图形上下文

g2.setColor(Color.RED); // 设置画笔颜色

// 设置字体

g2.setFont(new Font("宋体", Font.LAYOUT_LEFT_TO_RIGHT, 15));// 写入签名

if (centerName != null) {

g2.drawString(centerName, width, height);

}

// 根据输入字符串得到字符数组

String[] messages2 = message.split("", 0);

String[] messages = new String[messages2.length - 1];

System.arraycopy(messages2, 1, messages, 0, messages2.length - 1);

// 输入的字数

int ilength = messages.length;

// 设置字体属性

int fontsize = 16;

Font f = new Font("", Font.BOLD, fontsize);

FontRenderContext context = g2.getFontRenderContext();

Rectangle2D bounds = f.getStringBounds(message, context);

// 字符宽度=字符串长度/字符数

double char_interval = (bounds.getWidth() / ilength);

// 上坡度

double ascent = -bounds.getY();

int first = 0, second = 0;

boolean odd = false;

if (ilength % 2 == 1) {

first = (ilength - 1) / 2;

odd = true;

} else {

first = (ilength) / 2 - 1;

second = (ilength) / 2;

odd = false;

}

double radius2 = radius - ascent;

double x0 = CENTERX;

double y0 = CENTERY - radius + ascent;

// 旋转角度

double a = 2 * Math.asin(char_interval / (2 * radius2));

if (odd) {

g2.setFont(f);

g2.drawString(messages[first],

(float) (x0 - char_interval / 2), (float) y0);

// 中心点的右边

for (int i = first + 1; i < ilength; i++) {

double aa = (i - first) * a;

double ax = radius2 * Math.sin(aa);

double ay = radius2 - radius2 * Math.cos(aa);

AffineTransform transform = AffineTransform

.getRotateInstance(aa);// ,x0 + ax, y0 + ay);

Font f2 = f.deriveFont(transform);

g2.setFont(f2);

g2

.drawString(messages[i],

(float) (x0 + ax - char_interval / 2

* Math.cos(aa)),

(float) (y0 + ay - char_interval / 2

* Math.sin(aa)));

}

// 中心点的左边

for (int i = first - 1; i > -1; i--) {

double aa = (first - i) * a;

double ax = radius2 * Math.sin(aa);

double ay = radius2 - radius2 * Math.cos(aa);

AffineTransform transform = AffineTransform

.getRotateInstance(-aa);// ,x0 + ax, y0 + ay);

Font f2 = f.deriveFont(transform);

g2.setFont(f2);

g2

.drawString(messages[i],

(float) (x0 - ax - char_interval / 2

* Math.cos(aa)),

(float) (y0 + ay + char_interval / 2

* Math.sin(aa)));

}

} else {

// 中心点的右边

for (int i = second; i < ilength; i++) {

double aa = (i - second + 0.5) * a;

double ax = radius2 * Math.sin(aa);

double ay = radius2 - radius2 * Math.cos(aa);

AffineTransform transform = AffineTransform

.getRotateInstance(aa);// ,x0 + ax, y0 + ay);

Font f2 = f.deriveFont(transform);

g2.setFont(f2);

g2

.drawString(messages[i],

(float) (x0 + ax - char_interval / 2

* Math.cos(aa)),

(float) (y0 + ay - char_interval / 2

* Math.sin(aa)));

}

// 中心点的左边

for (int i = first; i > -1; i--) {

double aa = (first - i + 0.5) * a;

double ax = radius2 * Math.sin(aa);

double ay = radius2 - radius2 * Math.cos(aa);

AffineTransform transform = AffineTransform

.getRotateInstance(-aa);// ,x0 + ax, y0 + ay);

Font f2 = f.deriveFont(transform);

g2.setFont(f2);

g2

.drawString(messages[i],

(float) (x0 - ax - char_interval / 2

* Math.cos(aa)),

(float) (y0 + ay + char_interval / 2

* Math.sin(aa)));

}

}

g2.dispose();

}

return image;

}

---------------------------------上述为圆形带五角星的章-------------------------

/**

* 方形名字章

* @param message

*            要刻的名字

* @return

* @throws FileNotFoundException

* @throws IOException

*/

public static BufferedImage getSquarePng(String message)

throws FileNotFoundException, IOException {

BufferedImage image = null;

if (message != null) {

ActionContext ac = ActionContext.getContext();

ServletContext sc = (ServletContext) ac

.get(ServletActionContext.SERVLET_CONTEXT);

String filePath = sc.getRealPath(File.separator + "style"

+ File.separator + "imgs");

String path = filePath;

image = ImageIO.read(new FileInputStream(path + File.separator

+ "squarePng.png"));

Graphics2D g2 = image.createGraphics();// 得到图形上下文

g2.setColor(Color.RED); // 设置画笔颜色

// 设置字体

g2.setFont(new Font("宋体", Font.LAYOUT_LEFT_TO_RIGHT, 80));// 写入签名

if (message != null) {

String newMessage = null;

// 如果三个 则 XXX章 如果两个则 XX之章 大于3个 则 取前三

if (message.length() == 2) {

newMessage = message + "之章";

} else if (message.length() == 3) {

newMessage = message + "章";

} else if (message.length() > 3) {

newMessage = message.substring(0, 3) + "章";

}

char[] charArray = newMessage.toCharArray();

g2.drawString(new String(new char[] { charArray[0] }), 90, 70);  // 写文字

g2.drawString(new String(new char[] { charArray[1] }), 90, 160); // 写文字

g2.drawString(new String(new char[] { charArray[2] }), 10, 70);  // 写文字

g2.drawString(new String(new char[] { charArray[3] }), 10, 160); // 写文字

}

}

return image;

}

---------------------------------方形章---------------------------------------

---------------------------------调用方法------------------------------------

/**

* 获取方形印章

* @return

*/

public String getSquarePngByUserName() {

String info = null;

BufferedImage image = null;

try {

ActionContext ac = ActionContext.getContext();

HttpServletResponse response = (HttpServletResponse) ac

.get(ServletActionContext.HTTP_RESPONSE);

response.setContentType("image/JPEG");

OutputStream output = response.getOutputStream();

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(output);

Users user = (Users) SiteAction.getEntity("loginUser");

if (user != null) {

String userName = user.getUName();

if (userName != null) {

image = OutPicture.getSquarePng(userName);

}

}

if (image != null) {

encoder.encode(image);

}

output.flush();

output.close();

} catch (Exception e) {

return ERROR;

}

return info;

}


// 工商行政管理局(圆形


)

public String noticeOfRegistrationPng() {

String info = null;

try {

ActionContext ac = ActionContext.getContext();

HttpServletResponse response = (HttpServletResponse) ac

.get(ServletActionContext.HTTP_RESPONSE);

response.setContentType("image/JPEG");

OutputStream output = response.getOutputStream();

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(output);

BufferedImage image = OutPicture.bufferedImageUtil("工商行政管理局", null,

48, 150);

if (image != null) {

encoder.encode(image);

}

output.flush();

output.close();

} catch (Exception e) {

info = Action.ERROR;

}

return info;

}

--------------------------------效果--------------------------------

© 著作权归作者所有

共有 人打赏支持
番茄酱汁
粉丝 7
博文 8
码字总数 2665
作品 0
朝阳
程序员
私信 提问
加载中

评论(2)

番茄酱汁
番茄酱汁

引用来自“osborn”的评论

你好,想请教一下椭圆印章如何生成,不知道有没有类似的源代码。
不好意思,很久没有玩开源中国了,看到你提的这个问题,我觉得你应该没有好好的查看源代码,因为这个说的水印,也就是往图片上写字,所以,如果要做椭圆的话,只需要改变背景图片和写字时候的弧度即可。
o
osborn
你好,想请教一下椭圆印章如何生成,不知道有没有类似的源代码。
PageOffice如何显示/隐藏Word文档中的标尺

在线打开并使用Word文档时,我们经常会需要使用打开的Word文档中,顶部的标尺来设置页面的边距、对齐位置等。这一操作,可以通过工具栏中“视图”→“标尺”选项的是否勾选来决定是否显示标尺...

yert
2013/04/25
0
0
最新简捷实用JSP动态网站环境搭建的详细步骤

最新简捷实用JSP动态网站环境搭建的详细步骤,根据网上出现最新的web server软件UFO搭建网站,测试了N次,没问题: 内容提示: Sun推出的JSP(Java Server Pages)是一种执行于服务器端的动态...

HB07140030
2009/04/06
2.7K
18
EJB提供的应用程序可移植性,抽象性以及由抽象性而提供的向后兼容性

首先,EJB不是人们想象中的样子:重量级。实际上,它的目标与“重量级”这三个字恰恰相反:轻量级。 意味着它的目标在于减轻企业级软件开发的任务。企业级开发的特点是什么呢?它的特点是:认...

刘小兵2014
2011/08/14
0
0
web服务器中的容器以及工作流程

杂谈:项目到现在,已经有几个Phase过去了,杂乱的js,jsp,杂乱的action,代码已经是面目全非,更别提什么高内聚,低耦合这一说了。现在的工作状态是,要不就是绞尽脑汁地改以前留下来的巨坑...

王大叔爱编程
2014/09/25
0
0
jsp静态和动态分开处理apache+tomcat

Apache是当前使用最为广泛的WWW服务器软件,具有相当强大的静态HTML处理的能力。 Tomcat服务器是一个免费的开放源代码的Web应用服务器,它是Apache软件基金会(Apache Software Foundation)...

卢水发
2013/04/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

EOS官方钱包keosd

EOS官方钱包的名称是keosd,它负责管理你的私钥,并且帮你进行交易的签名。 不过不幸的是,keosd钱包对普通用户并不友好,它是一个命令行程序,目前还没有像以太坊的mist那样的图形化界面,而...

汇智网教程
今天
30
0
ArrayList的实现原理以及实现线程安全

一、ArrayList概述 ArrayList是基于数组实现的,是一个动态的数字,可以自动扩容。 ArrayList不是线程安全的,效率比较高,只能用于单线程的环境中,在多线程环境中可以使用Collections.syn...

一看就喷亏的小猿
今天
38
0
Netty 备录 (一)

入职新公司不久,修修补补1个月的bug,来了点实战性的技术---基于netty即时通信 还好之前对socket有所使用及了解,入手netty应该不是很难吧,好吧,的确有点难,刚看这玩意的时候,可能都不知道哪里...

_大侠__
昨天
42
0
Django简单介绍和用户访问流程

Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。 Django是一个开放源代码的Web应用框架,由Python写成。 Django遵守BSD版权,初...

枫叶云
昨天
55
0
Spring Cloud Stream消费失败后的处理策略(四):重新入队(RabbitMQ)

应用场景 之前我们已经通过《Spring Cloud Stream消费失败后的处理策略(一):自动重试》一文介绍了Spring Cloud Stream默认的消息重试功能。本文将介绍RabbitMQ的binder提供的另外一种重试...

程序猿DD
昨天
26
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部