<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
溫馨提示:本部落格使用Thymeleaf模板引擎實現PDF列印僅供參考:
在閱讀該部落格之前,先要了解一下Thymeleaf模板引擎,因為是使用Thymeleaf模板引擎實現的PDF列印的,
Thymeleaf是一個現代的伺服器端 Java 模板引擎,適用於 Web 和獨立環境。
Thymeleaf 的主要目標是為您的開發工作流程帶來優雅的自然模板——HTML可以在瀏覽器中正確顯示,也可以用作靜態原型,從而在開發團隊中實現更強大的共同作業。
藉助 Spring Framework 的模組、與您最喜歡的工具的大量整合以及插入您自己的功能的能力,Thymeleaf 是現代 HTML5 JVM Web 開發的理想選擇——儘管它可以做的更多。
不瞭解小夥伴可以去Thymeleaf官網檢視,有更詳細的講解。
接下來就不一一介紹了,直接上程式碼。
1.Thymeleaf,生成PDF相關依賴
1.1 以下依賴為必要依賴,一個都不能少,依賴version可以根基實際情況使用相關的依賴版本。
1.yml組態檔
yml組態檔使用設定thymeleaf模板路徑(範例):
以上相關為基礎且必須設定的內容,接下來繼續講解thymeleaf引擎需要生成PDF的相關設定。
1.PDF設定程式碼(如下):
package com.cy.xgsm.configuration; import java.io.IOException; import java.io.InputStream; import java.net.URISyntaxException; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.itextpdf.html2pdf.ConverterProperties; import com.itextpdf.html2pdf.resolver.font.DefaultFontProvider; import com.itextpdf.io.font.PdfEncodings; import com.itextpdf.kernel.font.PdfFont; import com.itextpdf.kernel.font.PdfFontFactory; import com.itextpdf.layout.font.FontProvider; import com.cy.xgsm.controller.PrintPdfController; /** * * @author Dylan * PDF相關設定 */ @Configuration public class PdfConfiguration { private static final Logger log = LoggerFactory.getLogger(PdfConfiguration.class); @Bean public FontProvider getFontProvider() throws URISyntaxException, IOException { FontProvider provider = new DefaultFontProvider(true, true, false); byte[] bs = null; //SIMSUN.TTC為字型 try (InputStream in = PrintPdfController.class.getClassLoader().getResourceAsStream("font/SIMSUN.TTC")) { bs = IOUtils.toByteArray(in); } PdfFont pdfFont = PdfFontFactory.createTtcFont(bs, 1, PdfEncodings.IDENTITY_H, false, true); provider.addFont(pdfFont.getFontProgram()); return provider; } @Bean public ConverterProperties converterProperties(FontProvider fontProvider, Configuration config) { ConverterProperties cp = new ConverterProperties(); cp.setBaseUri(config.getPdfUrl()); try { cp.setFontProvider(fontProvider); } catch (Exception e) { log.error("列印PDF時未能新增字型", e); } return cp; } }
注意PDF設定需要新增列印PDF字型,SIMSUN.TTC為列印需要的字型,但是也可以是其他的
1.以上所有的相關設定資訊都設定完了,接下來就可以寫Api介面了
package com.cy.xgsm.controller; import java.io.IOException; import java.io.OutputStream; import java.net.URLEncoder; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context; import com.itextpdf.html2pdf.ConverterProperties; import com.itextpdf.html2pdf.HtmlConverter; import com.itextpdf.kernel.geom.PageSize; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfWriter; import com.cy.xgsm.common.Result; import com.cy.xgsm.model.OrderInfo; import com.cy.xgsm.service.OrderInfoService; /** * 列印PDF 控制接入層 * * @author Dylan * */ @Controller @RequestMapping("print") public class PrintPdfController { private static final Logger log = LoggerFactory.getLogger(PrintPdfController.class); @Autowired private OrderInfoService service; //thymeleaf模板引擎 @Autowired TemplateEngine templateEngine; //html轉換成pdf需要使用ConverterProperties @Autowired ConverterProperties converterProperties; @GetMapping("order/{orderId}.pdf") public void orderPdf(@PathVariable Long orderId, HttpServletResponse resp) throws IOException { Result<OrderInfo> result = service.selectByPrimaryKey(orderId); if (!result.isComplete()) { resp.sendError(404, "訂單ID不存在"); } Context context = new Context(); context.setVariable("order", result.getData()); ///html/pdf/order-template為列印模板紙張路徑 processPdf(context, "/html/pdf/order-template", result.getData().getKddh(), resp); } /** * 呼叫生成PDF * @param context 上下文 * @param template 模板檔案 * @param filename 檔名 * @param resp */ private void processPdf(Context context, String template, String filename, HttpServletResponse resp) throws IOException { log.info("生成PDF:" + filename); String html = templateEngine.process(template, context); String filenameEncoded = URLEncoder.encode(filename, "utf-8"); resp.setContentType("application/pdf"); resp.setHeader("Content-Disposition", "filename=" + filenameEncoded + ".pdf"); try (OutputStream out = resp.getOutputStream()) { PdfDocument doc = new PdfDocument(new PdfWriter(out)); //列印使用什麼什麼紙張可根據實際情況,我這裡預設使用A4 doc.setDefaultPageSize(PageSize.A4.rotate()); HtmlConverter.convertToPdf(html, doc, converterProperties); } } }
1.請求介面報錯解決方式:
如果在請求介面的時候發生以下錯誤資訊是列印模板的路徑錯誤了。
解決該錯誤需在你的yml設定thymeleaf路徑即可,不懂怎麼設定請往上看第二點application.yml設定,可按照application.yml複製上去即可解決。
點選Save to a file儲存,響應結果資料均為測試資料,僅供參考。
到此這篇關於SpringBoot+Thymeleaf實現生成PDF檔案的文章就介紹到這了,更多相關SpringBoot Thymeleaf生成PDF內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45