JAVA生成数字印章图片

废话少说直接上代码,看不懂复制本地跑一下就完事了。

package cn.xxx.xxx.utils;

import org.apache.commons.codec.binary.Base64;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;

public class GraphicsUtil {

    public static void main(String[] args) {
        GraphicsUtil.sealToFile("1000",new File("D:\\Config\\1000.png"));
        GraphicsUtil.sealToFile("1111",new File("D:\\Config\\1111.png"));

        String s = GraphicsUtil.sealToBase64("56");
        System.out.println(s);
    }
    /**
     * 生成数字印章到文件
     * @param text
     * @return
     */
    public static String sealToBase64(String text){
        BufferedImage bi = seal(text);
        try {
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            //bufferedImage转为byte数组
            ImageIO.write(bi, "png", outStream);
            byte[] bytes = outStream.toByteArray();

            return Base64.encodeBase64String(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 生成数字印章到文件
     * @param text
     * @param file
     * @return
     */
    public static File sealToFile(String text,File file){
        BufferedImage bi = seal(text);
        try {
            ImageIO.write(bi, "png", file);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return file;
    }

    /***
     * 生成数字印章
     * @param text
     * @return
     */
    public  static BufferedImage seal(String text){
        int width = 95;
        int height = 44;
        double rate = 1.5;//文字间距,重要
        if (text.length() > 2){
            rate = 1;
        }
        //1.创建对象并绘制背景
        BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
        //创建画笔
        Graphics2D g2d = bi.createGraphics();
        //背景颜色
        g2d.setColor(Color.WHITE);
        //背景
        g2d.fill3DRect(0, 0, width, height, true);
        //2.绘制边框
        int stroke = 4;
        g2d.setPaint(Color.RED);
        //设置画笔的粗度
        g2d.setStroke(new BasicStroke(stroke));
        g2d.drawRect(stroke/2, stroke/2, width-stroke, height-stroke);
        //3.绘制文件内容
        //文字颜色
        g2d.setColor(Color.RED);
        //设置字体
        g2d.setFont(new Font("宋体",Font.BOLD,40));
        //居中显示
        int x = (int)(width / 2 - rate * g2d.getFontMetrics().stringWidth(text) / 2);
        int y = height / 2 + g2d.getFontMetrics().getHeight() / 3;
        //4.重新设置文字间距
        rate(text, x, y, rate, g2d);
        g2d.dispose();
        return bi;
    }

    /***
     * 设置文字间距
     * @param str
     * @param x
     * @param y
     * @param rate
     * @param g
     */
    private static void rate(String str,int x,int y,double rate,Graphics g){
        String tempStr = null;
        int orgStringWight = g.getFontMetrics().stringWidth(str);
        int orgStringLength = str.length();
        int tempx = x;
        int tempy = y;
        while(str.length()>0){
            tempStr = str.substring(0, 1);
            str = str.substring(1, str.length());
            g.drawString(tempStr, tempx, tempy);
            tempx = (int)(tempx + (double)orgStringWight / (double)orgStringLength * rate);
        }
    }
}
Java中,一旦PDF文件生成完毕并需要插入关键字和印章图片,通常可以借助一些第三方库如iText、PDFBox或者Apache PDFBox来操作。这里是一个简化的步骤: 1. 首先,你需要引入相应的库到你的项目中。例如,如果你选择使用iText,你可以添加iText的依赖: ```xml <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13</version> <!-- 根据实际版本替换 --> </dependency> ``` 2. 使用`PdfReader`读取已生成的PDF,然后创建一个`PdfStamper`对象,以便在其上进行修改。 ```java PdfReader reader = new PdfReader("path_to_your_pdf.pdf"); PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("output_with_stamp.pdf")); ``` 3. 创建一个`SignatureAppearance`对象,用于显示印章图片。这通常需要一个私钥来进行签名,不过这里简化为直接插入图片。假设你已经有了一个`Image`对象代表印章图片: ```java Image stampImage = Image.getInstance("path_to.stamp.png"); SignatureAppearance appearance = stamper.getSignatureAppearance(); appearance.setSignerName("Your Name"); // 设置签名人信息 appearance.setReason("Reason for signing"); // 可选,设置理由 appearance.setVisibleSignature(stampImage, -1, -1); // 添加印章位置(-1表示自动适应) ``` 4. 对于关键字搜索和替换,你需要遍历文档内容,查找包含关键字的部分。`PdfDocument`或`PdfReader`类提供了一些方法,如`getKeywords()`获取元数据中的关键字。如果找到匹配的关键字,你可以使用`PdfCopy`类的`addAnnotation()`方法添加注释或者高亮等标记。 ```java PdfContentByte canvas = stamper.getOverContent(1); String keyword = "your_keyword"; if (reader.getKeywords().contains(keyword)) { // 找到关键词,添加注解或其他处理 } ``` 5. 最后,记得关闭资源: ```java stamper.close(); reader.close(); ``` 注意:以上步骤示例化简了实际情况,实际应用中可能涉及更多错误处理和权限管理。此外,对于印章签名,你还需要遵循数字签名的标准流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值