如何使用java实现合法的电子合同?

2020-04-16 11:20发布

[图]1,电子签名实现2,电子印章实现3,合法证书绑定4,电子证书加密实现

1,电子签名实现2,电子印章实现3,合法证书绑定4,电子证书加密实现


2条回答
霸气的名字 - 喜欢晴天
2楼 · 2020-09-30 14:25

参考如下代码:

package com.wonders.cop.billing.util;

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.image.BufferedImage;

import java.io.File;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import javax.imageio.ImageIO;

public class ImageMarkLogoUtil {

// 水印透明度

private static float alpha = 1f;

// 水印横向位置

private static int positionWidth = 82;

// 水印纵向位置

private static int positionHeight = 545;

// 水印文字字体

private static Font font = new Font("宋体", Font.PLAIN, 13);

// 水印文字颜色

private static Color color = Color.black;

public static void main(String[] args) {

String srcImgPath = "d:/888880002302900_web.jpg";

String targerTextPath = "d:/qie_text.jpg";

ImageMarkLogoUtil

.markImageByTexts(testValue(),

BillDetailImagePosition.getPosition("888880002302900"), srcImgPath,

targerTextPath);

}

public static Map testValue() {

Map value = new HashMap();

value.put("feedPrice", "15.1");

value.put("feedCount", "20");

value.put("nowNum", "124");

value.put("drainageCount", "55");

value.put("drainagePrice", "1.5");

value.put("feedCost", "66");

value.put("cost", "66");

value.put("drainageCost", "100");

value.put("barcode", "10101010101010101");

value.put("nextCopy", "2014-12-10");

value.put("waterType", "居民生活用水");

value.put("meterReader", "测试人员");

value.put("copyNumber", "741sg");

value.put("prevCarryOver", "0.25");

value.put("nowCarryOver", "2.12");

value.put("openDate", "20141002");

value.put("nextMonth", "201402 ");

value.put("remark", "您缴付的2013年03月30.80元水费,我公司已收到,谢谢!");

value.put("detailStatus", "00");

value.put("billStatus", "00");

value.put("prevMonth", "201406");

value.put("lastPayDate", "20140112");

value.put("companyName", "市北水");

value.put("type", "1");

value.put("amount", "58.1");

value.put("address", "浦秀路220弄10号101");

value.put("year","2014");

value.put("month", "04");

value.put("billId", "11111");

value.put("account", "38445450");

value.put("companyId", "888880002302900");

value.put("realName", "姚航");

return value;

}

/**

* 给图片添加水印文字、可设置水印文字的旋转角度

*

* @param logoText

* @param srcImgPath

* @param targerPath

* @param degree

*/

public static void markImageByTexts(Map value,

Map position, String srcImgPath, String targerPath) {

InputStream is = null;

OutputStream os = null;

try {

// 1、源图片

Image srcImg = ImageIO.read(new File(srcImgPath));

BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),

srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);

// 2、得到画笔对象

Iterator positionIter = position.keySet().iterator();

String key = "";

String logotext = "";

String[] xy;

while (positionIter.hasNext()) {

key = positionIter.next();

xy = position.get(key);

logotext = value.get(key);

System.out.println("key:"+key+",value:"+logotext);

if (xy != null && xy.length == 2)

printText(srcImg, buffImg, logotext,

Integer.valueOf(xy[0]), Integer.valueOf(xy[1]));

}

// 10、生成图片

os = new FileOutputStream(targerPath);

ImageIO.write(buffImg, "JPG", os);

System.out.println("图片完成添加水印文字");

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

if (null != is)

is.close();

} catch (Exception e) {

e.printStackTrace();

}

try {

if (null != os)

os.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

/**

* 在图片上打印文字

*

* @param srcImg

* @param buffImg

* @param logoText

* @return

*/

private static void printText(Image srcImg, BufferedImage buffImg,

String logoText, Integer positionX, Integer PositionY) {

Graphics2D g = buffImg.createGraphics();

// 3、设置对线段的锯齿状边缘处理

g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,

RenderingHints.VALUE_INTERPOLATION_BILINEAR);

g.drawImage(

srcImg.getScaledInstance(srcImg.getWidth(null),

srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);

// 5、设置水印文字颜色

g.setColor(color);

// 6、设置水印文字Font

g.setFont(font);

// 7、设置水印文字透明度

g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,

alpha));

// 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)

g.drawString(logoText, positionX, PositionY);

// 9、释放资源

g.dispose();

}

}


征戰撩四汸
3楼 · 2021-11-15 17:10

1、生成电子合同

String id = "?";// 合同id,根据自己需求

// 合同保存路径

String contractPath = FilesUtil.getContract();

// 电子合同临时保存路径

StringBuilder temporaryPath = new StringBuilder(contractPath)

.append("temporary");

// 判断临时文件夹是否存在,不存在则新建

File file = new File(temporaryPath.toString());

if (!file.exists()) {

file.mkdirs();

}

temporaryPath.append(File.separator).append(id).append(".docx");

// 1、  查询合同信息(该方法省略,具体看自己的需求)

Map replaceMap = getContractData(contractService,id, temporaryPath.toString());

String userNum = replaceMap.get("userNum");

StringBuilder destPathDOCX = new StringBuilder(contractPath)

.append(userNum);

// 判断用户文件夹是否存在,不存在则新建

File userNumFile = new File(destPathDOCX.toString());

if (!userNumFile.exists()) {

userNumFile.mkdirs();

}

destPathDOCX.append(File.separator).append(id).append(".docx");

//                    StringBuilder savePath = new StringBuilder(userNum)

//                    .append(File.separator).append(id).append(".pdf");

Map replaceTableMap = new HashMap();

replaceTableMap.put("totalAmount", replaceMap.remove("totalAmount"));

replaceTableMap.put("totalCapitalizeAmount", replaceMap.remove("totalCapitalizeAmount"));

// 2、  替换合同里面的参数

WordUtil.replaceAndGenerateWord(temporaryPath.toString(), destPathDOCX.toString(), replaceMap, replaceTableMap);

StringBuilder pdfFile = new StringBuilder(contractPath)

.append(userNum).append(File.separator).append(id).append(".pdf");

// 3、将word转pdf文件

Boolean bool = WordUtil.wordConverterToPdf(destPathDOCX.toString(), pdfFile.toString());

if (!bool) {

map.put("msg", "合同word转pdf文件失败");

return;

}

// 4.1 删除临时电子合同

File temporaryPathDOCX = new File(temporaryPath.toString());

if (temporaryPathDOCX.exists()) {

temporaryPathDOCX.delete();

}

// 4.2 删除word电子合同

File fileDOCX = new File(destPathDOCX.toString());

if (fileDOCX.exists()) {

fileDOCX.delete();

}

2、电子合同盖章

/**

* @Title: itextPDFAddPicture

* @Description: 为pdf加图片(电子合同盖公章)

* @param inputStream 电子合同pdf文件流

* @param map {company:公司公章名称,purpose:公章用途,year:日期}

* @param targetPath 保存路径

* @throws Exception 异常参数

*/

public static void itextPDFAddPicture(InputStream inputStream, Map map, String targetPath) throws Exception{

// 1.1 读取模板文件

        PdfReader reader = new PdfReader(inputStream);

        // 1.2 创建文件输出流

        FileOutputStream out = new FileOutputStream(targetPath);

        // 2、创建PdfStamper对象

        PdfStamper stamper = new PdfStamper(reader, out);

        // 3、设置公章信息

        String company = FilesUtil.getDefaultCompany();// 公司公章名称

        String purpose = FilesUtil.getDefaultPurpose();// 公章用途

        String year = map.get("year");// 日期

        if (StringUtils.isStrNull(year)) {

        year = new SimpleDateFormat (FilesUtil.getContractTimeFormat()).format(new Date());

        }

        // 4、生成公章

        BufferedImage bufferedImage = Graphics2DUtil.startGraphics2D(company, purpose, year);// 整个公章图片流

        BufferedImage[] imgs = Graphics2DUtil.splitImage(bufferedImage, 1, 2);

        BufferedImage leftBufferedImage = imgs[0];// 左边公章图片流

        BufferedImage rightBufferedImage = imgs[1];// 右边公章图片流

        

        // 5、读公章图片

        Image image = Image.getInstance(imageToBytes(bufferedImage));

        Image leftImage = Image.getInstance(imageToBytes(leftBufferedImage));

        Image rightImage = Image.getInstance(imageToBytes(rightBufferedImage));

        int chunkWidth = 200;// 公章大小,x轴

        int chunkHeight = 200;// 公章大小,y轴

        // 获取pdf页面的高和宽

        Rectangle pageSize = reader.getPageSize(1);

        float height = pageSize.getHeight();

        float width = pageSize.getWidth();

        // 6、为pdf每页加印章

        // 设置公章的位置

        float xL = width - chunkWidth/2 - 2;

        float yL = height/2-chunkHeight/2-25;

        

        float xR = width-chunkHeight/2 + chunkHeight/8 + 4;

        float yR = yL;

        // 6.1 第一页盖左章

        leftImage.scaleToFit(chunkWidth, chunkHeight);// 公章大小

        leftImage.setAbsolutePosition(xL, yL);// 公章位置

        // 6.2 第二页盖右章

    rightImage.scaleToFit(chunkWidth, chunkHeight);// 公章大小

        rightImage.setAbsolutePosition(xR, yR);// 公章位置

        int pdfPages = reader.getNumberOfPages();// pdf页面页码

        // 遍历为每页盖左章或右章

        for (int i = 1; i <= pdfPages; i++) {

        if (i % 2 == 0) {// 盖右章

        stamper.getOverContent(i).addImage(rightImage);

        } else {// 盖左章

        stamper.getOverContent(i).addImage(leftImage);

        }

}

        

        // 6.3 最后一页盖公章

    image.scaleToFit(chunkWidth, chunkWidth);

    image.setAbsolutePosition(width/2 + 32, height-chunkHeight + 20);

    stamper.getOverContent(pdfPages).addImage(image);

   

    // 7、关闭相关流

        stamper.close();

        out.close();

        reader.close();

        inputStream.close();

}




相关问题推荐

  • 回答 2

    Statement的execute(String query)方法用来执行任意的SQL查询,如果查询的结果是一个ResultSet,这个方法就返回true。如果结果不是ResultSet,比如insert或者update查询,它就会返回false。我们可以通过它的getResultSet方法来获取ResultSet,或者通过getUpda...

  • 回答 22

    忙的时候项目期肯定要加班 但是每天加班应该还不至于

  • 回答 108
    已采纳

    虽然Java人才越来越多,但是人才缺口也是很大的,我国对JAVA工程师的需求是所有软件工程师当中需求大的,达到全部需求量的60%-70%,所以Java市场在短时间内不可能饱和。其次,Java市场不断变化,人才需求也会不断增加。马云说过,未来的制造业要的不是石油,...

  • 回答 5
    已采纳

    工信部证书含金量较高。工信部是国务院的下属结构,具有发放资质、证书的资格。其所发放的证书具有较强的权威性,在全国范围内收到认可,含金量通常都比较高。 工信部证书,其含义也就是工信部颁发并承认的某项技能证书,是具有法律效力的,并且是国家认可的...

  • 回答 70
    已采纳

    学Java好不好找工作?看学完Java后能做些什么吧。一、大数据技术Hadoop以及其他大数据处理技术都是用Java或者其他,例如Apache的基于Java 的 HBase和Accumulo以及ElasticSearchas。但是Java在此领域并未占太大空间,但只要Hadoop和ElasticSearchas能够成长壮...

  • 回答 16
    已采纳

    就是java的基础知识啊,比如Java 集合框架;Java 多线程;线程的五种状态;Java 虚拟机;MySQL (InnoDB);Spring 相关;计算机网络;MQ 消息队列诸如此类

  • 回答 12

    #{}和${}这两个语法是为了动态传递参数而存在的,是Mybatis实现动态SQL的基础,总体上他们的作用是一致的(为了动态传参),但是在编译过程、是否自动加单引号、安全性、使用场景等方面有很多不同,下面详细比较两者间的区别:1.#{} 是 占位符 :动态解析 ...

  • 回答 62

    没问题的,专科学历也能学习Java开发的,主要看自己感不感兴趣,只要认真学,市面上的培训机构不少都是零基础课程,能跟得上,或是自己先找些资料学习一下。

  • 回答 4

    1、反射对单例模式的破坏采用反射的方式另辟蹊径实例了该类,导致程序中会存在不止一个实例。解决方案其思想就是采用一个全局变量,来标记是否已经实例化过了,如果已经实例化过了,第 二次实例化的时候,抛出异常2、clone()对单例模式的破坏当需要实现单例的...

  • 回答 5

     优点: 一、实例控制  单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。 二、灵活性  因为类控制了实例化过程,所以类可以灵活更改实例化过程。 缺点: 一、开销  虽然数量很少,但如果每次对象请求引用时都要...

  • 回答 4

    这个主要是看你数组的长度是多少, 比如之前写过的一个程序有个数组存的是各个客户端的ip地址:string clientIp[4]={XXX, xxx, xxx, xxx};这个时候如果想把hash值对应到上面四个地址的话,就应该对4取余,这个时候p就应该为4...

  • 回答 6

     哈希表的大小 · 关键字的分布情况 · 记录的查找频率 1.直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数)。...

  • 回答 6

    哈希表的大小取决于一组质数,原因是在hash函数中,你要用这些质数来做模运算(%)。而分析发现,如果不是用质数来做模运算的话,很多生活中的数据分布,会集中在某些点上。所以这里最后采用了质数做模的除数。 因为用质数做了模的除数,自然存储空间的大小也用质数了...

  • 回答 2

    是啊,哈希函数的设计至关重要,好的哈希函数会尽可能地保证计算简单和散列地址分布均匀,但是,我们需要清楚的是,数组是一块连续的固定长度的内存空间

  • 回答 3

     解码查表优化算法,seo优化

  • 回答 5

    1.对对象元素中的关键字(对象中的特有数据),进行哈希算法的运算,并得出一个具体的算法值,这个值 称为哈希值。2.哈希值就是这个元素的位置。3.如果哈希值出现冲突,再次判断这个关键字对应的对象是否相同。如果对象相同,就不存储,因为元素重复。如果对象不同,就...

没有解决我的问题,去提问