摘要:格式文檔導出,是信息系統中非常實用的一種功能,用于各種報表和文檔的到處。示例中,使用生成要導出的格式文檔,通過來實現文件下載。將轉換成文檔生成的代碼比較簡單,創建一個對象,然后會在指定的中輸入生成的文件。作用相當于在中使用進行配置。
PDF格式文檔導出,是信息系統中非常實用的一種功能,用于各種報表和文檔的到處。最近正好有空,用之前項目中使用過的itext做一個簡單的示例,方便以后使用。示例中,使用Freemarker生成要導出的HTML格式文檔,通過Spring Boot來實現PDF文件下載。
創建Gradle項目源代碼:GitHub
需要在build.gradle中添加要引入的jar包,還有Gradle插件。主要有spring boot plugin和spring boot相關的包;freemarker,還有itextpdf,這里的itext-asian會引入中文支持。
buildscript { repositories { mavenLocal() mavenCentral() } dependencies { classpath("org.freemarker:freemarker:2.3.23") classpath("org.springframework.boot:spring-boot-gradle-plugin:1.4.0.RELEASE") } } ... ... dependencies { // tag::jetty[] compile("org.springframework.boot:spring-boot-starter-web") { exclude module: "spring-boot-starter-tomcat" } compile("org.springframework.boot:spring-boot-starter-jetty") // end::jetty[] // tag::actuator[] compile("org.springframework.boot:spring-boot-starter-actuator") compile("org.springframework.boot:spring-boot-starter-aop") compile("org.springframework:spring-context-support") compile "com.itextpdf:itextpdf:5.5.9" compile "com.itextpdf:itext-asian:5.2.0" compile "com.itextpdf.tool:xmlworker:5.5.9" compile "org.freemarker:freemarker:2.3.23" compile "javax.servlet:javax.servlet-api:3.1.0" testCompile (group: "junit", name: "junit", version: "4.12") testCompile("org.springframework.boot:spring-boot-starter-test") }用Freemarker來生成html字符串
freemarker是一種非常輕量易用的模板引擎,除了用于在web mvc框架中渲染html頁面以外,還可以用在其他需要生成其他有復雜格式的文檔,并且需要用數據進行格式化的場景下;將生成的字符串寫入指定的Java流中。
public class FreemarkerUtils { public static String loadFtlHtml(File baseDir, String fileName,Map globalMap){ if(baseDir == null || !baseDir.isDirectory() || globalMap ==null || fileName == null || "".equals(fileName)){ throw new IllegalArgumentException("Directory file"); } Configuration cfg = new Configuration(Configuration.VERSION_2_3_22); try { cfg.setDirectoryForTemplateLoading(baseDir); cfg.setDefaultEncoding("UTF-8"); cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);//.RETHROW cfg.setClassicCompatible(true); Template temp = cfg.getTemplate(fileName); StringWriter stringWriter = new StringWriter(); temp.process(globalMap, stringWriter); return stringWriter.toString(); } catch (IOException | TemplateException e) { e.printStackTrace(); throw new RuntimeException("load fail file"); } } }
傳入的參數是ftl文件的根目錄和文件名,還有要用來格式化文檔的數據。
itext將html轉換成PDF文檔itext生成PDF的代碼比較簡單,創建一個Document對象,然后XmlWorkerHelper會在指定的OutputStream中輸入生成的pdf文件。
public static void savePdf(OutputStream out, String html) { Document document = new Document(PageSize.A4, 50, 50, 60, 60); try { PdfWriter writer = PdfWriter.getInstance(document, out); document.open(); XMLWorkerHelper.getInstance().parseXHtml(writer, document, new StringReader(html)); } catch (Exception e) { e.printStackTrace(); } finally { document.close(); } }
如果簡單的實現文件下載的話,可以直接使用HttpServletResponse的OutputStream,就可以實現pdf下載,但是Spring MVC支持自定義View,使用Spring boot可以通過簡單的配置實現對應功能。
集成Spring Boot實現文件下載Spring MVC通過繼承基類AbstractView,可以實現自定義的View,在子類中,可以設置header,通過對輸出流的操作,就可以實現在Java代碼中調用需要的資源,輸出對應的內容的功能。詳細內容參看源代碼。
@Override protected void renderMergedOutputModel(Mapmodel, HttpServletRequest request, HttpServletResponse response) throws Exception { // IE workaround: write into byte array first. ByteArrayOutputStream baos = createTemporaryOutputStream(); // Apply preferences and build metadata. Document document = newDocument(); PdfWriter writer = newWriter(document, baos); prepareWriter(model, writer, request); buildPdfMetadata(model, document, request); // Build PDF document. document.open(); buildPdfDocument(model, document, writer, request, response); document.close(); // Flush to HTTP response. writeToResponse(response, baos); } ...... protected void buildPdfDocument(Map model, Document document, PdfWriter writer, HttpServletRequest request, HttpServletResponse response) throws Exception { URL fileResource = FormPdfview.class.getResource("/templates"); String html = FreemarkerUtils.loadFtlHtml(new File(fileResource.getFile()), "simpleForm.ftl", model); XMLWorkerHelper.getInstance().parseXHtml(writer, document, new ByteArrayInputStream(html.getBytes()), Charset.forName("UTF-8"), new AsianFontProvider() ); }
為了能夠在Spring MVC的控制器中通過MVC模式調用自定義的View對象,還需要進行一些配置;
首先,在WebMvcConfigurerAdapter的子類中,添加view resolver配置。作用相當于在spring mvc中使用xml進行配置。
@Bean public ResourceBundleViewResolver viewResolver() { ResourceBundleViewResolver resolver = new ResourceBundleViewResolver(); resolver.setOrder(1); resolver.setBasename("views"); return resolver; }
然后要在resources目錄下創建一個views.properties文件,為我們自定義的view指定一個名字,就可以在controller中正常使用。
simplePDF.(class)=com.liuwill.text.view.Pdfview simpleFormPDF.(class)=com.liuwill.text.view.FormPdfview效果
下載源代碼之后,執行gradle bootRun來運行Spring Boot,運行起來之后,訪問 http://localhost:8888/download 查看結果。
文/liuwill(簡書作者)
原文鏈接:Spring Boot集成Freemarker和iText生成PDF文檔
著作權歸作者所有,轉載請聯系作者獲得授權,并標注“簡書作者”。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66755.html
摘要:由于工作需要,要實現后端根據模板動態填充數據生成文檔,通過技術選型,使用來設計模板,結合工具庫來調用渲染生成文檔。 由于工作需要,要實現后端根據模板動態填充數據生成PDF文檔,通過技術選型,使用Ireport5.6來設計模板,結合JasperReports5.6工具庫來調用渲染生成PDF文檔。本人文采欠缺,寫作能力差,下面粗略的介紹其使用步驟,若有不對的地方,望大家莫噴,謝謝! 一、使...
摘要:一需求說明根據業務需要,需要在服務器端生成可動態配置的文檔,方便數據可視化查看。能配置動態的模板,正好解決了樣式動態渲染和排版問題。包負責模板之外的額外信息填寫,這里主要是頁眉頁腳的定制。包的畫圖工具包,目前只有一個線形圖。 一、需求說明:根據業務需要,需要在服務器端生成可動態配置的PDF文檔,方便數據可視化查看。 二、解決方案:iText+FreeMarker+JFreeChart生...
摘要:一需求說明根據業務需要,需要在服務器端生成可動態配置的文檔,方便數據可視化查看。能配置動態的模板,正好解決了樣式動態渲染和排版問題。包負責模板之外的額外信息填寫,這里主要是頁眉頁腳的定制。包的畫圖工具包,目前只有一個線形圖。 一、需求說明:根據業務需要,需要在服務器端生成可動態配置的PDF文檔,方便數據可視化查看。 二、解決方案:iText+FreeMarker+JFreeChart生...
摘要:日期和時間處理日期和時間的函數庫。使用中可觀察序列,創建異步基于事件應用程序的函數庫。為分布式系統提供延遲和容錯處理。發布使用本機格式分發應用程序的工具。將程序資源和打包成和的本機文件。圖像處理用來幫助創建評估或操作圖形的函數庫。 好資源要分享原文 譯者 唐尤華 翻譯自 github akullpp 構建 這里搜集了用來構建應用程序的工具。 Apache Maven:Mave...
摘要:數據和信息是不可分離的,數據是信息的表達,信息是數據的內涵。數據本身沒有意義,數據只有對實體行為產生影響時才成為信息。主要目標是為開發提供天然的模板,并且能在里面準確的顯示。目前是自然更加推薦。 這是泥瓦匠的第105篇原創 文章工程: JDK 1.8 Maven 3.5.2 Spring Boot 2.1.3.RELEASE 工程名:springboot-webflux-4-thym...
閱讀 1260·2021-11-23 09:51
閱讀 1628·2021-11-16 11:45
閱讀 4014·2021-10-09 09:43
閱讀 2682·2021-07-22 16:47
閱讀 944·2019-08-27 10:55
閱讀 3449·2019-08-26 17:40
閱讀 3083·2019-08-26 11:39
閱讀 3228·2019-08-23 18:39