springboot将模板生成pdf文件
生活随笔
收集整理的這篇文章主要介紹了
springboot将模板生成pdf文件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
需求:
將后臺的一堆數據,利用velocity模板將html格式生成pdf文件展示,通常在生成XX報告、XX公告場景下常用,畢竟pdf樣式穩定,又可以下載。
velocity語法也特別簡單,不會的可以看下https://blog.csdn.net/qiaodaima0/article/details/126158419?spm=1001.2014.3001.5501
思路:
將文字內容生成pdf文件用itextpdf就可以很簡單的完成,但是pdf一般要求特定的格式(比如報告類的就喜歡用固定的紅頭標題)或者一定的美觀性,純用后端渲染就不是很方便了,但是html渲染樣式就很簡單,兩個結合就能比較簡單生成美觀的pdf。
環境:
springboot 2.7.2
jdk1.8
velocity 1.7
itextpdf
實操:
包目錄
1、讓前端小姐姐搞一個漂亮的html
注意:html里面的圖片或js/css等其他的靜態資源不允許用外部連接,圖片就直接用base64碼即可
我們弄一個簡單帶表格的html,如下:
2、pom依賴
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.2</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.template.pdf</groupId><artifactId>template_pdf</artifactId><version>0.0.1-SNAPSHOT</version><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--工具類依賴--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.19</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version></dependency><!--pdf--><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity</artifactId><version>1.7</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>html2pdf</artifactId><version>4.0.3</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>font-asian</artifactId><version>7.2.3</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>3、PdfUtil工具類
import com.itextpdf.html2pdf.ConverterProperties; import com.itextpdf.html2pdf.HtmlConverter; import com.itextpdf.kernel.font.PdfFont; import com.itextpdf.kernel.font.PdfFontFactory; import com.itextpdf.kernel.geom.PageSize; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.layout.font.FontProvider; import org.apache.velocity.Template; import org.apache.velocity.app.Velocity; import org.apache.velocity.context.Context; import org.apache.velocity.runtime.RuntimeConstants; import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;import java.io.OutputStream; import java.io.StringWriter; import java.nio.charset.StandardCharsets;/*** PDF工具** @author ppp* @date 2022/8/5*/ public class PdfUtil {static {// Velocity初始化Velocity.setProperty(RuntimeConstants.OUTPUT_ENCODING, StandardCharsets.UTF_8);Velocity.setProperty(RuntimeConstants.INPUT_ENCODING, StandardCharsets.UTF_8);Velocity.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");Velocity.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());Velocity.init();}/*** 據模板生成pfd格式文件** @param context 上下文對象* @param template pdf模板* @param outputStream 生成ofd文件輸出流*/public static void pdfFile(Context context, String template, OutputStream outputStream) {try (PdfWriter pdfWriter = new PdfWriter(outputStream)) {PdfDocument pdfDocument = new PdfDocument(pdfWriter);pdfDocument.setDefaultPageSize(PageSize.A4);ConverterProperties properties = new ConverterProperties();FontProvider fontProvider = new FontProvider();// 字體設置,解決中文不顯示問題PdfFont sysFont = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H");fontProvider.addFont(sysFont.getFontProgram(), "UniGB-UCS2-H");properties.setFontProvider(fontProvider);Template pfdTemplate = Velocity.getTemplate(template, "UTF-8");StringWriter writer = new StringWriter();pfdTemplate.merge(context, writer);HtmlConverter.convertToPdf(writer.toString(), pdfDocument, properties);pdfDocument.close();} catch (Exception e) {throw new RuntimeException("PFD文件生成失敗", e);}}}4、Controller接口測試
/** * PDF生成Controller * @author ppp * @date 2022/8/4 */ @Controller @RequestMapping("/velocity") public class PdfController {@RequestMapping("/getPdf")public void get(HttpServletResponse response){response.reset();response.setContentType("application/pdf");String filename = System.currentTimeMillis()+".pdf";response.addHeader("Content-Disposition", "inline; filename=" + URLUtil.encode(filename, CharsetUtil.CHARSET_UTF_8));VelocityContext context = new VelocityContext();context.put("name", "彭也行");context.put("gender", 1);context.put("birthDate", DateUtil.formatDateTime(new Date()));context.put("phone", "13666666666");List<Map<String, Object>> eduList = new ArrayList<>();// 小學Map<String, Object> primarySchoolMap = new HashMap<>();primarySchoolMap.put("name", "小學");List<Map<String, Object>> scoreList = new ArrayList<>();// 語文成績Map<String, Object> chineseScore = new HashMap<>();chineseScore.put("subject", "語文");chineseScore.put("num", 60);// 數學成績Map<String, Object> mathScore = new HashMap<>();mathScore.put("subject", "數學");mathScore.put("num", 99);scoreList.add(chineseScore);scoreList.add(mathScore);primarySchoolMap.put("itemList", scoreList);primarySchoolMap.put("size", scoreList.size());// 初中Map<String, Object> middleSchoolMap = new HashMap<>();middleSchoolMap.put("name", "初中");List<Map<String, Object>> middleScoreList = new ArrayList<>();// 語文成績Map<String, Object> middleChineseScore = new HashMap<>();middleChineseScore.put("subject", "語文");middleChineseScore.put("num", 60);// 數學成績Map<String, Object> middleMathScore = new HashMap<>();middleMathScore.put("subject", "數學");middleMathScore.put("num", 99);// 英語Map<String, Object> middleEnScore = new HashMap<>();middleEnScore.put("subject", "英語");middleEnScore.put("num", 55);middleScoreList.add(middleChineseScore);middleScoreList.add(middleMathScore);middleScoreList.add(middleEnScore);middleScoreList.add(middleEnScore);middleScoreList.add(middleEnScore);middleScoreList.add(middleEnScore);middleScoreList.add(middleEnScore);middleScoreList.add(middleEnScore);middleSchoolMap.put("itemList", middleScoreList);middleSchoolMap.put("size", middleScoreList.size());eduList.add(primarySchoolMap);eduList.add(middleSchoolMap);context.put("eduList", eduList);try(ServletOutputStream outputStream = response.getOutputStream()){PdfUtil.pdfFile(context, "demo.html", outputStream);}catch (Exception e){e.printStackTrace();}} }5、效果
還是很好看的,用戶訪問連接就可以直接預覽,也可以自己下載
6、如果不想預覽,直接轉換
總結
以上是生活随笔為你收集整理的springboot将模板生成pdf文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 金山词霸2009破解版SP1牛津版完整绿
- 下一篇: [转]通过路径直接打开时地图时报错的解决