# 合同管理系统中的合同合成 **Repository Path**: fanhuibin1/contract-generator ## Basic Information - **Project Name**: 合同管理系统中的合同合成 - **Description**: 本代码是一个Java 的开源工具类,旨在帮助开发者实现合同管理系统中的合同合成。它支持多种合同生成方式,包括基于占位符的合成、基于书签的文档合成以及基于内容块(`stdContent` 或者叫 `ContentControl`)的合成。此外,它还支持与肇新合同系统集成,实现在线模板制作与合成的功能。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 7 - **Forks**: 4 - **Created**: 2025-03-06 - **Last Updated**: 2026-04-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 项目介绍 本项目是一个基于 Java 的开源工具类,旨在帮助开发者实现word文档的合成、合并等功能,尤其是合同管理系统中的合同的操作。它支持多种合同生成方式,包括基于占位符的合成、基于书签的文档合成以及基于内容块(`stdContent` 或者叫 `ContentControl`)的合成。此外,它还支持与肇新合同系统集成,实现在线模板制作与合成的功能。目前仅支持docx格式的文档的合成,如果要支持doc格式的文档请自行扩展(当然也鼓励大家提交相关的实现)。 ## 功能特性 - **基于占位符的合成**:支持通过占位符(如 `{{jiafang}}`)动态替换合同内容。 - **基于书签的合成**:支持在 Word 文档中使用书签定位并插入内容。 - **基于内容块的合成**:支持通过预定义的内容块(`stdContent`)快速生成合同。 - **HTML格式文本合成**:支持在内容块中使用HTML标签进行富文本格式化,包括粗体、斜体、下划线、换行等。 - **HTML表格合成**:支持在内容块中插入HTML表格,自动转换为Word表格格式。 - **混合内容合成**:支持在同一个内容块中混合使用纯文本、HTML格式文本和表格。 - **基于肇新合同在线模板制作与合成**:与肇新合同系统集成,支持在线模板制作与合同生成。 ## 快速开始 ### 环境要求 - Java 11 - Maven 3.x ### 使用示例 代码中提供了三个测试用的文件,位于/resources文件夹下。也可以使用Test.java体验功能 #### 1. 基于占位符的合成 ```java List docContents = new ArrayList(); DocContent doc = new DocContent(); doc.setContent("山西肇新科技有限公司"); doc.setKey("{{jiafang}}"); docContents.add(doc); DocContent doc1 = new DocContent(); doc1.setContent("北京某某科技有限公司"); doc1.setKey("{{yifang}}"); docContents.add(doc1); PlaceholderMerge merge = new PlaceholderMerge(); merge.doMerge(inputFile, outputFile, docContents); ``` #### 2. 基于书签的合成 ```java List docContents = new ArrayList(); DocContent doc = new DocContent(); doc.setContent("山西肇新科技有限公司"); doc.setKey("jiafang"); docContents.add(doc); DocContent doc1 = new DocContent(); doc1.setContent("北京某某科技有限公司"); doc1.setKey("yifang"); docContents.add(doc1); BookmarkMerge merge = new BookmarkMerge(); merge.doMerge(inputFile, outputFile, docContents); ``` #### 3. 基于内容块的合成 ```java DocContent doc = new DocContent(); doc.setContent("山西肇新科技有限公司"); doc.setKey("templateElement659406749519941"); docContents.add(doc); DocContent doc1 = new DocContent(); doc1.setContent("北京某某科技有限公司"); doc1.setKey("templateElement659406838063173"); docContents.add(doc1); ContentControlMerge merge = new ContentControlMerge(); merge.doMerge(inputFile, outputFile, docContents); ``` #### 4. 基于内容块的HTML格式合成 ```java List docContents = new ArrayList(); // HTML文本格式合成 DocContent doc = new DocContent(); doc.setContent("山西肇新科技有限公司"); // 粗体 doc.setKey("templateElement659406749519941"); docContents.add(doc); DocContent doc1 = new DocContent(); doc1.setContent("北京某某科技有限公司
技术服务商"); // 斜体+换行+下划线 doc1.setKey("templateElement659406838063173"); docContents.add(doc1); // 复杂HTML格式合成 DocContent doc2 = new DocContent(); doc2.setContent( "

合作协议详情:

" + "

1. 合作期限:2024年1月1日至2024年12月31日

" + "

2. 合作内容:软件开发与技术咨询服务

" + "

3. 重要条款:双方应严格遵守保密协议

" ); doc2.setKey("templateElement659406838063174"); docContents.add(doc2); ContentControlMerge merge = new ContentControlMerge(); merge.doMerge(inputFile, outputFile, docContents); ``` #### 5. 基于内容块的HTML表格合成 ```java List docContents = new ArrayList(); // HTML表格合成 DocContent tableDoc = new DocContent(); tableDoc.setContent( "

员工信息表:

" + "" + "" + "" + "" + "" + "
姓名职位部门
张三软件工程师技术部
李四产品经理产品部
王五UI设计师设计部
" + "

以上为公司员工基本信息

" ); tableDoc.setKey("templateElement659406749519941"); docContents.add(tableDoc); // 带格式的表格合成 DocContent formattedTableDoc = new DocContent(); formattedTableDoc.setContent( "

项目进度表:

" + "" + "" + "" + "" + "" + "
项目名称负责人状态进度
系统升级张三进行中75%
新功能开发李四已完成100%
Bug修复王五待开始0%
" + "

注:进度每周更新一次

" ); formattedTableDoc.setKey("templateElement659406838063173"); docContents.add(formattedTableDoc); ContentControlMerge merge = new ContentControlMerge(); merge.doMerge(inputFile, outputFile, docContents); ``` ### HTML表格功能详解 #### 支持的HTML标签 - ``:表格容器,支持样式设置 * `style="width: 80%"` - 设置表格宽度(支持百分比) * `style="border: 1px solid black"` - 设置表格边框 - ``:表格行 - `
`:表头单元格(自动加粗居中),支持样式设置 * `style="width: 30%"` - 设置列宽(支持百分比) - ``:普通数据单元格,支持样式设置 * `style="width: 30%"` - 设置列宽(支持百分比) #### 表格样式示例 ```java // 带边框和宽度的表格 DocContent tableDoc = new DocContent(); tableDoc.setContent( "

带边框和宽度的表格示例:

" + "" + "" + "" + "" + "" + "" + "" + "" + "
项目描述状态
系统升级升级核心组件版本进行中
功能开发实现新的业务需求已完成
" ); tableDoc.setKey("templateElement659406749519941"); docContents.add(tableDoc); // 无边框但有列宽的表格 DocContent tableDoc2 = new DocContent(); tableDoc2.setContent( "" + "" + "" + "" + "" + "" + "" + "" + "
姓名职位工作内容部门
张三工程师负责系统架构设计技术部
" ); tableDoc2.setKey("templateElement659406838063173"); docContents.add(tableDoc2); // 带边框和对齐的表格 DocContent alignedTableDoc = new DocContent(); alignedTableDoc.setContent( "

边框和对齐综合示例:

" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "
左对齐表头居中表头右对齐表头默认表头
左对齐内容居中内容右对齐内容默认内容
样式左对齐样式居中样式右对齐普通内容
" + "

这个表格展示了边框、宽度和对齐方式的组合使用

" ); alignedTableDoc.setKey("templateElement659406838063174"); docContents.add(alignedTableDoc); // 带颜色设置的表格 DocContent colorTableDoc = new DocContent(); colorTableDoc.setContent( "

颜色设置示例:

" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "
红色表头蓝色表头绿色表头橙色表头
红色文字蓝色文字绿色文字紫色文字
十六进制红色RGB蓝色RGBA绿色深蓝色
" + "

这个表格展示了各种颜色格式的使用

" ); colorTableDoc.setKey("templateElement659406838063175"); docContents.add(colorTableDoc); // 表格前后内容混合示例 DocContent mixedContentDoc = new DocContent(); mixedContentDoc.setContent( "

项目进度报告

" + "

以下是本月项目进度统计表:

" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "
项目名称负责人状态进度备注
系统升级项目张三进行中75%预计下周完成
新功能开发李四已完成100%已上线运行
" + "

总结说明:

" + "

1. 本月共启动2个项目,其中1个已完成,1个进行中。

" + "

2. 整体进度符合预期,系统升级项目需要重点关注。

" + "

3. 下月计划:完成所有进行中项目,启动新的功能模块开发。

" + "

报告日期:2024年12月28日

" ); mixedContentDoc.setKey("templateElement659406838063176"); docContents.add(mixedContentDoc); ``` #### 表格样式说明 1. **表格宽度设置** - 使用 `style="width: XX%"` 设置表格整体宽度 - 支持百分比值,相对于页面宽度 - 默认宽度为90%页面宽度 2. **表格边框设置** - 使用 `style="border: 1px solid black"` 设置表格边框 - 边框会应用到表格的所有单元格 - 不设置border属性时默认无边框 3. **表格对齐设置** - 表格整体对齐:`` 或 `
` - 支持 `left`(左对齐)、`center`(居中)、`right`(右对齐) - 默认为左对齐 4. **列宽设置** - 在 `` - 使用 `style` 属性:`` - 支持 `left`(左对齐)、`center`(居中)、`right`(右对齐) - 表头(`` 或 `` 7. **表格前后内容混合** - 支持在表格前添加标题、说明等内容 - 支持在表格后添加总结、备注等内容 - 表格前后的内容支持完整的HTML格式(粗体、斜体、下划线、段落等) - 示例:`

表格标题

` 或 `` 标签上使用 `style="width: XX%"` - 支持百分比值,相对于表格整体宽度 - 建议所有列的宽度总和为100% - 未设置时自动平均分配宽度 5. **单元格对齐设置** - 使用 `align` 属性:`内容内容`)默认居中对齐,普通单元格(``)默认左对齐 6. **单元格颜色设置** - 使用 `style="color: 颜色值"` 设置单元格文字颜色 - 支持多种颜色格式: * 颜色名称:`red`、`blue`、`green`、`black`、`white`、`yellow`、`cyan`、`magenta`、`gray`、`orange`、`purple`、`brown`、`pink`、`lime`、`navy`、`teal`、`silver`、`gold`、`maroon`、`olive`、`aqua`、`fuchsia` * 十六进制:`#FF0000`、`FF0000`(红色) * RGB格式:`rgb(255, 0, 0)`(红色) * RGBA格式:`rgba(255, 0, 0, 1)`(红色,忽略透明度) - 示例:`红色文字蓝色表头
...

表格说明

` 8. **注意事项** - 边框样式目前仅支持实线黑色边框 - 颜色设置仅影响文字颜色,不支持背景色 - 宽度仅支持百分比形式 - 对齐方式支持 align 属性和 CSS style 两种写法 - 如果列宽总和超过100%,会自动调整以适应表格宽度 ### 与肇新合同系统集成 1.使用肇新合同系统在线制作模板(参考https://doc.zhaoxinms.com/function/01/) 2.在肇新合同的源码中集成ZxContractMerge.java中的代码实现合成。 ```java //第一步获取当前的主文件 ContractDraftFilesVo draftFiles = contractDraftFilesService.queryDraftFileByContractId(contract.getId(), contract.getFileGroupsVersionName()); //获取主文件 String filePath = confFileServiceImpl.getFilePath(Long.valueOf(draftFiles.getMainFileId())); //第二步获取当前的文件待合成的数据 List mergeMap = contractAuditService.getContractMergeData (contract.getId()); //第三步调用合成方法完成合成。 List mc = new ArrayList(); for(Map m:mergeMap) { String docId = (String)m.get("docId"); String content = (String)m.get("content"); DocContent c = new DocContent(); c.setContent(content); c.setKey("templateElement"+docId); mc.add(c); } ContentControlMerge merge = new ContentControlMerge(); merge.doMerge(filePath, "D:\\test.docx", mc); ``` ## HTML格式功能详解 ### 支持的HTML标签 #### 文本格式标签 - `` 或 ``:粗体文本 - `` 或 ``:斜体文本 - ``:下划线文本 - `
` 或 `
`:换行 - `

`:段落(自动换行) - ``:内联样式 #### 表格标签 - ``:表格容器 - ``:表格行 - `
`:表头单元格(自动加粗居中) - ``:普通数据单元格 #### 支持的CSS样式属性 - `font-weight: bold`:粗体 - `font-style: italic`:斜体 - `text-decoration: underline`:下划线 ### HTML功能示例 #### 基本文本格式 ```java DocContent doc = new DocContent(); doc.setContent("重要通知:请所有员工按时参加会议。"); doc.setKey("templateElement659406749519941"); ``` #### 混合格式与换行 ```java DocContent doc = new DocContent(); doc.setContent( "

合同条款:

" + "

1. 本合同自签署之日起生效

" + "

2. 甲乙双方应严格遵守合同条款

" + "

3. 如有争议,应友好协商解决

" ); doc.setKey("templateElement659406838063173"); ``` #### HTML表格 ```java DocContent tableDoc = new DocContent(); tableDoc.setContent( "

项目信息表:

" + "" + "" + "" + "" + "
项目名称负责人状态
系统升级张三进行中
功能开发李四已完成
" + "

项目进度实时更新

" ); tableDoc.setKey("templateElement659406838063174"); ``` #### 内联CSS样式 ```java DocContent doc = new DocContent(); doc.setContent( "粗体文本 和 " + "斜体文本 以及 " + "下划线文本" ); doc.setKey("templateElement659406749519941"); ``` ### 注意事项 1. HTML内容会自动解析并转换为Word格式 2. 如果HTML解析失败,会自动降级为纯文本处理 3. 表格单元格内支持嵌套使用文本格式标签 4. 支持表格与其他内容的混合使用 5. 建议使用标准的HTML标签以确保最佳兼容性 ### pdf添加水印 ```java PdfUtil.addWaterMark(src,dest, "山西肇新科技"); ``` ### pdf合同文件合成签章信息 #### 第一步需要生成证书(代码中已有证书,测试的话可忽略该内容,开发生产的话需要自己生成) 1. **证书生成命令功能**: - `-genkeypair`:生成密钥对(公钥和私钥)。 - `-alias whj`:为密钥对指定别名(后续操作需通过别名引用)。 - `-keypass zxcmms`:密钥的密码(这里是`zxcmms`,建议生产环境使用复杂密码)。 - `-storepass zxcmms`:密钥库的密码(与`-keypass`相同,但通常建议区分)。 - `-dname`:证书的标识信息(注意需使用英文引号`""`,你提供的命令中用了中文引号“”会导致错误): - `C=CN`:国家代码(中国)。 - `ST=SX`:省份(山西)。 - `L=TY`:城市(太原)。 - `O=zxcm`:组织(肇新科技)。 - `OU=dev`:部门(开发)。 - `CN=zhaoxinms.com`:通用名称(域名或服务器名)。 - `-keyalg RSA`:使用RSA算法。 - `-keysize 2048`:密钥长度2048位。 - `-validity 36500`:证书有效期36500天(约100年)。 - `-keystore D:\keystore\server.keystore`:生成的密钥库文件路径。 2. **执行前的检查**: - **目录是否存在**:确保路径 `D:\keystore\` 存在,否则会报错。若目录不存在,需手动创建。 - **权限问题**:确保你有权限在D盘写入文件。 3. **执行命令**(注意英文引号): ```bash keytool -genkeypair -alias whj -keypass zxcmms -storepass zxcmms -dname "C=CN,ST=SX,L=TY,O=zxcm,OU=dev,CN=zhaoxinms.com" -keyalg RSA -keysize 2048 -validity 36500 -keystore D:\keystore\server.keystore ``` 4. **将现有的 JKS格式的密钥库(Java KeyStore) 转换为 PKCS12格式的密钥库** ```bash keytool -importkeystore -srckeystore D:\keystore\server.keystore -destkeystore D:\keystore\whj.p12 -srcalias whj -destalias serverkey -srcstoretype jks -deststoretype pkcs12 -srcstorepass zxcmms -deststorepass zxcmms -noprompt ``` #### 打开pdf提示无法验证签名,请使用CA机构办法的证书。可以参考其他项目:https://gitee.com/capki/iText-GM ### pdf合成二维码 ```java //二维码合成 BufferedImage qrCodeImage = PdfQrCodeGenerator.generateQrCode("https://zhaoxinms.com", 200, 200); // 合成到PDF PdfQrCodeGenerator.addQrCodeToPdf( basePath + File.separator +inputFileName, // 原始PDF路径 basePath + File.separator + outputFile3Name, // 输出PDF路径 qrCodeImage, // 二维码图片 50f, // X坐标 700f, // Y坐标 100f, // 宽度 100f // 高度 ); ``` ## 许可证 本项目基于 [MIT 许可证](LICENSE) 开源。 ## 联系我们 如有任何问题或建议,请通过以下方式联系我们: - Email: develop@zhaoxinms.com 肇新合同管理系统 希望这个 `README.md` 文件能帮助你快速启动项目!如果有任何问题或需要进一步调整,请随时告诉我。