精华内容
下载资源
问答
  • 对pdf文件进行读取,根据传入的文字去寻找指定位置信息,根据位置信息添加图片,其中样式格式可自定义,具体可查看jar包的操作文档,地址可百度。实现签字或者盖章操作,文件中包括源码和架包。
  • 实现pdf在线盖章,签字的功能 为什么要使用pdf签章 什么插件能实现pdf签章功能 spirngboot如果集成pageOffice并实现pdf签章呢 最终效果 为什么要使用pdf签章 pdf在办公过程中,做矢量文档工具,使用...

    实现pdf在线盖章,签字的功能

     

    为什么要使用pdf签章

    pdf在办公过程中,做矢量文档工具,使用比较广范。
    在文档审批和发布过程中,也要求最后要pdf有效的签名或者印章,以示文档的重要性。

    什么插件能实现pdf签章功能

    卓正软件公司的pageOffice,专门实现办公文档的在线编辑,在办公文档编辑领域,提供的插件比较丰富。为做办公系统的程序员节约了大量时间。最新的5.0版本,推出了pdf的在线签章功能。
    实现了pdf签发的全流程处理。

    spirngboot如果集成pageOffice并实现pdf签章呢

    本程序员实现了一个最简单的pdf签章的功能。

    项目的结构如下图

    在这里插入图片描述

    第一步

    pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.3.4.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.example</groupId>
        <artifactId>demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>PDFseal</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
    
            <!-- 添加Sqlite依赖(可选:如果不需要使用印章功能的话,不需要添加此依赖 )-->
            <dependency>
                <groupId>org.xerial</groupId>
                <artifactId>sqlite-jdbc</artifactId>
                <version>3.7.2</version>
            </dependency>
            <!-- 添加PageOffice依赖(必须) -->
            <dependency>
                <groupId>com.zhuozhengsoft</groupId>
                <artifactId>pageoffice</artifactId>
                <version>5.1.0.2</version>
    
            </dependency>
        </dependencies>
    
    
    </project>
    
    

    2appplication.properties 文档的设置。

    
    ########################################################
    ###PageOffice
    ########################################################
    posyspath=d:/lic/
    popassword=111111
    ########################################################
    ###THYMELEAF (ThymeleafAutoConfiguration)
    ########################################################
    spring.thymeleaf.prefix=classpath:/templates/
    spring.thymeleaf.suffix=.html
    #spring.thymeleaf.mode=HTML5
    #spring.thymeleaf.encoding=UTF-8
    # ;charset=<encoding> is added
    #spring.thymeleaf.content-type=text/html
    # set to false for hot refresh
    
    spring.thymeleaf.cache=false
    
    

    3写入pageOffice定义的bean
    DemoController.java

    package com.example.demo;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.web.servlet.ServletRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.util.ResourceUtils;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.servlet.ModelAndView;
    
    import java.io.FileNotFoundException;
    
    /**
     * @author Administrator
     */
    @RestController
    public class DemoController {
        @Value("${posyspath}")
        private String poSysPath;
    
        @Value("${popassword}")
        private String poPassWord;
    
        /**
         * 添加PageOffice的服务器端授权程序Servlet(必须)
         * @return
         */
        @Bean
        public ServletRegistrationBean servletRegistrationBean() {
            com.zhuozhengsoft.pageoffice.poserver.Server poserver = new com.zhuozhengsoft.pageoffice.poserver.Server();
            poserver.setSysPath(poSysPath);//设置PageOffice注册成功后,license.lic文件存放的目录
            ServletRegistrationBean srb = new ServletRegistrationBean(poserver);
            srb.addUrlMappings("/poserver.zz");
            srb.addUrlMappings("/posetup.exe");
            srb.addUrlMappings("/pageoffice.js");
            srb.addUrlMappings("/jquery.min.js");
            srb.addUrlMappings("/pobstyle.css");
            srb.addUrlMappings("/sealsetup.exe");
            return srb;//
        }
    
        /**
         * 添加印章管理程序Servlet(可选)
         * @return
         */
        @Bean
        public ServletRegistrationBean servletRegistrationBean2() {
            com.zhuozhengsoft.pageoffice.poserver.AdminSeal adminSeal = new com.zhuozhengsoft.pageoffice.poserver.AdminSeal();
            adminSeal.setAdminPassword(poPassWord);//设置印章管理员admin的登录密码
            adminSeal.setSysPath(poSysPath);//设置印章数据库文件poseal.db存放的目录
            ServletRegistrationBean srb = new ServletRegistrationBean(adminSeal);
            srb.addUrlMappings("/adminseal.zz");
            srb.addUrlMappings("/sealimage.zz");
            srb.addUrlMappings("/loginseal.zz");
            return srb;// 
        }
    }
    
    

    4开始写后端业务代码。
    PDFInsertSealController.java

    package com.example.demo;
    
    import com.zhuozhengsoft.pageoffice.FileSaver;
    import com.zhuozhengsoft.pageoffice.PDFCtrl;
    import org.springframework.util.ResourceUtils;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.FileNotFoundException;
    import java.util.Map;
    
    @RestController
    public class PDFInsertSealController {
    
        @RequestMapping(value = "/index", method = RequestMethod.GET)
        public ModelAndView showIndex() {
            ModelAndView mv = new ModelAndView("Index");
            return mv;
        }
    //盖章功能
        @RequestMapping(value = "/AddSeal", method = RequestMethod.GET)
        public ModelAndView showWord(HttpServletRequest request, Map<String, Object> map) {
            PDFCtrl pdfCtrl1 = new PDFCtrl(request);
            pdfCtrl1.setServerPage(request.getContextPath() + "/poserver.zz"); //此行必须
            //设置保存页面
            pdfCtrl1.setSaveFilePage("/AddSeal/save");
            // Create custom toolbar
            pdfCtrl1.addCustomToolButton("保存", "Save()", 1);
            pdfCtrl1.addCustomToolButton("加盖印章", "InsertSeal()", 2);
            //此处路径为服务器端文档路径
            pdfCtrl1.webOpen("D:\\doc\\AddSeal\\test1.pdf");
            map.put("pageoffice", pdfCtrl1.getHtmlCode("PDFCtrl1"));
            ModelAndView mv = new ModelAndView("/AddSeal/PDF1");
            return mv;
        }
    
    //签字功能
        @RequestMapping(value = "AddSign", method = RequestMethod.GET)
        public ModelAndView showWord11(HttpServletRequest request, Map<String, Object> map) {
            PDFCtrl pdfCtrl1 = new PDFCtrl(request);
            pdfCtrl1.setServerPage(request.getContextPath() + "/poserver.zz"); //此行必须
            //设置保存页面
            pdfCtrl1.setSaveFilePage("/AddSign/save");
            // Create custom toolbar
            pdfCtrl1.addCustomToolButton("保存", "Save()", 1);
            pdfCtrl1.addCustomToolButton("签字", "AddHandSign()", 3);
            //此处路径为服务器端文档路径
            pdfCtrl1.webOpen("D:\\doc\\AddSign\\test1.pdf");
            map.put("pageoffice", pdfCtrl1.getHtmlCode("PDFCtrl1"));
            ModelAndView mv = new ModelAndView("/AddSign/PDF1");
            return mv;
        }
    
    
        @RequestMapping("/AddSeal/save")
        public void save(HttpServletRequest request, HttpServletResponse response) {
            FileSaver fs = new FileSaver(request, response);
            //此处路径为服务器端文档路径
            fs.saveToFile(  "D:/doc/AddSeal/" + fs.getFileName());
            fs.close();
        }
    
        @RequestMapping("/AddSign/save")
        public void save2(HttpServletRequest request, HttpServletResponse response) {
            FileSaver fs = new FileSaver(request, response);
            //此处路径为服务器端文档路径
            fs.saveToFile(  "D:/doc/AddSign/" + fs.getFileName());
            fs.close();
        }
    
    }
    
    

    最后
    写上三个对应的thymleleaf的模板

    index.html

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
          xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    <head>
        <title>Index</title>
        <script type="text/javascript" src="pageoffice.js" ></script>
    
    </head>
    
    <body>
    <h1 th:inline="text">PageOffice 集成效果演示</h1>
    
    <div style="width: 49%;float: left ">
    
    
        <a href="javascript:POBrowser.openWindowModeless('AddSeal','fullscreen=yes;');">打开pdf盖章 </a><br>
    
        <a href="javascript:POBrowser.openWindowModeless('AddSign','fullscreen=yes;');">打开pdf签字</a><br>
    
    
    </div>
    
    
    
    </body>
    </html>
    
    

    templates\AddSeal\PDF1.html

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
          xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    <head>
    </head>
    <body style="overflow:hidden">
    <!--**************   卓正 PageOffice 客户端代码开始    ************************-->
    <script language="javascript" type="text/javascript">
        function Save() {
            document.getElementById("PDFCtrl1").WebSave();
        }
    
        function InsertSeal() {
            try {
                document.getElementById("PDFCtrl1").ZoomSeal.AddSeal();//如果使用ZoomSeal中的USBKEY方式盖章,第一个参数不能为盖章用户登录名,只能为null或者空字符串
            } catch(e) {}
        }
    
    
    </script>
    <div style="height:850px;width:auto;" th:utext="${pageoffice}">
    
    </div>
    </body>
    
    </html>
    
    

    templates\AddSign\PDF1.html

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
          xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    <head>
    </head>
    <body style="overflow:hidden">
    <!--**************   卓正 PageOffice 客户端代码开始    ************************-->
    <script language="javascript" type="text/javascript">
        function Save() {
            document.getElementById("PDFCtrl1").WebSave();
        }
    
        function AddHandSign() {
            try {
                document.getElementById("PDFCtrl1").ZoomSeal.AddHandSign();
            } catch(e) {}
        }
    
    </script>
    <div style="height:850px;width:auto;" th:utext="${pageoffice}">
    
    </div>
    </body>
    </html>
    
    

    代码写完后,配置环境

    1电脑创建d:/lic/ 这个目录,里面添加pageOffice自带的数据库。
    2创建
    目录结构,每个目录放入一个test1.pdf的pdf文档。
    3启动服务

    最终效果

    在这里插入图片描述
    index页面打开效果

    点 打开pdf盖章

    在这里插入图片描述
    盖章后的效果

    在这里插入图片描述
    签字后的效果
    git项目地址为

    https://github.com/qingxue0606/PDFseal

    在这里插入图片描述
    需要的,数据库文档,和pdf文档都在data目录中。

    有问题可访问 http://www.zhuozhengsoft.com/

    展开全文
  • 对网络图片进行签名,之前在与遇到 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(image); 启动时候有问题,后来换成了ImageIO....import java.awt.AlphaComposite; import jav...

    对网络图片进行签名,之前在与遇到

    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
    encoder.encode(image);

    启动时候有问题,后来换成了ImageIO.write(image, "jpg", out),就没有问题。

    import java.awt.AlphaComposite;
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.RenderingHints;
    import java.awt.geom.AffineTransform;
    import java.awt.image.BufferedImage;
    import java.awt.image.ColorModel;
    import java.awt.image.WritableRaster;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    import javax.imageio.ImageIO;
    
    /**
     * 读取、输出文件
     * @author tyg
     * @date   2019年3月28日下午4:48:06
     */
    public class ImageHelper {
    
    	// 项目根目录路径
    	public static final String path = System.getProperty("user.dir");
    
    	/**
    	 * 
    	 * @param source
    	 * @param width
    	 * @param height
    	 * @param b
    	 * @return
    	 * @return BufferedImage
    	 * @author tyg
    	 * @date   2019年3月28日下午5:26:59
    	 */
    	public static BufferedImage thumb(BufferedImage source, int width, int height, boolean b) {
    		// targetW,targetH分别表示目标长和宽
    		int type = source.getType();
    		BufferedImage target = null;
    		double sx = (double) width / source.getWidth();
    		double sy = (double) height / source.getHeight();
    
    		if (b) {
    			if (sx > sy) {
    				sx = sy;
    				width = (int) (sx * source.getWidth());
    			} else {
    				sy = sx;
    				height = (int) (sy * source.getHeight());
    			}
    		}
    
    		if (type == BufferedImage.TYPE_CUSTOM) { // handmade
    			ColorModel cm = source.getColorModel();
    			WritableRaster raster = cm.createCompatibleWritableRaster(width, height);
    			boolean alphaPremultiplied = cm.isAlphaPremultiplied();
    			target = new BufferedImage(cm, raster, alphaPremultiplied, null);
    		} else
    			target = new BufferedImage(width, height, type);
    		Graphics2D g = target.createGraphics();
    		// smoother than exlax:
    		g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    		g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));
    		g.dispose();
    		return target;
    	}
    
    	/**
    	 * 输出文件
    	 * @param imgPath
    	 * @param markPath
    	 * @param x
    	 * @param y
    	 * @param alpha
    	 * @return void
    	 * @author tyg
    	 * @date   2019年3月28日下午5:23:35
    	 */
    	public static void waterMark(String imgPath, String markPath, int x, int y, float alpha) {
    		try {
    			// 加载待处理图片文件
    			Image img = ImageIO.read(new File(imgPath));
    
    			BufferedImage image = new BufferedImage(img.getWidth(null), img.getHeight(null),
    					BufferedImage.TYPE_INT_RGB);
    			Graphics2D g = image.createGraphics();
    			g.drawImage(img, 0, 0, null);
    
    			// 加载水印图片文件
    			Image src_biao = ImageIO.read(new File(markPath));
    			g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
    			g.drawImage(src_biao, x, y, null);
    			g.dispose();
    
    			// 保存处理后的文件
    			FileOutputStream out = new FileOutputStream(imgPath);
    			ImageIO.write(image, "jpg", out);
    //			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
    //			encoder.encode(image);
    			out.close();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    	/**
    	 * 输出图片
    	 * @param imgPath
    	 * @param text
    	 * @param font
    	 * @param color
    	 * @param x
    	 * @param y
    	 * @param alpha
    	 * @return void
    	 * @author tyg
    	 * @date   2019年3月28日下午5:26:35
    	 */
    	public static void textMark(String imgPath, String text, Font font, Color color, int x, int y, float alpha) {
    		try {
    			Font Dfont = (font == null) ? new Font("宋体", 20, 13) : font;
    
    			Image img = ImageIO.read(new File(imgPath));
    
    			BufferedImage image = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
    			Graphics2D g = image.createGraphics();
    
    			g.drawImage(img, 0, 0, null);
    			g.setColor(color);
    			g.setFont(Dfont);
    			g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
    			g.drawString(text, x, y);
    			g.dispose();
    			FileOutputStream out = new FileOutputStream(imgPath);
    			
    			ImageIO.write(image, "jpg", out);
    //			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
    //			encoder.encode(image);
    			out.close();
    		} catch (Exception e) {
    			System.out.println(e);
    		}
    	}
    
    	/**
    	 * 读取本地JPEG、JPG图片格式
    	 * @param filename
    	 * @return
    	 * @return BufferedImage
    	 * @author tyg
    	 * @date   2019年3月28日下午5:24:36
    	 */
    	public static BufferedImage readJPEGImage(String filename) {
    		try {
    			InputStream inStream = new FileInputStream(new File(filename));
    			BufferedImage sourceImage = ImageIO.read(inStream);
    //			// 得到输入的编码器,将文件流进行jpg格式编码
    //			JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(inStream);
    //			// 得到编码后的图片对象
    //			BufferedImage sourceImage = decoder.decodeAsBufferedImage();
    			return sourceImage;
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    	
    	/**
    	 * 读取http的JPEG、JPG图片格式
    	 * @param filename
    	 * @return
    	 * @return BufferedImage
    	 * @author tyg
    	 * @date   2019年3月28日下午5:24:26
    	 */
    	public static BufferedImage readHttpJPEGImage(String filename) {
    		try {
    			//new一个URL对象  
    	        URL url = new URL(filename);  
    	        //打开链接  
    	        HttpURLConnection conn = (HttpURLConnection)url.openConnection();  
    	        //设置请求方式为"GET"  
    	        conn.setRequestMethod("GET");  
    	        //超时响应时间为5秒  
    	        conn.setConnectTimeout(5 * 1000);  
    	        //通过输入流获取图片数据  
    	        InputStream inStream = conn.getInputStream();  
    //	        JPEGImageDecoder imageDecoder = JPEGCodec.createJPEGDecoder(inStream);
    //	        BufferedImage sourceImage = imageDecoder.decodeAsBufferedImage();
    	        BufferedImage sourceImage = ImageIO.read(inStream);
    	     // 得到编码后的图片对象
    			return sourceImage;
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    
    	/**
    	 * 读取本地PNG图片格式
    	 * @param filename
    	 * @return
    	 * @return BufferedImage
    	 * @author tyg
    	 * @date   2019年3月28日下午5:25:24
    	 */
    	public static BufferedImage readPNGImage(String filename) {
    		try {
    			File inputFile = new File(filename);
    			FileInputStream input = new FileInputStream(inputFile);
    			BufferedImage sourceImage = ImageIO.read(input);
    			return sourceImage;
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    
    		return null;
    	}
    
    	
    	public static int rgbToGray(int pixels) {
    		// int _alpha = (pixels >> 24) & 0xFF;
    		int _red = (pixels >> 16) & 0xFF;
    		int _green = (pixels >> 8) & 0xFF;
    		int _blue = (pixels) & 0xFF;
    		return (int) (0.3 * _red + 0.59 * _green + 0.11 * _blue);
    	}
    
    	public static int average(int[] pixels) {
    		float m = 0;
    		for (int i = 0; i < pixels.length; ++i) {
    			m += pixels[i];
    		}
    		m = m / pixels.length;
    		return (int) m;
    	}
    }

     这里才有的是16*16=256个像素进行对比。

    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.commons.lang3.StringUtils;
    
    /**
     * 对图片进行签名
     * @author tyg
     * @date   2019年3月28日下午5:12:11
     */
    public class ImageSign {
    
    	public static final int SAMEVALUE = 5; // 相同图片阀值
    	public static final int SIMILARVALUE = 10; // 相似图片阀值
    
    	public static void main(String[] args) {
    		// 开始时间
    		long startMillis = System.currentTimeMillis();
    		
    		String httpUrl = "http://thirdwx.qlogo.cn/mmopen/vi_132";
    		// 多张图片签名
    		moreHttpImageSign(httpUrl);
    		// 单张图片签名
    		String sourceHashCode = getSigleHttpImageSign(httpUrl);
    		System.out.println("sign code: "+sourceHashCode);
    
    		System.out.println("curMillis:" + (System.currentTimeMillis() - startMillis));
    	}
    
    	/**
    	 * 获取单张图片签名code
    	 * @param fileName	(可以是本地文件、网络图片)
    	 * @return
    	 * @return String
    	 * @author tyg
    	 * @date   2019年3月28日下午5:31:41
    	 */
    	public static String getSigleHttpImageSign(String fileName) {
    		if (StringUtils.isBlank(fileName)) {
    			return null;
    		}
    		BufferedImage source = fileName.startsWith("http") ? ImageHelper.readHttpJPEGImage(fileName) : ImageHelper.readPNGImage(fileName);
    
    		if (source == null) {
    			return null;
    		}
    		int width = 16;
    		int height = 16;
    
    		// 第一步,缩小尺寸。
    		// 将图片缩小到8x8的尺寸,总共64个像素。这一步的作用是去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。
    		BufferedImage thumb = ImageHelper.thumb(source, width, height, false);
    
    		// 第二步,简化色彩。
    		// 将缩小后的图片,转为64级灰度。也就是说,所有像素点总共只有64种颜色。
    		int[] pixels = new int[width * height];
    		for (int i = 0; i < width; i++) {
    			for (int j = 0; j < height; j++) {
    				pixels[i * height + j] = ImageHelper.rgbToGray(thumb.getRGB(i, j));
    			}
    		}
    
    		// 第三步,计算平均值。
    		// 计算所有64个像素的灰度平均值。
    		int avgPixel = ImageHelper.average(pixels);
    
    		// 第四步,比较像素的灰度。
    		// 将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0。
    		int[] comps = new int[width * height];
    		for (int i = 0; i < comps.length; i++) {
    			if (pixels[i] >= avgPixel) {
    				comps[i] = 1;
    			} else {
    				comps[i] = 0;
    			}
    		}
    
    		// 第五步,计算哈希值。
    		// 将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。
    		StringBuffer hashCode = new StringBuffer();
    		for (int i = 0; i < comps.length; i += 4) {
    			int result = comps[i] * (int) Math.pow(2, 3) + comps[i + 1] * (int) Math.pow(2, 2)
    					+ comps[i + 2] * (int) Math.pow(2, 1) + comps[i + 2];
    			hashCode.append(binaryToHex(result));
    		}
    		// 得到指纹以后,就可以对比不同的图片,看看64位中有多少位是不一样的。
    		return hashCode.toString();
    	}
    
    	/**
    	 * 传入一张图片,然后与指定目录下的图片做对比
    	 * @param httpUrl
    	 * @return void
    	 * @author tyg
    	 * @date   2019年3月28日下午5:06:56
    	 */
    	public static void moreHttpImageSign(String httpUrl) {
    		List<String> hashCodes = new ArrayList<String>();
    
    		// 网络图片
    		List<String> urlList = collectionImgUrl();
    		String hashCode = null;
    		
    		for (String url : urlList) {
    			hashCode = getSigleHttpImageSign(url);
    			hashCodes.add(hashCode);
    		}
    
    		System.out.println("Resources: "+hashCodes);
    
    		String sourceHashCode = getSigleHttpImageSign(httpUrl);
    		System.out.println("Source: "+sourceHashCode);
    
    		List<String> resultList = new ArrayList<String>();
    		List<String> similarResultList = new ArrayList<String>();
    		List<String> differences = new ArrayList<String>();
    
    		for (int i = 0; i < hashCodes.size(); i++) {
    			int difference = hammingDistance(sourceHashCode, hashCodes.get(i));
    			if (difference <= SAMEVALUE) {
    				resultList.add(urlList.get(i).substring(urlList.get(i).lastIndexOf("\\") + 1, urlList.get(i).length()));
    			} else if (difference <= SIMILARVALUE) {
    				similarResultList
    						.add(urlList.get(i).substring(urlList.get(i).lastIndexOf("\\") + 1, urlList.get(i).length()));
    			}
    			differences.add(difference + "->"
    					+ urlList.get(i).substring(urlList.get(i).lastIndexOf("\\") + 1, urlList.get(i).length()));
    		}
    		System.out.println("搜索图片:" + httpUrl.substring(httpUrl.lastIndexOf("\\") + 1, httpUrl.length()));
    		System.out.println("相同图片:" + resultList);
    		System.out.println("相似图片:" + similarResultList);
    		System.out.println("图片对比:" + differences);
    	}
    	
    	public static List<String> collectionImgUrl() {
    		String imgPath = "C:\\Users\\lew\\Desktop\\test";
    
    		List<String> list = new ArrayList<String>();
    		File file = new File(imgPath);
    
    		if (file.isDirectory()) {
    			String[] fileNames = file.list();
    			for (String name : fileNames) {
    				list.add(imgPath.concat("\\") + name);
    			}
    		}
    
    		return list;
    	}
    
    	public static int hammingDistance(String sourceHashCode, String hashCode) {
    		int difference = 0;
    		int len = sourceHashCode.length();
    
    		for (int i = 0; i < len; i++) {
    			if (sourceHashCode.charAt(i) != hashCode.charAt(i)) {
    				difference++;
    			}
    		}
    
    		return difference;
    	}
    
    	private static char binaryToHex(int binary) {
    		char ch = ' ';
    		switch (binary) {
    		case 0:
    			ch = '0';
    			break;
    		case 1:
    			ch = '1';
    			break;
    		case 2:
    			ch = '2';
    			break;
    		case 3:
    			ch = '3';
    			break;
    		case 4:
    			ch = '4';
    			break;
    		case 5:
    			ch = '5';
    			break;
    		case 6:
    			ch = '6';
    			break;
    		case 7:
    			ch = '7';
    			break;
    		case 8:
    			ch = '8';
    			break;
    		case 9:
    			ch = '9';
    			break;
    		case 10:
    			ch = 'a';
    			break;
    		case 11:
    			ch = 'b';
    			break;
    		case 12:
    			ch = 'c';
    			break;
    		case 13:
    			ch = 'd';
    			break;
    		case 14:
    			ch = 'e';
    			break;
    		case 15:
    			ch = 'f';
    			break;
    		default:
    			ch = ' ';
    		}
    		return ch;
    	}
    }

     

    展开全文
  • Java 手写签字去除背景 背景透明 /** * 白底照片去除白底 形成透明底图片 * @param file 需要去除背景的图片 * @param Path 去除背景后保存图片的路径 * @return true 则去除成功 ,false 则失败 */ public ...

    Java 手写签字去除背景 背景透明

    在这里插入图片描述

    /**
     * 白底照片去除白底 形成透明底图片
     * @param file  需要去除背景的图片
     * @param Path  去除背景后保存图片的路径
     * @return  true 则去除成功 ,false 则失败
     */
    public static boolean localImgToAlpha(File file, String Path) {
        try {
            BufferedImage bi = ImageIO.read(new FileInputStream(file));
            ImageIcon imageIcon = new ImageIcon(bi);
            BufferedImage bufferedImage = new BufferedImage(imageIcon.getIconWidth(), imageIcon.getIconHeight(),
                    BufferedImage.TYPE_4BYTE_ABGR);
            Graphics2D g2D = (Graphics2D) bufferedImage.getGraphics();
            g2D.drawImage(imageIcon.getImage(), 0, 0, imageIcon.getImageObserver());
            int alpha = 0;
            for (int j1 = bufferedImage.getMinY(); j1 < bufferedImage.getHeight(); j1++) {
                for (int j2 = bufferedImage.getMinX(); j2 < bufferedImage.getWidth(); j2++) {
                    int rgb = bufferedImage.getRGB(j2, j1);
                    int R = (rgb & 0xff0000) >> 16;
                    int G = (rgb & 0xff00) >> 8;
                    int B = (rgb & 0xff);
                    if (((255 - R) < 30) && ((255 - G) < 30) && ((255 - B) < 30)) {
                        rgb = ((alpha + 1) << 24) | (rgb & 0x00ffffff);
                    }
                    bufferedImage.setRGB(j2, j1, rgb);
                }
            }
            g2D.drawImage(bufferedImage, 0, 0, imageIcon.getImageObserver());
            ImageIO.write(bufferedImage, "png", new File(Path));// 直接输出文件
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    

    转载链接: [link]https://blog.csdn.net/weixin_44912855/article/details/111551807

    展开全文
  • 本资源用于java实现在网页上手写笔迹进行生成图片保存,例如在网页上用鼠标写出自己的名字,生成图片,保存名字。
  • java对PDF签名签章demo

    2018-11-23 13:43:33
    java使用itext对PDF进行签名签章。包括:java创建PDF文档,java对PDF进行加水印,java对PDF加图片水印。java对PDF进行签章。java读取p12秘钥库中证书对PDF进行签章加密。
  • java 签名抠图

    2016-06-29 22:01:00
    return new java.awt.Rectangle(new Dimension(des_width, des_height)); } /** * byte[] ------>BufferedImage * * @param byteImage byteImage * @return return * @throws IOException IOException */ ...
    
    import com.drew.imaging.ImageMetadataReader;
    import com.drew.imaging.ImageProcessingException;
    import com.drew.metadata.Directory;
    import com.drew.metadata.Metadata;
    import com.drew.metadata.Tag;
    
    import javax.imageio.ImageIO;
    import javax.swing.*;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.*;
    
    public class ImageUtils {
    
    
        /**
         * 图片去白色的背景,并裁切
         *
         * @param image 图片
         * @param range 范围 1-255 越大 容错越高 去掉的背景越多
         * @return 图片
         * @throws Exception 异常
         */
        public static byte[] transferAlpha(Image image, InputStream in, int range) throws Exception {
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            try {
                ImageIcon imageIcon = new ImageIcon(image);
                BufferedImage bufferedImage = new BufferedImage(imageIcon
                        .getIconWidth(), imageIcon.getIconHeight(),
                        BufferedImage.TYPE_4BYTE_ABGR);
                Graphics2D g2D = (Graphics2D) bufferedImage.getGraphics();
                g2D.drawImage(imageIcon.getImage(), 0, 0, imageIcon
                        .getImageObserver());
                int alpha = 0;
                int minX = bufferedImage.getWidth();
                int minY = bufferedImage.getHeight();
                int maxX = 0;
                int maxY = 0;
    
                for (int j1 = bufferedImage.getMinY(); j1 < bufferedImage
                        .getHeight(); j1++) {
                    for (int j2 = bufferedImage.getMinX(); j2 < bufferedImage
                            .getWidth(); j2++) {
                        int rgb = bufferedImage.getRGB(j2, j1);
    
                        int R = (rgb & 0xff0000) >> 16;
                        int G = (rgb & 0xff00) >> 8;
                        int B = (rgb & 0xff);
                        if (((255 - R) < range) && ((255 - G) < range) && ((255 - B) < range)) { //去除白色背景;
                            rgb = ((alpha + 1) << 24) | (rgb & 0x00ffffff);
                        } else {
                            minX = minX <= j2 ? minX : j2;
                            minY = minY <= j1 ? minY : j1;
                            maxX = maxX >= j2 ? maxX : j2;
                            maxY = maxY >= j1 ? maxY : j1;
                        }
                        bufferedImage.setRGB(j2, j1, rgb);
                    }
                }
                int width = maxX - minX;
                int height = maxY - minY;
                BufferedImage sub = bufferedImage.getSubimage(minX, minY, width, height);
                int degree = getDegree(in);
                sub = rotateImage(sub,degree);
                ImageIO.write(sub, "png", byteArrayOutputStream);
    
            } catch (Exception e) {
                e.printStackTrace();
                throw e;
            }
    
            return byteArrayOutputStream.toByteArray();
        }
    
        /**
         * 图片旋转
         * @param bufferedimage bufferedimage
         * @param degree 旋转的角度
         * @return BufferedImage
         */
        public static BufferedImage rotateImage(final BufferedImage bufferedimage,
                                                final int degree) {
            int w = bufferedimage.getWidth();
            int h = bufferedimage.getHeight();
            Rectangle rect_des = CalcRotatedSize(new Rectangle(new Dimension(
                    w, h)), degree);
            int type = bufferedimage.getColorModel().getTransparency();
            BufferedImage img;
            Graphics2D graphics2d;
            (graphics2d = (img = new BufferedImage(rect_des.width, rect_des.height, type))
                    .createGraphics()).setRenderingHint(
                    RenderingHints.KEY_INTERPOLATION,
                    RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            graphics2d.translate((rect_des.width - w) / 2,
                    (rect_des.height - h) / 2);
            graphics2d.rotate(Math.toRadians(degree), w / 2, h / 2);
            graphics2d.drawImage(bufferedimage, 0, 0, null);
            graphics2d.dispose();
            return img;
        }
    
        /**
         * 计算旋转后图像的大小
         * @param src  Rectangle
         * @param degree 旋转的角度
         * @return Rectangle
         */
        public static Rectangle CalcRotatedSize(Rectangle src, int degree) {
            if (degree >= 90) {
                if(degree / 90 % 2 == 1){
                    int temp = src.height;
                    src.height = src.width;
                    src.width = temp;
                }
                degree = degree % 90;
            }
    
            double r = Math.sqrt(src.height * src.height + src.width * src.width) / 2;
            double len = 2 * Math.sin(Math.toRadians(degree) / 2) * r;
            double angel_alpha = (Math.PI - Math.toRadians(degree)) / 2;
            double angel_dalta_width = Math.atan((double) src.height / src.width);
            double angel_dalta_height = Math.atan((double) src.width / src.height);
    
            int len_dalta_width = (int) (len * Math.cos(Math.PI - angel_alpha
                    - angel_dalta_width));
            int len_dalta_height = (int) (len * Math.cos(Math.PI - angel_alpha
                    - angel_dalta_height));
            int des_width = src.width + len_dalta_width * 2;
            int des_height = src.height + len_dalta_height * 2;
            return new java.awt.Rectangle(new Dimension(des_width, des_height));
        }
    
        /**
         * byte[] ------>BufferedImage
         *
         * @param byteImage byteImage
         * @return return
         * @throws IOException IOException
         */
        public static BufferedImage ByteToBufferedImage(byte[] byteImage) throws IOException {
            ByteArrayInputStream in = new ByteArrayInputStream(byteImage);
            return ImageIO.read(in);
        }
    
    
        /**
         * 获取照片信息的旋转角度
         * @param inputStream 照片的路径
         * @return 角度
         */
        public static int getDegree(InputStream inputStream) {
            try {
                Metadata metadata = ImageMetadataReader.readMetadata(new BufferedInputStream(inputStream),true);
                for (Directory directory : metadata.getDirectories()) {
                    for (Tag tag : directory.getTags()) {
                        if ("Orientation".equals(tag.getTagName())) {
                            return turn(getOrientation(tag.getDescription()));
                        }
                    }
                }
            } catch (ImageProcessingException e) {
                e.printStackTrace();
                return 0;
            } catch (IOException e) {
                e.printStackTrace();
                return 0;
            }
            return 0;
        }
    
        /**
         * 获取旋转的角度
         * @param orientation orientation
         * @return 旋转的角度
         */
        public static int turn(int orientation) {
            Integer turn = 360;
            if (orientation == 0 || orientation == 1) {
                turn = 360;
            } else if (orientation == 3) {
                turn = 180;
            } else if (orientation == 6) {
                turn = 90;
            } else if (orientation == 8) {
                turn = 270;
            }
            return turn;
        }
    
        /**
         * 根据图片自带的旋转的信息 获取 orientation
         * @param orientation orientation
         * @return orientation
         */
        public static int getOrientation(String orientation) {
            int tag = 0;
            if ("Top, left side (Horizontal / normal)".equalsIgnoreCase(orientation)) {
                tag = 1;
            } else if ("Top, right side (Mirror horizontal)".equalsIgnoreCase(orientation)) {
                tag = 2;
            } else if ("Bottom, right side (Rotate 180)".equalsIgnoreCase(orientation)) {
                tag = 3;
            } else if ("Bottom, left side (Mirror vertical)".equalsIgnoreCase(orientation)) {
                tag = 4;
            } else if ("Left side, top (Mirror horizontal and rotate 270 CW)".equalsIgnoreCase(orientation)) {
                tag = 5;
            } else if ("Right side, top (Rotate 90 CW)".equalsIgnoreCase(orientation)) {
                tag = 6;
            } else if ("Right side, bottom (Mirror horizontal and rotate 90 CW)".equalsIgnoreCase(orientation)) {
                tag = 7;
            } else if ("Left side, bottom (Rotate 270 CW)".equalsIgnoreCase(orientation)) {
                tag = 8;
            }
            return tag;
        }
    }
    

     

    转载于:https://my.oschina.net/alyouge/blog/702926

    展开全文
  • 前期准备二、编写java代码转成word文档1.小服务代码2.工具类代码3.jsp页面代码三、word签名和导出pdf1.签名2.导出pdf四、最后展示效果总结 前言 本篇文章主要本人接到的一个紧急任务,时间紧任务重,完成的比较仓促...
  • 在原图之上再画一张图片(drawImage)或者文本文字(drawString),Java SE中提供了 java.awt.image包和javax.imageio包可以实现非常方便的实现 图片水印或者文字水印。 1.图片水印 如果你想学习java可以来这个群,...
  • 项目中有用户签名的业务场景,因为手机屏幕限制,前端展示的方案是让用户屏幕横向签名,以至于传到后台的用户签名图片是90°颠倒的, 所以需要把签名图片角度进行转换,下面是代码实现! /** ...
  • Java签名

    千次阅读 2019-05-07 21:01:22
    概念 将通信内容的摘要信息使用发送者的私钥进行加密,然后将密文与原文一起传输给信息的接收者,接收者通过发送者的公钥信息来解密被加密的摘要作息,然后使用与发送者相同的摘要算法,对接收到的内容采用相同的...
  • 1:需求 在某些公文流转、电子政务、OA、CRM、ERP、档案管理、人事管理各种系统开发中,某些客户可能会希望通过系统来实现签订某些电子文件...下面我就来和大家分享一个在线给Word文件插入电子印章和签字的示例。 ...
  • , k = 2 输出:[3,99,-1,-100] 解释: 向右旋转 1 步: [99,-1,-100,3] 向右旋转 2 步: [3,99,-1,-100] 提示: 1 * 104 -231 [i] 思路:翻转 java实现: class Solution { public void rotate(int[] nums, int k) { ...
  • 三种方式实现电子签章,项目可直接在eclipse下运行,希望对大家有所帮助。。
  • java操作pdf盖章签字功能。下载即可使用,将jar引入lib目录下,即可使用。已经过测试,比较好用
  • Java 数组转置 方阵顺时针旋转90度

    万次阅读 2014-10-24 08:55:42
    一维数组转置(首尾交换) public class array { public static void main(String args[]){ int data [] =new int [] {1,2,3,4,5,6}; exchange(data); print1(data); ... public static void exchange(int temp...
  • 最近有一个电子签章的功能需求,网上相关的资料比较少,我查阅了相关资料,做了一个简单的盖章功能的demo,其实就只是操作pdf添加个图片,可以忽悠一下小白。。 首先需要导个依赖,这里选用的是itextpdf来操作pdf ...
  • java实现pdf文件电子签名

    热门讨论 2016-05-06 10:47:21
    本示例通过java自动生成pfx证书,根据生成的证书,自动实现对pdf文件的电子签名
  • java 制作签名版电子合同

    千次阅读 2020-04-07 16:57:26
    Java 制作带签名的电子合同 根据项目需求,需要生成一个带电子签名的合同,即客户在手机进行签名后,将签名图片合成到合同中。 目前方案有两个,使用docx4j插件根据书签生成word版电子合同 或者 使用itext插件根据...
  • Java的方法签名

    2016-02-26 16:32:01
    import java.util.Collection; import java.util.List; interface Cat { public void run(List<String> list); Collection<String> jump(); // String eat(); } interface Dog { public void run(List...
  • 沈阳理工大学课程设计报告 PAGE PAGE - 2 - PAGE PAGE 1 成 绩 评 定 表 学生姓名 班级学号 专 业 课程设计题目 基于Java的动物换位游戏软件设计 评 语 组长签字 成绩 日期 2013 年 月 日 课程设计任务书 学 院 信息...
  • java实现签名验签

    2021-01-02 11:18:41
    文章目录数字签名摘要算法消息摘要定义特点原理常用算法代码案例 数字签名 一般地,把对一个信息的摘要称为该消息的指纹或数字签名 ... 摘要算法 几乎所有的数字签名方案都要和快速高效的摘要算法(Hash函数)一起使用...
  • java实现写字板对pdf文件签名 思路 首先明白写字板签名完输出的是base64的图片,剩下的就是将此图片插入到pdf文件中,实现此步骤的技术很多,可以用itex5但是为了实现与其他数据一起动态插入我选择的freemark。 大概...
  • <p>java 怎么做到页面显示pdf文件,并实现在pdf文件上签名功能?</p>
  • java 抠图实现图片签名

    千次阅读 2016-06-29 22:02:25
    java"] package com.thinkgem.jeesite.modules.file.utils; import com.drew.imaging.ImageMetadataReader; import com.drew.imaging.ImageProcessingException; import com.drew.metadata.Directory; .....
  • 在本文中,我将向您展示如何使用Spire.PDF for Java对PDF文档进行数字签名。 在运行以下示例之前,您需要在项目中添加Spire.Pdf.jar作为依赖项。 例子1.添加文本签名到PDF //Load a pdf document PdfDocument doc =...
  • RSA数字签名java实现

    2014-05-12 17:32:48
    验证者用签字者的公钥参数e解密来完成认证。 下面简要描述数字签名和认证的过程。 (1)、生成密钥 为用户随机生成一对密钥:公钥(e,n)和私钥(d,n). (2)、签名过程 a) 计算消息的散列值H(M). b) 用私钥(d,n)加密...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,666
精华内容 1,866
关键字:

java签字

java 订阅