文档自动盖章

前言

最近要写一个自动生成报表的程序,具体是将一堆存储在数据库的表格做成PDF然后盖上单位的章,章是以图片的形式给出的。
项目用的是JAVA语言,需要的库主要是itex。查了一轮itex的API之后大概有两种做法:

  • 一种是直接以图片的形式将章插入到pdf相应位置,然后设置图片为背景,这种方法的好处是非常简单,但是后来的文字会覆盖
    掉章的内容,严重的失真。
  • 第二种方法是通过mask来对插入到pdf的图片进行处理,itex有个方法叫img.setImageMask(mask),使用了该方法之后就可以通过mask的值
    来对img设置透明度,具体是mask为0的点img会变成透明,反之亦然。

具体方法

通过上面的介绍我们就把问题转化到老本行数字图像处理上来了,就是提取出图片的二值化信息。
装好Python和Opencv开始干活。

初始图片是这样的:

import numpy as np
import cv2

I = cv2.imread('t1.jpg');

I_gray = cv2.cvtColor(I, CV_BGR2GRAY) #转成灰度图片

I_gray[I_gray > 220] = 255

I_gray[I_gray < 220] = 0  #得到二值化的图片,220是实验出来的

cv2.imwrite('t1_bin.png', I_gray)

这样就获得了二值化的签章。

然后在Java端处理

Image img = Image.getInstance("E:\\t1.jpg");
BufferedImage bi = ImageIO.read(new File("E:\\t1_bin.jpg"));
BufferedImage newBi = new BufferedImage(bi.getWidth(),bi.getHeight(),BufferedImage.TYPE_BYTE_BINARY);
newBi.getGraphics().drawImage(bi, 0, 0, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(newBi, "png", baos);
Image mask = Image.getInstance(baos.toByteArray());
mask.makeMask();
img.setImageMask(mask);

这样就完成了签章的生成

总结

具体做起来还是比较顺利的,因为签章本来就需要很清楚,如果是其他东西可能需要腐蚀、膨胀甚至上watershed算法。
Java端也很顺利,照着API做一次就成了,很开心。

posted @ 2016-08-31 17:43  liujshi  阅读(958)  评论(1编辑  收藏  举报
MathJax.Hub.Config({ jax: ["input/TeX","output/HTML-CSS"], displayAlign: "left" });