SpringBoot集成itextpdf實(shí)現(xiàn)根據(jù)模板動(dòng)態(tài)生成PDF
需求說(shuō)明
根據(jù)合同模板,將動(dòng)態(tài)的合同標(biāo)簽,合同方以及合同簽約時(shí)間等動(dòng)態(tài)的生成PDF,供用戶下載打印。
前期準(zhǔn)備
安裝 Adobe Acrobat DC
鏈接:https://pan.baidu.com/s/1T8wTCkxn0YcHjxZQ8G6WeQ
提取碼:j6b9
Spring Boot 集成
添加依賴
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.9</version> <scope>compile</scope> </dependency> <!--中文問(wèn)題解決--> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency>
構(gòu)建工具類
public class PDFUtils { private static final Logger log = LoggerFactory.getLogger(PDFUtils.class); /** * 根據(jù)pdf模板輸出流 * @param templateFileName 模板文件名 * @param resultMap 包含文件字段名和值的map * @return 生成的文件字節(jié)流 */ public static ByteArrayOutputStream createPdfStream(String templateFileName, Map<String, String> resultMap){ ByteArrayOutputStream ba = new ByteArrayOutputStream(); PdfStamper stamp =null; PdfReader reader = null; try { reader = new PdfReader(templateFileName); stamp = new PdfStamper(reader, ba); //使用字體 BaseFont bf = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); /* 獲取模版中的字段 */ AcroFields form = stamp.getAcroFields(); //填充表單 if (resultMap != null) { for (Map.Entry<String, String> entry : resultMap.entrySet()) { form.setFieldProperty(entry.getKey(), "textfont", bf, null); form.setField(entry.getKey(), entry.getValue()!=null?entry.getValue():""); } } //不能編輯 stamp.setFormFlattening(true); } catch (IOException e) { log.error("文檔構(gòu)建I/O異常",e); } catch (DocumentException e) { log.error("文檔構(gòu)建異常",e); } finally { if(stamp!=null){ try { stamp.close(); } catch (DocumentException e) { log.error("流關(guān)閉錯(cuò)誤",e); } catch (IOException e) { log.error("流關(guān)閉錯(cuò)誤",e); } } if(reader!=null){ reader.close(); } } return ba; } }
構(gòu)建MultipartFile
方便之后上傳OSS返回url
public UploadFileModel createUrl(String filePath, ByteArrayOutputStream byteArrayOutputStream) throws URISyntaxException { try{ byte[] pdfBytes = byteArrayOutputStream.toByteArray(); MultipartFile multipartFile = new MockMultipartFile( "file", filePath, "application/pdf", pdfBytes ); return uploadFileUtil.upload(multipartFile); } catch (Exception e) { log.error("創(chuàng)建Url時(shí)出錯(cuò):" + e.getMessage()); } return null; }
編輯PDF模板
Java代碼設(shè)置對(duì)應(yīng)form的key-value
pdf模板放在springboot 項(xiàng)目目錄resources/static 目錄下
public String createContract(CreateContractRequest request) { HashMap<String, String> map = new HashMap<>(); map.put("companyName",request.getCompanyName()); map.put("phone",request.getPhone()); UploadFileModel url = null; ByteArrayOutputStream pdfStream = PDFUtils.createPdfStream(UserApplication.class.getResource("/").getPath() + "static/contract.pdf", map); try { url = createUrl("合同.pdf", pdfStream); } catch (URISyntaxException e) { throw new RuntimeException(e); } return url.getUrl(); }
到此這篇關(guān)于SpringBoot集成itextpdf實(shí)現(xiàn)根據(jù)模板動(dòng)態(tài)生成PDF的文章就介紹到這了,更多相關(guān)SpringBoot itextpdf生成PDF內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Springboot整合itext實(shí)現(xiàn)PDF文件合并
- SpringBoot3集成iText實(shí)現(xiàn)PDF導(dǎo)出功能
- SpringBoot集成iTextPDF的實(shí)例
- SpringBoot整合iText7導(dǎo)出PDF及性能優(yōu)化方式
- SpringBoot使用itext填充pdf表單及導(dǎo)出pdf的流程
- SpringBoot集成itext實(shí)現(xiàn)html轉(zhuǎn)PDF
- SpringBoot使用iText7實(shí)現(xiàn)將HTML轉(zhuǎn)成PDF并添加頁(yè)眉頁(yè)腳水印
- SpringBoot集成itext導(dǎo)出PDF的過(guò)程
相關(guān)文章
Java多線程基礎(chǔ) 線程的等待與喚醒(wait、notify、notifyAll)
這篇文章主要介紹了Java多線程基礎(chǔ) 線程的等待與喚醒,需要的朋友可以參考下2017-05-05Java getResource()如何獲取class文件目錄位置
這篇文章主要介紹了Java getResource()如何獲取class文件目錄位置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12javaweb如何實(shí)現(xiàn)請(qǐng)求和響應(yīng)
這篇文章主要為大家詳細(xì)介紹了javaweb如何實(shí)現(xiàn)請(qǐng)求和響應(yīng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10java WebSocket的實(shí)現(xiàn)以及Spring WebSocket示例代碼
本篇文章主要介紹了java WebSocket的實(shí)現(xiàn)以及Spring WebSocket,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-01-01maven中profile動(dòng)態(tài)打包不同環(huán)境配置文件的實(shí)現(xiàn)
開發(fā)項(xiàng)目時(shí)會(huì)遇到這個(gè)問(wèn)題:開發(fā)環(huán)境,測(cè)試環(huán)境,生產(chǎn)環(huán)境的配置文件不同, 打包時(shí)經(jīng)常要手動(dòng)更改配置文件,本文就來(lái)介紹一下maven中profile動(dòng)態(tài)打包不同環(huán)境配置文件的實(shí)現(xiàn),感興趣的可以了解一下2023-10-10IDEA導(dǎo)入Eclipse項(xiàng)目的方法步驟(圖文教程)
這篇文章主要介紹了IDEA導(dǎo)入Eclipse項(xiàng)目的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Windows下Java環(huán)境配置的超詳細(xì)教程
這篇文章主要給大家介紹了關(guān)于Windows下Java環(huán)境配置的超詳細(xì)教程,文中通過(guò)圖文將配置的過(guò)程介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-01-01Java如何根據(jù)前端返回的字段名進(jìn)行查詢數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了Java如何根據(jù)前端返回的字段名進(jìn)行查詢數(shù)據(jù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11