1. 放置模板
2. 后端代码
@PostMapping ( "downloadWord" )
public ResultVO downloadWord ( @RequestBody Map map, HttpServletRequest request) {
Map < String , Object > dataMap = getDataMap ( map) ;
String path = WordUtils . createWord ( dataMap, "模板1.ftl" , "实施方案模板" + System . currentTimeMillis ( ) + ".doc" ) ;
String base64 = WordToPdfUtils . docTopdfBase64 ( request, path, "项目实施方案" + System . currentTimeMillis ( ) + ".pdf" ) ;
return new ResultVO ( ) . addData ( "base64" , base64) ;
}
1. 获取数据并封装数据
private Map < String , Object > getDataMap ( @RequestBody Map map) {
String tyshxydm = ( String ) map. get ( "tyshxydm" ) ;
Map pxbMap = null ;
int page = ( int ) map. get ( "page" ) ;
int rows = ( int ) map. get ( "rows" ) ;
GyQyxx gyQyxx = gyQyxxService. selectById ( tyshxydm) ;
String pxbid = ( String ) map. get ( "pxbid" ) ;
GyPxxm gyPxxm = new GyPxxm ( ) ;
gyPxxm = gyPxxmService. selectById ( pxbid) ;
List < GyPxxmSkzj > gyPxxmSkzjList = gyPxxmSkzjService. queryList ( pxbid, page, rows) ;
List < GyPxxmYxnr > yxnrList = gyPxxmYxnrService. queryList ( pxbid, page, rows) ;
Map < String , Object > dataMap = new HashMap < String , Object > ( ) ;
dataMap. put ( "y" , gyPxxm. getRkrq ( ) . substring ( 0 , 4 ) ) ;
dataMap. put ( "m" , gyPxxm. getRkrq ( ) . substring ( 4 , 6 ) ) ;
dataMap. put ( "d" , gyPxxm. getRkrq ( ) . substring ( 6 , 8 ) ) ;
dataMap. put ( "yyxmmc" , gyPxxm. getYyxmmc ( ) ) ;
dataMap. put ( "zymc" , gyPxxm. getZymc ( ) ) ;
dataMap. put ( "yrdwmc" , gyQyxx. getYrdwmc ( ) ) ;
dataMap. put ( "yxbdd" , gyPxxm. getYxbdd ( ) ) ;
dataMap. put ( "xyrs" , gyPxxm. getXyrs ( ) ) ;
dataMap. put ( "xyly" , gyPxxm. getXyly ( ) ) ;
dataMap. put ( "yxmdhzy" , gyPxxm. getYxmdhzy ( ) ) ;
dataMap. put ( "pxtjbzcs" , gyPxxm. getPxtjbzcs ( ) ) ;
dataMap. put ( "yxsxjfys" , gyPxxm. getYxsxjfys ( ) ) ;
dataMap. put ( "pxjgdz" , gyPxxm. getPxjgdz ( ) ) ;
dataMap. put ( "pxjglxr" , gyPxxm. getPxjglxr ( ) ) ;
dataMap. put ( "pxjgbgdh" , gyPxxm. getPxjgbgdh ( ) ) ;
dataMap. put ( "pxjgsj" , gyPxxm. getPxjgsj ( ) ) ;
dataMap. put ( "pxjgcz" , gyPxxm. getPxjgcz ( ) ) ;
dataMap. put ( "pxjgyx" , gyPxxm. getPxjgyx ( ) ) ;
List < SkzjWordDTO > gyPxxmSkzjs = new ArrayList ( ) ;
List < YxnrWordDTO > gyPxxmYxnrs = new ArrayList < > ( ) ;
for ( GyPxxmSkzj item : gyPxxmSkzjList) {
SkzjWordDTO skzjWordDTO = new SkzjWordDTO ( ) ;
skzjWordDTO. setSkzjnl ( item. getSkzjnl ( ) ) ;
skzjWordDTO. setSkzjxm ( item. getSkzjxm ( ) ) ;
skzjWordDTO. setSkzjgzdw ( item. getSkzjgzdw ( ) ) ;
skzjWordDTO. setSkzzcjndj ( ConstCode . jndjType. get ( item. getSkzzcjndj ( ) ) ) ;
gyPxxmSkzjs. add ( skzjWordDTO) ;
}
dataMap. put ( "skzj" , gyPxxmSkzjs) ;
AtomicInteger zks = new AtomicInteger ( ) ;
for ( GyPxxmYxnr item : yxnrList) {
YxnrWordDTO yxnrWordDTO = new YxnrWordDTO ( ) ;
yxnrWordDTO. setKs ( item. getKs ( ) ) ;
yxnrWordDTO. setPxnr ( item. getPxnr ( ) ) ;
yxnrWordDTO. setPxxs ( item. getPxxs ( ) ) ;
yxnrWordDTO. setSkzjxm ( item. getSkzjxm ( ) ) ;
gyPxxmYxnrs. add ( yxnrWordDTO) ;
int i = Integer . parseInt ( item. getKs ( ) ) ;
zks. addAndGet ( i) ;
}
dataMap. put ( "yxnr" , gyPxxmYxnrs) ;
dataMap. put ( "zks" , zks) ;
dataMap. put ( "jykh" , gyPxxm. getJykh ( ) ) ;
return dataMap;
}
2. 生成word文档
public static String createWord ( Map dataMap, String templateName, String fileName) {
String filePath = null ;
Configuration configuration = new Configuration ( new Version ( "2.3.28" ) ) ;
configuration. setDefaultEncoding ( "UTF-8" ) ;
configuration. setClassForTemplateLoading ( WordUtils . class , "/template" ) ;
try {
String path = "E:/files/" ;
Template template = configuration. getTemplate ( templateName) ;
String fname = fileName;
File outFile = new File ( path+ fname) ;
filePath = path+ fname;
System . out. println ( filePath) ;
if ( ! outFile. getParentFile ( ) . exists ( ) ) {
outFile. getParentFile ( ) . mkdirs ( ) ;
}
Writer out = new BufferedWriter ( new OutputStreamWriter ( new FileOutputStream ( outFile) , StandardCharsets . UTF_8) ) ;
template. process ( dataMap, out) ;
out. flush ( ) ;
out. close ( ) ;
} catch ( Exception e) {
log. error ( "导出word文档出错" , e) ;
throw e;
} finally {
return filePath;
}
}
3. 将word文档转换为PDF文件(base64)
public static String docTopdfBase64 ( HttpServletRequest request, String inPath, String outPath) {
if ( ! getLicense ( ) ) {
log. info ( "验证License信息:error" ) ;
}
String path = "E:\\files\\" ;
outPath = path + outPath;
File wordFile = new File ( inPath) ;
String base64 = null ;
try {
long old = System . currentTimeMillis ( ) ;
File file = new File ( outPath) ;
OutputStream fos = new FileOutputStream ( file) ;
FileInputStream in = new FileInputStream ( file) ;
Document document = new Document ( inPath) ;
document. save ( fos, SaveFormat . PDF) ;
byte [ ] bytes = new byte [ ( int ) file. length ( ) ] ;
in. read ( bytes) ;
base64 = Base64 . getEncoder ( ) . encodeToString ( bytes) ;
in. close ( ) ;
long now = System . currentTimeMillis ( ) ;
System . out. println ( "PDF转换结束 共耗时:" + ( ( now - old) / 1000.0 ) + "秒" ) ;
fos. close ( ) ;
wordFile. delete ( ) ;
file. delete ( ) ;
} catch ( Exception e) {
log. info ( "生成pdf文件流异常" ) ;
e. printStackTrace ( ) ;
}
return base64;
}
4. 验证License 若不验证则转化出的pdf文档会有水印产生
private static boolean getLicense ( ) {
boolean result = false ;
try {
System . out. println ( WordToPdfUtils . class . getClassLoader ( ) ) ;
InputStream is = WordToPdfUtils . class . getClassLoader ( ) . getResourceAsStream ( "License.xml" ) ;
License aposeLic = new License ( ) ;
aposeLic. setLicense ( is) ;
result = true ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
}
return result;
}
5.License.xml (License证书的使用)
< License>
< Data>
< Products>
< Product> Aspose.Total for Java</ Product>
< Product> Aspose.Words for Java</ Product>
</ Products>
< EditionType> Enterprise</ EditionType>
< SubscriptionExpiry> 20991231</ SubscriptionExpiry>
< LicenseExpiry> 20991231</ LicenseExpiry>
< SerialNumber> 8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</ SerialNumber>
</ Data>
< Signature> sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</ Signature>
</ License>