背景介绍
在实际的项目当中,有很多这样的场景,管理后台上传word模板文件(如协议、合同、通知书等),需要通过代码实现,将业务数据写入到word文件的不同位置,然后生成pdf文件并上传到文件服务器,提供用户下载或者预览的功能。比如:用户在某平台借款,生成的借款协议。
插件下载与安装
本文主要使用Aspose.Words实现word转pdf,通过替换word中的占位符实现文件中数据的更新。更多功能可以参考Aspose官方网站。
- 插件下载
链接:https://pan.baidu.com/s/1TbkczJNSN9X8LjV5L49ssw
提取码:vspw
官网下载地址:https://www.aspose.com/
- 插件安装
下载的jar包,可以直接放到java项目当中,也可以上传到maven私服追加pom引用。
效果展示
- 原word文件,有year、month、day、user_name四个占位符
- 转换后的PDF文件,占位符信息已更新,并追加了水印
代码逻辑
importcom.aspose.words.Shape;importcom.aspose.words.*;importjava.awt.*;importjava.io.ByteArrayInputStream;importjava.io.File;importjava.io.FileOutputStream;importjava.io.InputStream;importjava.util.Map;importjava.util.concurrent.ConcurrentHashMap;/**
*@authorluandy
*@create2021/02/28 12:43
*/publicclassTestWordsToPdf{/** isMatchCase 是否区分大小写 */privatestaticfinalbooleanIS_MATCH_CASE_TRUE =true;/** isMatchWholeWord 是否全词匹配 */privatestaticfinalbooleanIS_MATCH_WHOLE_WORD_TRUE =false;/** 字体目录:mac系统,根据系统字体目录调整 */privatestaticfinalString FONT_FOLDER ="/System/Library/Fonts";/**
* 测试方法
*
*@paramargs
*@throwsException
*/publicstaticvoidmain(String[] args)throwsException{
String wordPath ="/Users/luandy/Downloads/模板_V1.0.docx";
String pdfPath ="/Users/luandy/Downloads/模板_V1.0."+ System.currentTimeMillis() +".pdf";
ConcurrentHashMap dataMap =newConcurrentHashMap();
dataMap.put("year","2021");
dataMap.put("month","2");
dataMap.put("day","28");
dataMap.put("user_name","我是八零后琐话,欢迎您的关注");// word转换pdfdocToPdf(wordPath, pdfPath, dataMap);
}/**
* word转pdf主方法
*
*@paramwordPath
*@parampdfPath
*@paramdataMap
*@return*@throwsException
*/publicstaticbooleandocToPdf(String wordPath, String pdfPath, ConcurrentHashMap dataMap) throwsException{// 验证License 若不验证则转化出的pdf文档会有水印产生if(!isWordLicense()) {
System.out.println("License验证不通过...");returnfalse;
}
File pdfFile =null;
FileOutputStream pdfFos =null;try{longold = System.currentTimeMillis();// 新建一个pdf文档pdfFile =newFile(pdfPath);
pdfFos =newFileOutputStream(pdfFile);// 将要被转化的word文档Document doc =newDocument(wordPath);// 字体设置FontSettings.setFontsFolder(FONT_FOLDER + File.separator,true);// Aspose.Words 使用Replace()对模板进行替换字符操作replaceWordsKey(doc, dataMap);// 为PDF追加水印insertWaterMarkText(doc,"八零后琐话");// 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF, EPUB, XPS, SWF 相互转换doc.save(pdfFos, SaveFormat.PDF);longnow = System.currentTimeMillis();
System.out.println("共耗时:"+ ((now - old) /1000.0) +"秒");
}catch(Exception e) {
System.out.println("Word 转 Pdf 失败..."+ e);// 为了不生成空文件,出现异常时,删除pdf文件,以便重新生成if(pdfFile !=null) {
pdfFile.delete();
}returnfalse;
}finally{if(pdfFos !=null) {
pdfFos.close();
}
}// 文件转换成功returntrue;
}/**
* 替换Word中的占位符
*
*@paramdoc
*@paramdataMap
*@throwsException
*/privatestaticvoidreplaceWordsKey(Document doc, ConcurrentHashMap dataMap) throwsException{for(Map.Entry entry : dataMap.entrySet()) {// 替换Word中的变量,longfor_year为word模板中的占位符,2021为替换的数据,isMatchCase 是否区分大小写,isMatchWholeWord 是否全词匹配doc.getRange().replace(entry.getKey(), entry.getValue(), IS_MATCH_CASE_TRUE, IS_MATCH_WHOLE_WORD_TRUE);
}
}/**
* 验证aspose.word组件是否授权:无授权的文件有水印和试用标记
*
*@return*/privatestaticbooleanisWordLicense(){try{// 避免文件遗漏String licensexml ="\n" +"\n"+"\n" +"Aspose.Total for Java \n"+"Aspose.Words for Java \n"+"\n"+"Enterprise \n"+"20991231 \n"+"20991231 \n"+"23dcc79f-44ec-4a23-be3a-03c1632404e9 \n"+"\n"+"\n" +"sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=\n"+"\n"+"";
InputStream inputStream =newByteArrayInputStream(licensexml.getBytes());
com.aspose.words.License license =newcom.aspose.words.License();
license.setLicense(inputStream);
}catch(Exception e) {
System.out.println("License验证异常..."+ e);returnfalse;
}returntrue;
}/**
* 为PDF添加水印
*
*@paramdoc
*@paramwaterMarkText
*@throwsException
*/privatestaticvoidinsertWaterMarkText(Document doc, String waterMarkText)throwsException{
Shape watermark =newShape(doc, ShapeType.TEXT_PLAIN_TEXT);// 水印内容watermark.getTextPath().setText(waterMarkText);// 水印字体watermark.getTextPath().setFontFamily("宋体");// 水印宽度watermark.setWidth(600);// 水印高度watermark.setHeight(150);// 旋转水印watermark.setRotation(-60);// 水印颜色watermark.getFill().setColor(Color.lightGray);
watermark.setStrokeColor(Color.lightGray);
watermark.setRelativeHorizontalPosition(RelativeHorizontalPosition.PAGE);
watermark.setRelativeVerticalPosition(RelativeVerticalPosition.PAGE);
watermark.setWrapType(WrapType.NONE);
watermark.setVerticalAlignment(VerticalAlignment.CENTER);
watermark.setHorizontalAlignment(HorizontalAlignment.CENTER);
Paragraph watermarkPara =newParagraph(doc);
watermarkPara.appendChild(watermark);for(Section sect : doc.getSections()) {
insertWaterMarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_PRIMARY);
insertWaterMarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_FIRST);
insertWaterMarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_EVEN);
}
}privatestaticvoidinsertWaterMarkIntoHeader(Paragraph waterMarkPara, Section sect,intheaderType)throwsException{
HeaderFooter header = sect.getHeadersFooters().getByHeaderFooterType(headerType);if(header ==null) {
header =newHeaderFooter(sect.getDocument(), headerType);
sect.getHeadersFooters().add(header);
}
header.appendChild(waterMarkPara.deepClone(true));
}
}
声明:本文部分素材转载自互联网,如有侵权立即删除 。
© 版权声明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!邮箱:cxysz1@tom.com
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
丞旭猿论坛
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
丞旭猿论坛
THE END
暂无评论内容