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<GyPxxmSkzj> gyPxxmSkzjList =(List) skzjMap.get("list");//查询研修内容List<GyPxxmYxnr> yxnrList = gyPxxmYxnrService.queryList(pxbid, page, rows);
//        List<GyPxxmYxnr> yxnrList = (List) yxnrMap.get("list");//装配数据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");//ftl模板文件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()) { // 验证License 若不验证则转化出的pdf文档会有水印产生log.info("验证License信息:error");}String path ="E:\\files\\";  //本地开发环境//上一步生成的Word文档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);// Address是将要被转化的word文档Document document = new Document(inPath);// 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDFdocument.save(fos, SaveFormat.PDF);//转base64byte[] 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.xml应放在..\WebRoot\WEB-INF\classes路径下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>

【java】生成【PDF】后端接口-- java生成PDF的第二步相关推荐

  1. Java后端接口自动生成神器 -- EasyYapi插件(Yapi接口管理工具在IDEA里的插件)

    Java后端接口自动生成神器 – EasyYapi插件(Yapi接口管理工具在IDEA里的插件) 一.先看效果 1.生成yapi文档的效果 2.生成postman格式数据并导入接口测试类后的效果(如p ...

  2. 全能代码生成器,自动生成前后端代码、生成项目框架、生成JavaBean、生成数据库文档、自动化部署项目(TableGo v8.0.0)

    TableGo_20220801 v8.0.0 正式版发布,此次版本累计更新如下:  1.生成项目功能新增支持若依框架,可同时生成若依框架代码和所有业务表的前后端基础CRUD代码,一键搞定所有  2. ...

  3. java 支付类的接口,Java后端支付大杂烩之core.dao,service,web(重点是接口的设计)(二)...

    PayMap PayMap是一个使用Java语言集成三方支付的小Demo,现已集成支付宝(国内.国际.移动端.PC端).微信.银联(ACP.UPOP).光大(网关.网页).邮政支付,采用的技术栈为:S ...

  4. java环信后端接口

    //环信代码 /** 环信工具类 */ @Configuration public class HXUtil { private static RestTemplate restTemplate = ...

  5. php生成网页缩略图接口,php生成网站缩略图

    我要明确的回答使用php生成网站缩略图是不可能完成的任务. 那为什么我标题还要用"php生成网站缩略图",那是因为我们可以用php作为接口,通过页面传入参数来调用后台生成网页的缩略 ...

  6. java hashtable import_Java Hashtable 接口 - Java 教程 - 自强学堂

    Java Hashtable 接口 Hashtable是原始的java.util的一部分, 是一个Dictionary具体的实现 . 然而,Java 2 重构的Hashtable实现了Map接口,因此 ...

  7. java properties api_Java Properties 接口 - Java 教程 - 自强学堂

    Java Properties 接口 Properties 继承于 Hashtable.表示一个持久的属性集.属性列表中每个键及其对应值都是一个字符串. Properties 类被许多Java类使用. ...

  8. java定义一个动物接口,Java 动物声音“模拟器”(用接口实现)

    (1)编写接口Animal (Animal.java) public interface Animal{ public abstract void cry(); public abstract Str ...

  9. java事件影响处理接口,Java的(______)包中包含了许多用来处理事件的类和接口。...

    包的类 .中包部的有大部依赖依赖程度职工正确关于工伤完全护理护理活护活护理依赖C理分级分生分生生活. 保险保险养老于支养老城乡城乡支出转出居民基本基金居民基本基金户用付和,含和接保养遇按为确老待时.东 ...

最新文章

  1. 高效的scrum敏捷研发工具--Leangoo
  2. 每天一个linux命令(9):touch 命令
  3. java 不变式_solr - Solr错误:在请求处理程序中使用不变式时,QueryComponent.mergeIds(QueryComponent.java:940) - 堆栈内存溢出...
  4. c++图的创建_使用 Amazon Neptune 构建基于图数据库的应用
  5. 聊聊单体应用的 4 点不良影响,第 4 点很痛很真实
  6. 简单json语句转化为map保存
  7. 小甲鱼python课件源代码_[Python基础] 小甲鱼零基础入门Python学习视频+全套源码课件 Python视频教程 96讲...
  8. 游戏运营期间我的项目开发经验总结——纪律性和卡顿处理
  9. 机器学习面试——逻辑回归和线性回归
  10. C++链接ODBC数据源:VS2013,Access
  11. iphone全部机型_5G旗舰坚果R2再出发 1亿像素拍照出彩领跑四千价位档|像素|华为mate|iphone|手机...
  12. Mac安装Qt出现错误Could not resolve SDK Path for ‘macosx‘
  13. 爱客影视 程序存在文件写入漏洞 分析
  14. 20212022最新Web前端经典面试试题及答案-史上最全前端面试题(含答案)、前端面试题大全、前端进阶必知必会知识点1
  15. Windows键盘上的截屏按键PrtSc
  16. ps教程完整版(来自百度网盘)
  17. 互联网日报 | 微信红包封面向个人开放;每日优鲜获青岛战略投资20亿元;中国银联发布“银联云”...
  18. Type-C PD协议取电SINK受电端9V12V15V20V
  19. 焦作机器人编程比赛_2018 焦作icpc现场赛总结
  20. 监控他人摄像头,并发送图片到邮箱

热门文章

  1. 【UML】 类图 图例
  2. 数据结构中的 线性结构和非线性结构
  3. Python调用自定义浏览器打开网页
  4. Qt、C++学习交流群招管理员咯(群主为一枚Qt程序开发人员)
  5. 如何优化冷启动的时间
  6. 代码重构,最佳实践,你真的会代码重构吗?
  7. iOS int 转 char
  8. 【机器学习】决策树-ID3算法
  9. LCS最详细题解!!!!!
  10. java学习第13天