zoukankan      html  css  js  c++  java
  • 文档自动盖章

    前言

    最近要写一个自动生成报表的程序,具体是将一堆存储在数据库的表格做成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做一次就成了,很开心。

  • 相关阅读:
    [慢查优化]建索引时注意字段选择性 & 范围查询注意组合索引的字段顺序
    telnet报“Unable to connect to remote host:Connection refused”错误
    问题总结-2016
    vim保存文件时,生成.un~文件
    用uniq来处理文件重复数据--交集,差集,计数等(转)
    ThinkPHP的URL访问
    PHP中Exception异常
    Git Stash紧急处理问题,需要切分支
    git 命令学习
    gdb调试PHP扩展错误
  • 原文地址:https://www.cnblogs.com/liujshi/p/5826936.html
Copyright © 2011-2022 走看看