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做一次就成了,很开心。

  • 相关阅读:
    Monkey学习笔记(一)
    10.18 nslookup:域名查询工具
    10.22 tcpdump:监听网络流量
    10.22 tcpdump:监听网络流量
    Linux运维常见笔试题(选择题)
    Linux运维40道精华题
    LeetCode Isomorphic Strings 对称字符串
    LeetCode 3Sum Closest 最近似的3sum(2sum方法)
    博弈的图论模型——必败态与核
    威佐夫博弈(证明)
  • 原文地址:https://www.cnblogs.com/liujshi/p/5826936.html
Copyright © 2011-2022 走看看