完整word版,Java 生成数字证书系列
- 格式:doc
- 大小:1.17 MB
- 文档页数:24
java如何生成word文档_使用Java生成word文档(附源码)当我们使用Java生成word文档时,通常首先会想到iText和POI,这是因为我们习惯了使用这两种方法操作Excel,自然而然的也想使用这种生成word文档。
但是当我们需要动态生成word时,通常不仅要能够显示word中的内容,还要能够很好的保持word中的复杂样式。
这时如果再使用IText和POI去操作,就好比程序员去搬砖一样痛苦。
这时候,我们应该考虑使用FreeMarker的模板技术快速实现这个复杂的功能,让程序员在喝咖啡的过程中就把问题解决。
实现思路是这样的:先创建一个word文档,按照需求在word中填好一个模板,然后把对应的数据换成变量${},然后将文档保存为xml文档格式,使用文档编辑器打开这个xml格式的文档,去掉多余的xml符号,使用Freemarker读取这个文档然后替换掉变量,输出word文档即可。
具体过程如下:1.创建带有格式的word文档,将该需要动态展示的数据使用变量符替换。
2.将刚刚创建的word文档另存为xml格式。
3.编辑这个XMl文档去掉多余的xml标记,如图中蓝色部分4.从官网最新的开发包,将freemarker.jar拷贝到自己的开发项目中。
5.新建DocUtil类,实现根据Doc模板生成word文件的方法package com.favccxx.secret.util;import java.io.BufferedWriter;import java.io.File;import java.io.FileOutputStream;import java.io.OutputStreamWriter;import java.io.Writer;import java.util.Map;import freemarker.template.Configuration;import freemarker.template.DefaultObjectWrapper;import freemarker.template.Template;import freemarker.template.TemplateExceptionHandler;public class DocUtil {privateConfiguration configure = null;publicDocUtil(){configure= new Configuration();configure.setDefaultEncoding("utf-8");}/*** 根据Doc模板生成word文件* @param dataMap Map 需要填入模板的数据* @param fileName 文件名称* @param savePath 保存路径*/publicvoid createDoc(Map dataMap, String downloadType, StringsavePath){try{//加载需要装填的模板Templatetemplate = null;//加载模板文件configure.setClassForTemplateLoading(this.getClass(),"/com /favccxx/secret/templates");//设置对象包装器configure.setObjectWrapper(newDefaultObjectWrapper());//设置异常处理器configure.setT emplateExceptionHandler(TemplateException Handler.IGNORE_HANDLER);//定义Template对象,注意模板类型名字与downloadType要一致template= configure.getTemplate(downloadType + ".xml");//输出文档FileoutFile = new File(savePath);Writerout = null;out= new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"utf-8"));template.process(dataMap,out);outFile.delete();}catch (Exception e) {e.printStackTrace();}}}6.用户根据自己的需要,调用使用getDataMap获取需要传递的变量,然后调用createDoc方法生成所需要的文档。
POI读word文档还行,写文档实在不敢恭维,复杂的样式很难控制不提,想象一下一个20多页,嵌套很多表格和图像的word文档靠POI来写代码输出,对程序员来说比去山西挖煤还惨,况且文档格式还经常变化。
iText操作Excel还行。
对于复杂的大量的word也是噩梦。
直接通过JSP输出样式基本不达标,而且要打印出来就更是惨不忍睹。
Word从2003开始支持XML格式,用XML还做就很简单了。
大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。
经测试这样方式生成的word 文档完全符合office标准,样式、内容控制非常便利,打印也不会变形,生成的文档和office 中编辑文档完全一样。
看看实际效果:首先用office【版本要2003以上,以下的不支持xml格式】编辑文档的样式,图中红线的部分就是我要输出的部分:将编辑好的文档另存为XML再用Firstobject free XML editor【Firstobject free XML editor的使用见这里】将xml中我们需要填数据的地方打上FreeMarker标记【FreeMarker的语法见这里】最后生成的文档样式主要程序代码:view sourceprint?01 package com.havenliu.document;0203 import java.io.BufferedWriter;04 import java.io.File;05 import java.io.FileNotFoundException;06 import java.io.FileOutputStream;07 import java.io.IOException;08 import java.io.OutputStreamWriter;09 import java.io.Writer;10 import java.util.ArrayList;11 import java.util.HashMap;12 import java.util.List;13 import java.util.Map;1415 import freemarker.template.Configuration;16 import freemarker.template.Template;17 import freemarker.template.TemplateException;1819 public class DocumentHandler {20 private Configuration configuration = null;2122 public DocumentHandler() {23 configuration = new Configuration();24 configuration.setDefaultEncoding("utf-8");25 }2627 public void createDoc() {28 //要填入模本的数据文件29 Map dataMap=new HashMap();30 getData(dataMap);31 //设置模本装置方法和路径,FreeMarker支持多种模板装载方法。
Keytool是一个Java数据证书的管理工具,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里,包含两种数据:密钥实体(Key entity)——密钥(secret key)又或者是私钥和配对公钥(采用非对称加密)可信任的证书实体(trusted certificate entries)——只包含公钥ailas(别名)每个keystore都关联这一个独一无二的alias,这个alias通常不区分大小写JDK中keytool常用命令:-genkey 在用户主目录中创建一个默认文件".keystore",还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书(在没有指定生成位置的情况下,keystore会存在用户系统默认目录,如:对于window xp系统,会生成在系统的C:\Documents and Settings\UserName\文件名为“.keystore”)-alias 产生别名-keystore 指定密钥库的名称(产生的各类信息将不在.keystore文件中)-keyalg 指定密钥的算法(如RSA DSA(如果不指定默认采用DSA))-validity 指定创建的证书有效期多少天-keysize 指定密钥长度-storepass 指定密钥库的密码(获取keystore信息所需的密码)-keypass 指定别名条目的密码(私钥的密码)-dname 指定证书拥有者信息例如:"CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名称,ST=州或省份名称,C=单位的两字母国家代码"-list 显示密钥库中的证书信息keytool -list -v -keystore 指定keystore-storepass 密码-v 显示密钥库中的证书详细信息-export 将别名指定的证书导出到文件keytool -export -alias 需要导出的别名-keystore 指定keystore -file 指定导出的证书位置及证书名称-storepass 密码-file 参数指定导出到文件的文件名-delete 删除密钥库中某条目keytool -delete -alias 指定需删除的别-keystore 指定keystore -storepass 密码-printcert 查看导出的证书信息keytool -printcert -file yushan.crt-keypasswd 修改密钥库中指定条目口令keytool -keypasswd -alias 需修改的别名-keypass 旧密码-new 新密码-storepass keystore密码-keystore sage-storepasswd 修改keystore口令keytool -storepasswd -keystoree:\yushan.keystore(需修改口令的keystore) -storepass 123456(原始密码) -new yushan(新密码)-import 将已签名数字证书导入密钥库keytool -import -alias 指定导入条目的别名-keystore 指定keystore -file 需导入的证书下面是各选项的缺省值。
1.1跟我学Java安全技术及应用——如何创建数字证书文件1.1.1根据证书库文件导出生成安全证书文件1、安全证书文件的格式目前数字证书的格式普遍采用的是X.509V3国际标准【是由国际电联电信委员会(ITU-T)为单点登录(SSO-Single Sign-on)和授权管理基础设施(PMI-Privilege Management Infrastructure)制定的PKI标准。
】,作为文件形式存在的证书一般有如下的这几种格式。
其中只有pfx格式的数字证书是包含有私钥的,而cer格式的数字证书里面只有公钥(可以对外公开的,不用加密)没有私钥。
因此,只有pfx格式的数字证书是包含有私钥的,cer格式的数字证书里面只有公钥没有私钥。
(1)带有私钥的证书由Public Key Cryptography Standards #12(PKCS#12)标准定义,包含了公钥和私钥的二进制格式的证书形式,并以pfx作为证书文件后缀名。
(2)二进制编码的证书证书中没有私钥,DER 编码二进制格式的证书文件,以cer作为证书文件后缀名。
(3)Base64编码的证书文件中没有私钥,BASE64 编码格式的证书文件,也是以cer作为证书文件后缀名。
2、JDK中的keytool命令程序Keytool为Java 系统库JDK中的一个命令程序,Keytool 是用于管理密钥和证书的工具,使用户和管理员能管理自己的公/私钥对以及相关的证书。
3、导出生成安全证书文件的命令和创建过程(1)在操作系统的命令行窗口中输入如下的命令keytool -export -alias yangSB -file F:/server.cer -keystore f:/server.keystore -validity 365将出现如下的示图:上面的命令的主要功能将实现把位于目录文件中的数字证书库f:/server.keystore中的别名为“yangSB”的证书导出到F:/server.cer的数字证书文件中。
如何利⽤java程序实现加密所需的公钥、密钥、数字证书本篇的主要⽬的在于实现pdf的数字签名问题,只是作为我学习知识的总结。
1、数字签名算法的概述数字签名:私钥⽤于签名,公钥⽤于验证。
数字签名的作⽤:验证数据的完整性,认证数据来源,抗否认。
数字签名实现的具体原理:1、将报⽂按双⽅约定的HASH算法计算得到⼀个固定位数的报⽂摘要。
在数学上保证,只要改动报⽂中任何⼀位,重新计算出的报⽂摘要值就会与原先的值不相符。
这样就保证了报⽂的不可更改性。
(详见参考资料的"公钥密码技术原理"章节)2、将该报⽂摘要值⽤发送者的私⼈密钥加密,然后连同原报⽂和数字证书(包含公钥)⼀起发送给接收者⽽产⽣的报⽂即称数字签名。
3、接收⽅收到数字签名后,⽤同样的HASH算法对报⽂计算摘要值,然后与⽤发送者的公开密钥进⾏解密解开的报⽂摘要值相⽐较,如相等则说明报⽂确实来⾃所称的发送者。
4、同时通过证书颁发机构CA确认证书的有效性即可确认发送的真实⾝份。
常⽤的数字签名有:RSA、DSA、ECDSA2、RSA算法概述RSA是⽬前为⽌应⽤最为⼴泛的⾮对称加密算法。
⾮对称加密算法简单的说就是分成公钥和私钥。
加密和解密采⽤不同的算法实现,这样的好处是不需要像传统对称加密算法⼀样将相同算法的密钥分发给对⽅,从⽽减少密钥被获取所带来的严重危害,⽬前基本上都是采⽤⾮对称算法,⽽RSA是最为⼴泛的。
理论上1024位以上的RSA是⽆法破解的(或者未公开)。
基本原理:⾮对称算法将密码将密码分为公钥和私钥,公钥发送给⽤户(可以是多个),⽤户⽤公钥加密想要发送的数据,然后发送给服务器,服务器通过私钥解密加密后的数据。
基本步骤:⽣成公钥和私钥步骤:1. 随机选择两个不相等的质数p和q2. 计算p和q的乘积n (n的长度就是密钥长度。
3233写成⼆进制是110010100001,⼀共有12位,所以这个密钥就是12位。
实际应⽤中,RSA密钥⼀般是1024位,重要场合则为2048位。
java certificate工具类Java Certificate工具类是Java编程中常用的一个类库,用于处理与数字证书相关的操作。
数字证书在网络通信和信息安全领域起着重要的作用,通过使用Java Certificate工具类,我们可以方便地生成、解析、验证和管理数字证书。
本文将介绍Java Certificate工具类的基本使用方法及其在实际开发中的应用。
一、Java Certificate工具类概述Java Certificate工具类是Java提供的一个用于处理数字证书的类库,主要包括以下几个方面的功能:1. 数字证书的生成:Java Certificate工具类提供了生成数字证书的方法,可以生成包含公钥、私钥、证书有效期等信息的数字证书。
2. 数字证书的解析:Java Certificate工具类可以解析数字证书的各个字段,包括证书的颁发者、持有者、有效期、证书类型等信息。
3. 数字证书的验证:Java Certificate工具类支持对数字证书的有效性进行验证,包括验证证书的数字签名、证书是否过期等。
4. 数字证书的管理:Java Certificate工具类可以用于管理数字证书,包括导入、导出、删除证书等操作。
二、Java Certificate工具类的基本使用方法1. 生成数字证书使用Java Certificate工具类生成数字证书的基本步骤如下:(1)创建数字证书生成器对象。
(2)设置证书的有效期、持有者等信息。
(3)生成证书的公钥和私钥对。
(4)将公钥和证书信息传入数字证书生成器。
(5)调用生成方法生成数字证书。
2. 解析数字证书使用Java Certificate工具类解析数字证书的基本步骤如下:(1)创建数字证书解析器对象。
(2)通过输入流读取证书文件。
(3)调用解析方法解析数字证书。
(4)获取数字证书的各个字段信息,如颁发者、持有者、有效期等。
3. 验证数字证书使用Java Certificate工具类验证数字证书的基本步骤如下:(1)创建数字证书验证器对象。
java⽣成word的⼏种⽅案1、 Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建⼀座桥梁。
使⽤Jacob⾃带的DLL动态链接库,并通过JNI的⽅式实现了在Java平台上对COM程序的调⽤。
DLL动态链接库的⽣成需要windows平台的⽀持。
2、 Apache POI包括⼀系列的API,它们可以操作基于MicroSoft OLE 2 Compound Document Format的各种格式⽂件,可以通过这些API在Java中读写Excel、Word等⽂件。
他的excel处理很强⼤,对于word还局限于读取,⽬前只能实现⼀些简单⽂件的操作,不能设置样式。
3、 Java2word是⼀个在java程序中调⽤ MS Office Word ⽂档的组件(类库)。
该组件提供了⼀组简单的接⼝,以便java程序调⽤他的服务操作Word ⽂档。
这些服务包括:打开⽂档、新建⽂档、查找⽂字、替换⽂字,插⼊⽂字、插⼊图⽚、插⼊表格,在书签处插⼊⽂字、插⼊图⽚、插⼊表格等。
填充数据到表格中读取表格数据,1.1版增强的功能:指定⽂本样式,指定表格样式。
如此,则可动态排版word⽂档。
4、 iText操作Excel还⾏。
对于复杂的⼤量的word也是噩梦。
⽤法很简单, 但是功能很少, 不能设置打印⽅向等问题。
5、 JSP输出样式基本不达标,⽽且要打印出来就更是惨不忍睹。
6、⽤XML做就很简单了。
Word从2003开始⽀持XML格式,⼤致的思路是先⽤office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后⽤java来解析FreeMarker模板并输出Doc。
经测试这样⽅式⽣成的word⽂档完全符合office标准,样式、内容控制⾮常便利,打印也不会变形,⽣成的⽂档和office中编辑⽂档完全⼀样。
7、补充⼀种⽅案,可以⽤类似ueditor的在线编辑器编辑word⽂档,在将html⽂件转换为xhtml⽂件,再转换为word。
Java获取证书类型概述在Java编程中,可以使用不同的方法获取证书类型。
证书是一种用于身份验证和数据加密的安全工具,常用于SSL/TLS通信、代码签名和身份认证等领域。
Java提供了一组API用于处理和管理证书,通过这些API可以获取证书的类型,以便后续的操作和处理。
本文将介绍如何使用Java获取证书类型的方法。
首先,我们将介绍Java中与证书相关的基本概念和术语,然后详细说明如何使用Java的API来获取证书类型。
最后,我们还会给出一些使用示例,帮助读者更好地理解和应用这些方法。
证书的基本概念和术语在开始介绍如何获取证书类型之前,我们先来了解一些与证书相关的基本概念和术语。
1.证书(Certificate):证书是由证书颁发机构(CA)签发的一种数据文件,用于证明某个实体的身份。
证书包含了实体的公钥、所有者信息以及数字签名等内容,可以用于验证实体的身份和确保通信的安全性。
2.证书链(Certificate Chain):证书链是由多个证书构成的链条,用于验证证书的合法性。
通常,证书链中的最后一个证书是根证书(RootCertificate),它的公钥用于验证证书链中的其他证书的签名。
3.证书存储(KeyStore):证书存储是一种用于管理和存储证书的容器。
在Java中,可以使用KeyStore类来加载、保存和管理证书。
4.数字证书(Digital Certificate):数字证书是一种使用公钥密码学方法生成的证书,用于验证实体的身份和确保通信的安全性。
数字证书通常包含了实体的公钥、所有者信息以及数字签名等内容。
5.X.509证书(X.509 Certificate):X.509证书是一种国际标准化的数字证书格式,用于存储和交换公钥和其他相关信息。
在Java中,大部分证书都是基于X.509标准的。
6.证书类型(Certificate Type):证书类型是指证书的具体种类和用途。
常见的证书类型包括X.509证书、SSL证书、代码签名证书等。
Javadoc文档生成方式1. 什么是Javadoc文档Javadoc文档是一种用于描述Java代码的文档标记语言。
它能够从代码中提取注释并生成可读性强的HTML格式文档,以帮助开发人员更好地理解和使用代码。
Javadoc文档通常包含类、方法、字段等的详细描述,包括功能、参数、返回值、异常等信息。
2. Javadoc文档的重要性Javadoc文档是Java开发中必不可少的一部分,具有以下几个重要作用:•提供代码的使用说明:Javadoc文档能够清晰地描述代码的功能和使用方法,方便其他开发人员快速了解和使用代码。
•促进团队协作:Javadoc文档可以作为团队协作的重要工具,通过统一的文档格式和规范,促进团队成员之间的沟通和协作。
•提高代码的可读性:Javadoc文档能够将代码的关键信息提取出来,并以易于阅读的方式展示出来,提高代码的可读性和可维护性。
•方便代码维护和重构:Javadoc文档中包含了代码的详细描述和设计意图,能够帮助开发人员更好地理解代码,从而方便代码的维护和重构。
3. Javadoc文档生成方式3.1 使用命令行工具生成Javadoc文档可以通过命令行工具生成,具体步骤如下:1.打开命令行终端,进入代码所在的目录。
2.使用以下命令生成Javadoc文档:javadoc -d <output-directory> <source-files>–-d指定生成的文档输出目录。
–<output-directory>为生成的文档输出目录的路径。
–<source-files>为需要生成文档的源代码文件或目录。
3.等待命令执行完成,生成的Javadoc文档将保存在指定的输出目录中。
3.2 使用集成开发环境(IDE)生成大多数集成开发环境(IDE)都提供了生成Javadoc文档的功能,具体步骤如下(以Eclipse为例):1.打开Eclipse,进入项目。
import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.util.Iterator;import java.util.Map;import javax.servlet.http.HttpServletResponse;import org.apache.poi.hwpf.HWPFDocument;import org.apache.poi.hwpf.model.FieldsDocumentPart;import ermodel.Field;import ermodel.Fields;import ermodel.Range;import ermodel.Table;import ermodel.TableIterator;import ermodel.TableRow;publicclass WordUtil {publicstaticvoid readwriteWord(String filePath, String downPath, Map<String, String> map, int[] num, String downFileName) { //读取word模板FileInputStream in = null;try {in = new FileInputStream(new File(filePath));} catch (FileNotFoundException e1) {e1.printStackTrace();}HWPFDocument hdt = null;try {hdt = new HWPFDocument(in);} catch (IOException e1) {e1.printStackTrace();}Fields fields = hdt.getFields();Iterator<Field> it = fields.getFields(FieldsDocumentPart.MAIN) .iterator();while (it.hasNext()) {System.out.println(it.next().getType());}//读取word表格内容try {Range range = hdt.getRange();//得到文档的读取范围TableIterator it2 = new TableIterator(range);//迭代文档中的表格int tabCount = 0;while (it2.hasNext()) {//System.out.println(" 第几个表格 "+tabCount);//System.out.println(num[tabCount] +" 行");Table tb2 = (Table) it2.next();//迭代行,默认从0开始for (int i = 0; i < tb2.numRows(); i++) {TableRow tr = tb2.getRow(i);// System.out.println(" fu "+num[tabCount] +" 行");if (num[tabCount] < i && i < 7) {tr.delete();}} //end fortabCount++;} //end while//替换word表格内容for (Map.Entry<String, String> entry : map.entrySet()) { range.replaceText("$"+ entry.getKey().trim() + "$", entry.getValue());}// System.out.println("替换后------------:"+range.text().trim());} catch (Exception e) {e.printStackTrace();}//System.out.println("--------------------------------------------------------------------------------------");ByteArrayOutputStream ostream = new ByteArrayOutputStream();String fileName = downFileName;fileName += ".doc";String pathAndName = downPath + fileName;File file = new File(pathAndName);if (file.canRead()) {file.delete();}FileOutputStream out = null;out = new FileOutputStream(pathAndName, true);} catch (FileNotFoundException e) {e.printStackTrace();}try {hdt.write(ostream);} catch (IOException e) {e.printStackTrace();}//输出字节流try {out.write(ostream.toByteArray());} catch (IOException e) {e.printStackTrace();}try {out.close();} catch (IOException e) {e.printStackTrace();}try {ostream.close();} catch (IOException e) {e.printStackTrace();}}/***实现对word读取和修改操作(输出文件流下载方式)*@param response响应,设置生成的文件类型,文件头编码方式和文件名,以及输出*@param filePathword模板路径和名称*@param map待填充的数据,从数据库读取*/publicstaticvoid readwriteWord(HttpServletResponse response, String filePath, Map<String, String> map) {//读取word模板文件//String fileDir = newFile(base.getFile(),"//.. /doc/").getCanonicalPath();//FileInputStream in = new FileInputStream(newFile(fileDir+"/laokboke.doc"));FileInputStream in;HWPFDocument hdt = null;in = new FileInputStream(new File(filePath));hdt = new HWPFDocument(in);} catch (Exception e1) {e1.printStackTrace();}Fields fields = hdt.getFields();Iterator<Field> it = fields.getFields(FieldsDocumentPart.MAIN) .iterator();while (it.hasNext()) {System.out.println(it.next().getType());}//替换读取到的word模板内容的指定字段Range range = hdt.getRange();for (Map.Entry<String, String> entry : map.entrySet()) { range.replaceText("$" + entry.getKey() + "$",entry.getValue());}//输出word内容文件流,提供下载response.reset();response.setContentType("application/x-msdownload");String fileName = "" + System.currentTimeMillis() + ".doc";response.addHeader("Content-Disposition", "attachment;filename="+ fileName);ByteArrayOutputStream ostream = new ByteArrayOutputStream();OutputStream servletOS = null;try {servletOS = response.getOutputStream();hdt.write(ostream);servletOS.write(ostream.toByteArray());servletOS.flush();servletOS.close();} catch (Exception e) {e.printStackTrace();}}}注:以上代码需要poi包, 可以下载。
Javafreemarker⽣成word模板⽂件(如合同⽂件)及转pdf⽂件⽅法Java freemarker⽣成word模板⽂件(如合同⽂件)及转pdf⽂件⽅法创建模板⽂件ContractTemplate.docxContractTemplate.xml导⼊的Jar包compile("junit:junit")compile("org.springframework:spring-test")compile("org.springframework.boot:spring-boot-test")testCompile 'org.springframework.boot:spring-boot-starter-test'compile 'org.freemarker:freemarker:2.3.28'compile 'fakepath:aspose-words:19.5jdk'compile 'fakepath:aspose-cells:8.5.2'Java⼯具类 xml⽂档转换 Word XmlToDocx.javapackage com.test.docxml.utils;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.util.Enumeration;import java.util.zip.ZipEntry;import java.util.zip.ZipFile;import java.util.zip.ZipOutputStream;/*** xml⽂档转换 Word*/public class XmlToDocx {/**** @param documentFile 动态⽣成数据的docunment.xml⽂件* @param docxTemplate docx的模板* @param toFilePath 需要导出的⽂件路径* @throws Exception*/public static void outDocx(File documentFile, String docxTemplate, String toFilePath,String key) throws Exception { try {File docxFile = new File(docxTemplate);ZipFile zipFile = new ZipFile(docxFile);Enumeration<? extends ZipEntry> zipEntrys = zipFile.entries();FileOutputStream fileOutputStream = new FileOutputStream(toFilePath);ZipOutputStream zipout = new ZipOutputStream(fileOutputStream);int len = -1;byte[] buffer = new byte[1024];while (zipEntrys.hasMoreElements()) {ZipEntry next = zipEntrys.nextElement();InputStream is = zipFile.getInputStream(next);// 把输⼊流的⽂件传到输出流中如果是word/document.xml由我们输⼊zipout.putNextEntry(new ZipEntry(next.toString()));if ("word/document.xml".equals(next.toString())) {InputStream in = new FileInputStream(documentFile);while ((len = in.read(buffer)) != -1) {zipout.write(buffer, 0, len);}in.close();} else {while ((len = is.read(buffer)) != -1) {zipout.write(buffer, 0, len);}is.close();}}zipout.close();} catch (Exception e) {e.printStackTrace();}}}Java⼯具类 word⽂档转换 PDF WordToPdf.javapackage com.test.docxml.utils;import com.aspose.cells.*;import com.aspose.cells.License;import com.aspose.words.*;import java.io.ByteArrayInputStream;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;/*** word⽂档转换 PDF*/public class WordToPdf {/*** 获取license许可凭证* @return*/private static boolean getLicense() {boolean result = false;try {String licenseStr = "<License>\n"+ " <Data>\n"+ " <Products>\n"+ " <Product>Aspose.Total for Java</Product>\n"+ " <Product>Aspose.Words for Java</Product>\n"+ " </Products>\n"+ " <EditionType>Enterprise</EditionType>\n"+ " <SubscriptionExpiry>20991231</SubscriptionExpiry>\n"+ " <LicenseExpiry>20991231</LicenseExpiry>\n"+ " <SerialNumber>23dcc79f-44ec-4a23-be3a-03c1632404e9</SerialNumber>\n"+ " </Data>\n"+ " <Signature>0nRuwNEddXwLfXB7pw66G71MS93gW8mNzJ7vuh3Sf4VAEOBfpxtHLCotymv1PoeukxYe31K441Ivq0Pkvx1yZZG4O1KCv3Omdbs7uqzUB4xXHlOub4VsTODzDJ5MWHqlRCB1HHcGjlyT2sVGiovLt0Grvqw5+QXBuin + "</License>";InputStream license = new ByteArrayInputStream(licenseStr.getBytes("UTF-8"));License asposeLic = new License();asposeLic.setLicense(license);result = true;} catch (Exception e) {e.printStackTrace();}return result;}/*** word⽂档转换为 PDF* @param inPath 源⽂件* @param outPath ⽬标⽂件*/public static File doc2pdf(String inPath, String outPath) {//验证License,获取许可凭证if (!getLicense()) {return null;}//新建⼀个PDF⽂档File file = new File(outPath);try {//新建⼀个IO输出流FileOutputStream os = new FileOutputStream(file);//获取将要被转化的word⽂档Document doc = new Document(inPath);// 全⾯⽀持DOC, DOCX,OOXML, RTF HTML,OpenDocument,PDF, EPUB, XPS,SWF 相互转换doc.save(os, com.aspose.words.SaveFormat.PDF);os.close();} catch (Exception e) {e.printStackTrace();}return file;}public static void main(String[] args) {doc2pdf("D:/1.doc", "D:/1.pdf");}}Java单元测试类 XmlDocTest.javapackage com.test.docxml;import com.test.docxml.utils.WordToPdf;import com.test.docxml.utils.XmlToDocx;import freemarker.template.Configuration;import freemarker.template.Template;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.core.io.ClassPathResource;import org.springframework.core.io.Resource;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import org.springframework.test.context.web.WebAppConfiguration;import java.io.File;import java.io.PrintWriter;import java.io.Writer;import java.nio.charset.Charset;import java.util.HashMap;import java.util.Locale;import java.util.Map;/*** 本地单元测试*/@RunWith(SpringJUnit4ClassRunner.class)//@RunWith(SpringRunner.class)@SpringBootTest(classes= TemplateApplication.class)@WebAppConfigurationpublic class XmlDocTest {//短租@Testpublic void testContract() throws Exception{String contractNo = "1255445544";String contractCorp = "银河宇宙⽆敌测试soft";String contractDate = "2022-01-27";String contractItem = "房地产交易中⼼";String contractContent = "稳定发展中的⽂案1万字";//doc xml模板⽂件String docXml = "ContractTemplate.xml"; //使⽤替换内容//xml中间临时⽂件String xmlTemp = "tmp-ContractTemplate.xml";//⽣成⽂件的doc⽂件String toFilePath = contractNo + ".docx";//模板⽂档String docx = "ContractTemplate.docx";//⽣成pdf⽂件String toPdfFilePath = contractNo + ".pdf";;String CONTRACT_ROOT_URL = "/template";Resource contractNormalPath = new ClassPathResource(CONTRACT_ROOT_URL + File.separator + docXml);String docTemplate = contractNormalPath.getURI().getPath().replace(docXml, docx);//设置⽂件编码(注意点1)Writer writer = new PrintWriter(new File(xmlTemp),"UTF-8");Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);configuration.setEncoding(Locale.CHINESE, Charset.forName("UTF-8").name());//设置配置(注意点3)configuration.setDefaultEncoding("UTF-8");String filenametest = contractNormalPath.getURI().getPath().replace(docXml, "");System.out.println("filenametest=" + filenametest);configuration.setDirectoryForTemplateLoading(new File(filenametest));// Template template = configuration.getTemplate(ContractConstants.CONTRACT_NORMAL_URL+orderType+type+".xml"); //设置模板编码(注意点2)Template template = configuration.getTemplate(docXml,"UTF-8"); //绝对地址Map paramsMap = new HashMap();paramsMap.put("contractCorp",contractCorp);paramsMap.put("contractDate",contractDate);paramsMap.put("contractNo",contractNo);paramsMap.put("contractItem",contractItem);paramsMap.put("contractContent",contractContent);template.process(paramsMap, writer);XmlToDocx.outDocx(new File(xmlTemp), docTemplate, toFilePath, null);System.out.println("do finish");//转成pdfWordToPdf.doc2pdf(toFilePath,toPdfFilePath);}}创建成功之后的⽂件如下:。
第1章编码思路关于用OpenOffice的场景更多是将word中的内容另存为(转化)html。
我的应用场景是将在线编辑器的内容保存为word格式,系细览转换为word、pdf的一种需求。
1.下载Openoffice(/index.html ),类似于windows office的一个套件,并额外支持服务的运行方式,可理解为数据库2.下载Jodconverter( /opensource/jodconverter),类似于jdbc3.按照OpenOffice,并启动服务:soffice -headless -accept="socket,port=8100;urp;"4.引入jodconverter的jar包,并编码public class OpenOfficeService {private Logger logger = Logger.getLogger(this.getClass());OpenOfficeConnection con = null;public void convert(File sourceFile, File _targetFile) {try {if (con == null) {con = new SocketOpenOfficeConnection(ip, port);}con.connect();DocumentConverter converter = new OpenOfficeDocumentConverter(con);converter.convert(sourceFile, _targetFile);} catch (ConnectException e) {logger.error("OpenOffice异常", e);try {if (con != null) {con.disconnect();con = null;}} catch (Exception e1) {logger.error(e);}}}第2章开发过程中遇到的问题html中的图片可以转化到pdf,但是在不能转化到word中,经测试可以转化到odt文件中,所以我在开发过程中实际上是由hmt转换为odt,再在下载的过程中将后缀改为doc格式,另外,html中的图片,最好与html 文件放到同一目录下,引用方式为相对目录,也可以修改图片路径为绝对路径。
实验背景:系统环境:Windows XP | SUN JDK1.6U4 | Tomcat6.0.14 | CAS Server 3.1.1 + CASClient 2.1.1主机完整名称:Linly浏览器:FireFox V2.0.0.11实验步骤:STEP 1,搭建Java Web服务器环境安装JDK + Tomcat 6.0.14 ,HTTP端口8080 ,HTTPS端口8443JAVA_HOME = D:\Java\jdk1.6.0_04CATALINA_HOME = D:\Java\apache-tomcat-6.0.14安装完毕,启动Tomcat ,在浏览器上测试http://Linly:8080/出现上述界面,表明系统STEP1成功搭建。
STEP 2,使用Java Keytool工具为系统生成HTTPS证书,并为系统注册(Java Keytool相关资料可参阅:Java keytool 安全证书学习笔记),在DOS窗体运行以下指令(建议编写一个BAT批处理文件执行)clsrem please set the env JAVA_HOME before run this bat filerem delete alia tomcat if it is existedkeytool -delete -alias tomcatsso -keystore %JAVA_HOME%/jre/lib/security/cacerts-storepass changeitkeytool -delete -alias tomcatsso -storepass changeit(注释:清除系统中可能存在的名字为tomcatsso 的同名证书)rem list all alias in the cacertskeytool -list -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit(注释:列出系统证书仓库中存在证书名称列表)rem generator a keykeytool -genkey -keyalg RSA -alias tomcatsso -dname "cn=linly" -storepass changeit (注释:指定使用RSA算法,生成别名为tomcatsso的证书,存贮口令为changeit,证书的DN为"cn=linly" ,这个DN必须同当前主机完整名称一致哦,切记!!!)rem export the key keytool -export -alias tomcatsso -file %java_home%/jre/lib/security/tomcatsso.crt-storepass changeit(注释:从keystore中导出别名为tomcatsso的证书,生成文件tomcatsso.crt)rem importinto trust cacertskeytool -import -alias tomcatsso -file %java_home%/jre/lib/security/tomcatsso.crt -keystore %java_home%/jre/lib/security/cacerts -storepass changeit(注释:将tomcatsso.crt导入jre的可信任证书仓库。
java⽣成Https证书,及证书导⼊的步骤和过程以下是相关的Tomcat,JDK和Windows环境:Tomcat版本:tomcat-7.0.55JDK版本: jdk1.6.0⽬录所在的位置:Serve的⽬录:D:\server\tomcat-7.0.55\JDK的⽬录:D:\jdk\jdk1.6.01、⽣成服务器的密匙⽂件casserver.keystore1)打开CMD切换到Serve的⽬录下⾯D:\Server\tomcat\下2)执⾏:keytool -genkey -alias casserver -keypass cas123 -keyalg RSA -keystore casserver.keystore -validity 365说明:-alias指定别名为casserver;-keyalg指定RSA算法;-keypass指定私钥密码;-keystore指定密钥⽂件名称为casserver.keystore;-validity指定有效期为365天。
另外提⽰输⼊密匙库⼝令应与-keypass指定的cas123相同;您的名字与姓⽒是CAS服务器使⽤的域名(不能是IP,也不能是localhost),其它项随意填。
注意:服务器上如果有多个JDK,请确认环境变量中的JDK路径为tomcat所使⽤的JDK,如果不在环境变量中,也可切换到指定JDK的bin⽬录下执⾏命令;提⽰的输⼊keystore密码应与-keypass必须与指定的相同,否则后⾯tomcat启动会报IO异常(Cannot recover key)。
命令执⾏成功后Server⽬录下多出casserver.keystore⽂件。
3)可以看到Tomcat 下⾯⽣成casserver.keystore2.⽣成服务端证书casserver.cer1)根据上⾯导出的casserver.keystore⽂件就可以⽣成casserver.cer⽂件,只需在原来的Serve的⽬录下⾯D:\Server\tomcat\下执⾏:keytool -export -alias casserver -storepass cas123 -file casserver.cer -keystore casserver.keystore说明:-alias指定别名为casserver;-storepass指定私钥为liuqizhi;-file指定导出证书的⽂件名为casserver.cer;-keystore指定之前⽣成的密钥⽂件的⽂件名。
java p12证书生成流程Java P12证书的生成流程包括以下步骤:1. 生成私钥:使用Java的密钥库工具`keytool`生成私钥。
首先,打开命令提示符或终端,并导航到Java的安装目录。
然后,运行以下命令以生成私钥:```keytool -genkeypair -alias [alias_name] -keyalg RSA -keysize 2048 -keystore [keystore_name].jks```其中,`[alias_name]`是证书的别名,`[keystore_name]`是密钥库文件的名称。
2.生成证书签名请求(CSR):使用私钥生成证书签名请求。
运行以下命令:```keytool -certreq -alias [alias_name] -keystore[keystore_name].jks -file [csr_file].csr```其中,`[csr_file]`是用于保存证书签名请求的文件名。
3.获取证书:将CSR文件发送给证书颁发机构(CA)以获取证书。
CA 会验证您的身份,并生成数字证书。
4.导入证书:将获得的证书导入到密钥库中。
运行以下命令:```keytool -import -alias [alias_name] -file[certificate_file].cer -keystore [keystore_name].jks```其中,`[certificate_file]`是获得的证书文件名。
5.导出P12证书:将证书和私钥导出为P12格式。
运行以下命令:```keytool -importkeystore -srckeystore [keystore_name].jks -destkeystore [p12_file].p12 -srcalias [alias_name] -destalias [alias_name] -deststoretype PKCS12。
java生成word文件并下载importjava.io.BufferedInputStream;importjava.io.BufferedOutp utStream;importjava.io.BufferedWriter;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream ;importjava.io.IOE某ception;importjava.io.InputStream;importjava.io.OutputStream;importjava.io.OutputStreamWriter;importjava.io.Writer;.URLEncoder;importjava.util.Map;importfreemarker.template.Configuration;importfreemarker.tem plate.Template;/某某publicclaWordUtil{privatetaticLoggerlog=Logger.getLogger(Wor dUtil.cla);/某某//创建配置实例Configurationconfiguration=newConfiguration();//设置编码configuration.etDefaultEncoding(\//ftl模板文件Filefile=newFile(filePath);configuration.etDirectoryForTempl ateLoading(file);//获取模板Templatetemplate=configuration.getTemplate(templateName);//输出文件FileoutFile=newFile(filePath+File.eparator+fileName);//如果输出目标文件夹不存在,则创建if(!outFile.getParentFile().e某it()){outFile.getParentFile().mkdir();}//将模板和数据模型合并生成文件Writerout=newBufferedWriter(newOutputStreamWriter(newFileOutputS tream(outFile),\//生成文件template.proce(dataMap,out);//关闭流out.fluh();out.cloe();}catch(E某ceptione){log.error(\生成word文档(WordUtil)出错:【mg:\】,文件名:\+fileName);}fi.read(buffer);fi.cloe();//清空reponerepone.reet();//设置repone的HeaderStringfileName=URLEncoder.encode(filename,\if(fileName.lengt h()>150){//解决IE6.0bugfileName=newString(filename.getByte(\} repone.addHeader(\repone.addHeader(\OutputStreamtoClient=newBufferedOutputStream(repone.getOutpu tStream());repone.etContentType(\toClient.write(buffer);toClient .fluh();toClient.cloe();file.delete();returnrepone;}。