使用poi-tl填充word模板,并轉化為pdf輸出

后端

依賴

<dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.0</version>
</dependency>

Word版本

Word版本填充代碼

		// 培訓詳情HashMap<String, Object> textMap = new HashMap<>();textMap.put("projectNo", projectInitiation.getProjectNo());textMap.put("projectName", projectInitiation.getProjectName());textMap.put("organization1", organization.getName());textMap.put("email", Objects.isNull(user.getEmail()) ? "" : user.getEmail());textMap.put("headPhone", Objects.isNull(deviceManage.getHeadPhone()) ? "" : deviceManage.getHeadPhone());// 查看培訓人員(掃碼查看)QrConfig config = new QrConfig(300, 300);// 設置邊距,既二維碼和背景之間的邊距config.setMargin(3);HashMap<String, String> qrMap = new HashMap<>();qrMap.put("type", RandomUtil.randomString(5));qrMap.put("data", AESUtils.encodeBase64(String.valueOf(visitationTask.getId())));String qr = QrCodeUtil.generateAsBase64(JsonUtils.objectToJsonString(qrMap), config, ImgUtil.IMAGE_TYPE_JPG);textMap.put("detailPages", Pictures.ofBase64(qr, PictureType.JPEG).size(100, 100).create());// 選中textMap.put("redio", "\u2611");textMap.put("customerSignature", Objects.isNull(cultivateDetail.getCustomerSignature()) ? "" : Pictures.ofUrl(cultivateDetail.getCustomerSignature(), PictureType.JPEG).size(100, 50).create());textMap.put("engineerSignature", Objects.isNull(cultivateDetail.getEngineerSignature()) ? "" : Pictures.ofUrl(cultivateDetail.getEngineerSignature(), PictureType.JPEG).size(100, 50).create());// 獲取文件流try {InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("template/培訓服務報告.docx");XWPFTemplate template = XWPFTemplate.compile(inputStream).render(textMap);Map<String, Object> map = new HashMap<>();ByteArrayOutputStream fos = new ByteArrayOutputStream();template.write(fos);byte[] bytes = fos.toByteArray();byte[] convertToPdf = Doc2PdfUtil.doc2Pdf(bytes);String bytesRes = StringUtils.bytesToHexString2(convertToPdf);map.put("bytes", bytesRes);map.put("title", System.currentTimeMillis() + "培訓服務報告.docx");fos.close();template.close();return Response.successJson(map);} catch (Exception e) {throw new RuntimeException(e);}

pdf版本

依賴

		<!--aspose 破解 word轉pdf--><dependency><groupId>com.aspose</groupId><artifactId>aspose-words</artifactId><version>16.8.0-jdk16</version><scope>system</scope><systemPath>${project.basedir}/src/main/resources/lib/aspose-words-16.8.0-jdk16.jar</systemPath></dependency>

license放到resources下面 license.xml

<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>

word轉pdf工具類

package com.gangwantech.web.utils;import com.aspose.words.*;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;public class Doc2PdfUtil {/*** 加載授權配置文件** @return*/private static boolean getLicense() {boolean result = false;try (InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("license.xml")) {// License的包路徑必須為com.aspose.words.LicenseLicense license = new License();license.setLicense(in);result = true;} catch (Exception e) {e.printStackTrace();}return result;}/*** doc轉pdf** @return*/public static byte[] doc2Pdf(byte[] bytes) {System.out.println("pdf轉換中...");long old = System.currentTimeMillis();try (ByteArrayOutputStream fos = new ByteArrayOutputStream()) {// 驗證if (!getLicense()) {throw new RuntimeException("文件轉換失敗!");}// 加載字體//FontSettings settings = FontSettings.getDefaultInstance();//String[] fontFamilyNames = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();//settings.setFontsFolders(fontFamilyNames, true);//LoadOptions loadOptions = new LoadOptions();//loadOptions.setFontSettings(settings); 加載字體//FontSettings settings = FontSettings.getDefaultInstance();//settings.setFontsFolder("C:\\Windows\\Fonts", true);//LoadOptions loadOptions = new LoadOptions();//loadOptions.setFontSettings(settings);ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);//Document document = new Document(inputStream, loadOptions);Document document = new Document(inputStream);document.save(fos, SaveFormat.PDF);byte[] buffer = fos.toByteArray();long now = System.currentTimeMillis();System.out.println("pdf轉換成功,共耗時:" + ((now - old) / 1000.0) + "秒");return buffer;} catch (Exception e) {e.printStackTrace();throw new RuntimeException("文件轉換失敗!");}}
}

pdf版本填充代碼,并生成pdf下載

		// 培訓詳情CultivateDetail cultivateDetail = cultivateDetailService.selectOne(new QueryWrapper<CultivateDetail>().eq("work_id", visitationTask.getWorkOrderId()));HashMap<String, Object> textMap = new HashMap<>();textMap.put("projectNo", projectInitiation.getProjectNo());textMap.put("projectName", projectInitiation.getProjectName());// 查看培訓人員(掃碼查看)QrConfig config = new QrConfig(300, 300);// 設置邊距,既二維碼和背景之間的邊距config.setMargin(3);HashMap<String, String> qrMap = new HashMap<>();qrMap.put("type", RandomUtil.randomString(5) + "train");qrMap.put("data", AESUtils.encodeBase64(String.valueOf(visitationTask.getId())));String qr = QrCodeUtil.generateAsBase64(JsonUtils.objectToJsonString(qrMap), config, ImgUtil.IMAGE_TYPE_JPG);textMap.put("detailPages", Pictures.ofBase64(qr, PictureType.JPEG).size(100, 100).create());// 選中textMap.put("redio", "\u2611");textMap.put("customerSignature", Objects.isNull(cultivateDetail.getCustomerSignature()) ? "" : Pictures.ofUrl(cultivateDetail.getCustomerSignature(), PictureType.JPEG).size(100, 50).create());textMap.put("engineerSignature", Objects.isNull(cultivateDetail.getEngineerSignature()) ? "" : Pictures.ofUrl(cultivateDetail.getEngineerSignature(), PictureType.JPEG).size(100, 50).create());// 獲取文件流try {InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("template/培訓服務報告.docx");XWPFTemplate template = XWPFTemplate.compile(inputStream).render(textMap);Map<String, Object> map = new HashMap<>();ByteArrayOutputStream fos = new ByteArrayOutputStream();template.write(fos);byte[] bytes = fos.toByteArray();byte[] convertToPdf = Doc2PdfUtil.doc2Pdf(bytes);String bytesRes = StringUtils.bytesToHexString2(convertToPdf);map.put("bytes", bytesRes);map.put("title", System.currentTimeMillis() + "培訓服務報告.docx");fos.close();template.close();return Response.successJson(map);} catch (Exception e) {throw new RuntimeException(e);}

前端下載方法

word下載

		if (res.data.code === 0) {const data = res.data.dataconst bytes = hexStr2Byte(data.bytes)const blob = new Blob([bytes], {type: `application/vnd.openxmlformats-officedocument.wordprocessingml.document`})const objectUrl = URL.createObjectURL(blob)const link = document.createElement('a')link.href = objectUrllink.setAttribute('download', data.title)document.body.appendChild(link)link.click()} else {this.$message.error(res.data.msg)}

pdf下載

		  const data = res.data.dataconst bytes = hexStr2Byte(data.bytes)const blob = new Blob([bytes], {type: `application/pdf`})const objectUrl = URL.createObjectURL(blob)const link = document.createElement('a')link.href = objectUrllink.setAttribute('download', `${data.title}.pdf`)document.body.appendChild(link)link.click()} else {this.$message.error(res.data.msg)}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208432.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208432.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208432.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

maven環境搭建

maven歷史版本下載&#xff1a;https://archive.apache.org/dist/maven/ 新建系統變量編輯Path&#xff0c;添加bin目錄mvn -v測試查看版本號conf目錄下新建repository文件夾&#xff0c;作為本地倉庫 settings.xml <?xml version"1.0" encoding"UTF-8&…

2312d,d語言來綁定C++和rust

原文 各編譯語言相同概念 1,按可重用函數拆分代碼. 2,由源碼中的函數名生成的串來標識函數.如,g為void foo()生成_Z3foov的標識.此串總是是可重現的;如,Linux上的Clang和GCC都遵循ItaniumCABI約定來裝飾函數名. 3,在內存中的特定位置存儲該函數的所有參數,然后用調用或等效指…

gitee配置

注冊配置gitee Gitee官網 進入官網之后&#xff0c;有賬號直接登錄&#xff0c;沒有賬號注冊一個新的賬號 下載安裝git客戶端 官網地址 下載完成&#xff0c;一路直接點擊安裝直接安裝成功 檢查是否安裝成功 鼠標留在桌面–>右擊–>出現Git GUI Here/Git Bash Her…

windows系統nodeJs報錯node-sass npm ERR! command failed

報錯信息 npm WARN deprecated request2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142 npm WARN deprecated tar2.2.2: This version of tar is no longer supported, and will not receive security updates. Please upgrade asa…

國科大通信原理復習

CH4-信源的數字化 26. 信源編碼的基本方法和分類 27. 無失真編碼和有失真編碼的區別 無失真編碼能夠完全一模一樣的恢復到原信號。 有失真編碼則不行。 28. 信息量和熵的定義 29. 離散信源的最大熵定理 n表示所有符號的種類&#xff0c;比如對于二進制碼字&#xff0c;Rbit對…

云計算ACP認證考試題庫0-100

0001.單選題:阿里云的云盾會檢查通過公共互聯網登錄云服務器ECS的來源IP,登錄方式包括SSH和遠程桌面,當來自某個IP的登錄請求出現多次密碼錯誤的情況時,會發出”ECS遭遇密碼暴力破解”的報警,當收到這個報警后,最安全的處理方法應該是。 A.通知自己業務平臺的所有用戶立即修改…

基于支持向量機SVM的新鮮度等級預測,基于自適應粒子群優化長短期神經網絡的新鮮度等級預測

目錄 背影 支持向量機SVM的詳細原理 SVM的定義 SVM理論 粒子群算法原理 SVM應用實例,基于支持向量機SVM的新鮮度等級預測,基于自適應粒子群優化長短期神經網絡的新鮮度等級預測 代碼 結果分析 展望 完整代碼:基于支持向量機SVM的新鮮度等級預測,基于自適應粒子群優化長短期…

SpringBoot+線程池實現高頻調用http接口并多線程解析json數據

場景 SpringbootFastJson實現解析第三方http接口json數據為實體類(時間格式化轉換、字段包含中文)&#xff1a; SpringbootFastJson實現解析第三方http接口json數據為實體類(時間格式化轉換、字段包含中文)-CSDN博客 Java中ExecutorService線程池的使用(Runnable和Callable多…

MindOpt APL:一款適合優化問題數學建模的編程語言

什么是建模語言 建模語言是一種描述信息或模型的編程語言&#xff0c;在運籌優化領域&#xff0c;一般是指代數建模語言。 比如要寫一個線性規劃問題的建模和求解&#xff0c;可以采用C、Python、Java等通用編程語言來實現計算機編程&#xff08;碼代碼&#xff09;&#xff0…

nodejs微信小程序+python+PHP的黃山旅游景點購票系統設計與實現-計算機畢業設計推薦

目 錄 摘 要 I ABSTRACT II 目 錄 II 第1章 緒論 1 1.1背景及意義 1 1.2 國內外研究概況 1 1.3 研究的內容 1 第2章 相關技術 3 2.1 nodejs簡介 4 2.2 express框架介紹 6 2.4 MySQL數據庫 4 第3章 系統分析 5 3.1 需求分析 5 3.2 系統可行性分析 5 3.2.1技術可行性&#xff1a;…

要求CHATGPT高質量回答的藝術:提示工程技術的完整指南—第 28 章:圣杯 = 專家 + ChatGPT 的協同作用

要求CHATGPT高質量回答的藝術&#xff1a;提示工程技術的完整指南—第 28 章&#xff1a;圣杯 專家 ChatGPT 的協同作用 ? 這就像是從 ChatGPT 或其他生成式人工智能中獲得高質量答案的圣杯。因為光知道怎么問&#xff08;提示工程技術&#xff09;還不夠&#xff0c;還要知…

harmonyOS開發技巧(二)——沉浸式以及狀態欄高

1. 設置沉浸式&#xff1a;win.setWindowLayoutFullScreen(true); 2. 獲取狀態欄的高&#xff1a;win.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM)以及win.on(avoidAreaChange, (data) > {})。 import UIAbility from ohos.app.ability.UIAbility; import wind…

聯邦多任務蒸餾助力多接入邊緣計算下的個性化服務 | TPDS 2023

聯邦多任務蒸餾助力多接入邊緣計算下的個性化服務 | TPDS 2023 隨著移動智能設備的普及和人工智能技術的發展,越來越多的分布式數據在終端被產生與收集&#xff0c;并以多接入邊緣計算(MEC)的形式進行處理和分析。但是由于用戶的行為模式與服務需求的多樣,不同設備上的數據分布…

復亞消防無人機 智能守護浙江安防

在黨中央高度重視防災減災救災工作的背景下&#xff0c;浙江省深化消防救援保障體系建設&#xff0c;借助智慧消防舉措&#xff0c;提高了城市的戰勤保障能力。特別是在古城區&#xff0c;復亞助力浙江打造智慧消防系統&#xff0c;通過消防無人機全自動飛行系統&#xff0c;成…

ALTERNET STUDIO 9.1 Crack

ALTERNET STUDIO 9.1 發布 宣布 AlterNET Studio 9.1 版本今天上線。AlterNET Studio 9.0 是一個中期更新&#xff0c;重點是改進我們所有的組件庫。 以下是 AlterNET Studio 9.1 的發布亮點&#xff1a; Roslyn C# 和 Visual Basic 解析器現在支持代碼修復/代碼重構。 代碼修復…

全景萬店通打造掌上智慧生活助手,助力店鋪全景引流

隨著網絡經濟的崛起&#xff0c;新一代的消費群體的消費習慣逐漸變得富有個性化&#xff0c;因此他們對于傳統的營銷方式具有視覺疲勞&#xff0c;傳統廣告的效果也越發微小&#xff0c;但是請明顯來代言&#xff0c;成本又十分高昂&#xff0c;那么還有什么引流好方法呢&#…

MySQL之數據庫的創建指令

創建數據庫 #創建數據庫指令&#xff1a; CREATE DATABASE hsp_db1 #創建名字為關鍵字的數據庫&#xff0c;為規避關鍵字&#xff0c;可以使用反引號 CREATE DATABASE CREATE#刪除數據庫指令&#xff1a; DROP DATABASE hsp_db1 DROP DATABASE CREATE如果不指定在這里插入代碼片…

Linux--學習記錄(2)

解壓命令&#xff1a; gzip命令&#xff1a; 參數&#xff1a; -k&#xff1a;待壓縮的文件會保留下來&#xff0c;生成一個新的壓縮文件-d&#xff1a;解壓壓縮文件語法&#xff1a; gzip -k pathname(待壓縮的文件夾名)gzip -kd name.gz&#xff08;待解壓的壓縮包名&#x…

Python中的深拷貝和淺拷貝的區別

目錄 一、深拷貝和淺拷貝的概念 二、Python中的深拷貝和淺拷貝實現 三、深拷貝和淺拷貝的區別及適用場景 四、如何選擇深拷貝和淺拷貝 五、總結 在Python中&#xff0c;深拷貝和淺拷貝是非常重要的概念&#xff0c;它們在處理對象和數據結構時有著截然不同的行為。理解深拷…

MySQL-DATE_FORMAT()函數

在 SQL 中&#xff0c;DATE_FORMAT() 函數是用于將日期時間值格式化為指定格式的函數。它允許你根據自己的需求將日期時間值轉換成各種不同的字符串表示形式。以下是 DATE_FORMAT() 函數的用法和示例&#xff1a; DATE_FORMAT() 函數的基本用法&#xff1a; DATE_FORMAT() 函…