• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Freemarker生成PDF

    一、環境:

    1、freemarker 2.3.21版本;

    2、itext 2.1.7版本;

    3、flying-saucer-core 11.0.7版本;

    二、實現代碼:

    /**
     * Copyright (c) 2006-2016 Hzins Ltd. All Rights Reserved. 
     *  
     * This code is the confidential and proprietary information of   
     * Hzins. You shall not disclose such Confidential Information   
     * and shall use it only in accordance with the terms of the agreements   
     * you entered into with Hzins,http://www.hzins.com.
     *  
     */
    package com.hzins.utils.pdf;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.StringWriter;
    import java.util.Map;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    
    import org.w3c.dom.Document;
    import org.xhtmlrenderer.pdf.ITextFontResolver;
    import org.xhtmlrenderer.pdf.ITextRenderer;
    import org.xml.sax.SAXException;
    
    import com.lowagie.text.DocumentException;
    import com.lowagie.text.pdf.BaseFont;
    
    import freemarker.cache.StringTemplateLoader;
    import freemarker.template.Configuration;
    import freemarker.template.Template;
    import freemarker.template.TemplateException;
    
    /**
     * <p>
     * 
     * 
     * 
     * </p>
     * 
     * @author hz15041240
     * @date 2016-10-11 下午7:45:33
     * @version
     */
    public class PdfUtil {
    
        /**
         * 
         * <p>
         * 
         * 根據Freemarker模板生成PDF文件并返回PDF字節數組
         * 
         * </p>
         * 
         * @param templeteBuffer freemarker模板文件字符串
         * @param templateName 模板名稱
         * @param map 模板參數
         * @param basePath 模板中圖片相對基礎路徑
         * @param fontFile 字體文件路徑 (simsun.ttc 字體)
         * @return
         * @throws IOException
         * @throws TemplateException
         * @throws ParserConfigurationException
         * @throws DocumentException
         * @throws SAXException
         * 
         * @author hz15041240
         * @date 2016-10-11 下午8:11:29
         * @version
         */
        public byte[] generatePdf(String templeteBuffer, String templateName, Map<String, Object> map, String basePath, String fontFile) throws IOException, TemplateException, ParserConfigurationException, DocumentException, SAXException {
    
    	/** ----freemarker模板解析---- **/
    	Configuration configuration = new Configuration(Configuration.VERSION_2_3_21);
    	configuration.setDefaultEncoding("utf-8");
    	StringTemplateLoader stringLoader = new StringTemplateLoader();
    	stringLoader.putTemplate(templateName, templeteBuffer);
    	configuration.setTemplateLoader(stringLoader);
    	Template template = configuration.getTemplate(templateName);
    	StringWriter str = new StringWriter();
    	template.process(template, str);
    
    	/** -------生成PDF------- **/
    	DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    	Document doc = builder.parse(new ByteArrayInputStream(str.toString().getBytes()));
    
    	ITextRenderer renderer = new ITextRenderer();
    	renderer.setDocument(doc, null);
    	// 解決中文支持問題
    	ITextFontResolver fontResolver = renderer.getFontResolver();
    	String simusun = fontFile;
    	if (simusun != null) {
    	    fontResolver.addFont(simusun, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
    	    renderer.getSharedContext().setFontResolver(fontResolver);
    	}
    	// 解決圖片的相對路徑問題
    	renderer.getSharedContext().setBaseURL("file:" + basePath);
    	renderer.layout();
    	
    	//返回PDF字節數組 一邊上傳文件服務器
    	ByteArrayOutputStream os = new ByteArrayOutputStream(1024000);
    	renderer.createPDF(os);
    
    	// 輸出PDF文件
    	// OutputStream fileStream = new FileOutputStream("d:\\test.pdf");
    	// fileStream.write(os.toByteArray());
    	// fileStream.close();
    
    	return os.toByteArray();
        }
    }
    

    三:pom.xml詳細:

    <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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<groupId>com.xxxx.utils</groupId>
    	<artifactId>pdf-client-project</artifactId>
    	<version>1.0.0-SNAPSHOT</version>
    
    	<packaging>jar</packaging>
    
    	<properties>
    		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <slf4j-api.version>1.7.7</slf4j-api.version>
            <logback.version>1.1.1</logback.version>
            <commons-codec.version>1.9</commons-codec.version>
            <commons-io.version>2.4</commons-io.version>
        </properties>
    	<dependencies>
    
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
                <version>${logback.version}</version>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>${logback.version}</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>${slf4j-api.version}</version>
            </dependency>
    
    		<dependency>
    			<groupId>org.freemarker</groupId>
    			<artifactId>freemarker</artifactId>
    			<version>2.3.21</version>
    		</dependency>
    		<dependency>
    			<groupId>org.xhtmlrenderer</groupId>
    			<artifactId>flying-saucer-pdf</artifactId>
    			<version>11.0.7</version>
    		</dependency>
    		
    		<dependency>
    			<groupId>com.lowagie</groupId>
    			<artifactId>itext</artifactId>
    			<version>2.1.7</version>
    		</dependency>
    		
    		<dependency>
    			<groupId>org.xhtmlrenderer</groupId>
    			<artifactId>flying-saucer-core</artifactId>
    			<version>11.0.7</version>
    		</dependency>
    		
    		<dependency>
    			<groupId>commons-codec</groupId>
    			<artifactId>commons-codec</artifactId>
    			<version>${commons-codec.version}</version>
    		</dependency>
    		<dependency>
    			<groupId>commons-io</groupId>
    			<artifactId>commons-io</artifactId>
    			<version>${commons-io.version}</version>
    		</dependency>
    	</dependencies>
    </project>

     

    示例:

    freemarker test.ftl

    <html lang="en">
    <head>
    <meta charset="utf-8" />
    <title>Document</title>
    <style type="text/css">
    html, body { margin: 0; padding: 0; }
    body { color: #000; font-family: SimSun; font-size: 20px; }
    table { width: 100%; border-collapse: collapse; border-spacing: 0;padding: 0; margin: 0; }
    td, th { padding: 0; margin: 0; font-size: 100%; }
         
    @media print { @page { margin: 0; padding: 0; margin-bottom: 20px; } }
    	.no-bold {font-weight:normal;}
    	.breakline{word-wrap: break-word; word-break: normal; }
    	.footer { margin-top: 10px; }
    @page {
        margin: 20mm 5mm 40mm 5mm;
    }
    
    #header {position: running(header);}
    #footer {position: running(footer);}
    @page{
        @top-center{
            content : element(header);
        }
        @bottom-center{
            content : element(footer)
        }
    }
    #pages:before{
        content : counter(page);
        font-size : 10px;
    }
    #pages:after{
        content : counter(pages);
        font-size : 10px;
    }
    </style>
    </head>
    <body>
    	<div>
    		<div id="header" style="margin-top: 0px;">
    			<span>頁眉頁眉頁眉頁眉頁眉頁眉頁眉頁眉頁眉頁眉頁眉頁眉頁眉頁眉頁眉頁眉頁眉頁眉</span>
    		</div>
    		<div id="footer">
    			<div style="text-align: center;">第<span id="pages">頁,共</span>頁</div>
    			<span style="margin-top:5px;">頁底頁底頁底頁底頁底頁底頁底頁底頁底頁底頁底頁底頁底頁底頁底頁底頁底頁底</span>
    		</div>
    		<br/>
    		<div>
    			<table class="biaoge1">
    				<tr><td width="20%">編號1</td><td width="30%">名稱</td><td width="20%">編號2</td><td width="30%" align="center">編號3</td></tr>
    				<#list insurantList as insurant>
    					<tr><td>${insurant.inssueNum}</td><td>${insurant.cname}</td><td>${insurant.cardNum}</td><td align="center">${insurant.brithday}</td></tr>
    				</#list>
    			</table>
    		</div>
    		
    	</div>
    </body>
    </html>
    

     

    生成的pdf效果:

    095726_IyZZ_559627.png095917_CiCz_559627.png

    圖中有間隔是用兩張圖拼的,中間頁就省略;

    100005_crqR_559627.png

    100025_ce2V_559627.png

    實現了頁眉與頁底+分頁顯示效果;

     

    轉載于:https://my.oschina.net/woter/blog/757100

    版權聲明:本文為weixin_34007879原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/weixin_34007879/article/details/91715225

    智能推薦

    基于Freemarker模版生成Docx和Pdf文件

    產品提了個這樣的需求:分別生成一個word文檔和pdf文檔,里面需要包含數據,這些數據需要有對應的樣式比如字體大小,表格,段落等。開始的想法是用Apache POI,但看了那一大段填充值操作的代碼發現太過冗長,決定采用Freemarker模版的方案。 百度了一圈看上去Spring Boot + FreeMarker制作word模板導出Word表格這種做法像那么一回事,嘗試了一波后發現生成的是只能生...

    java生成pdf(pd4ml+freemarker生成帶圖片和中文的pdf)

    因為需要圖片和中文,所以使用了pd4ml+freemarker來生成pdf 需要maven包 其中 flying-saucer-pdf、pdf-fonts、pdf-pd4ml 我是放在項目根目錄下的 要支持中文,還需要引入simsun.ttf字體文件,我是放在resources目錄下 能日賺30手賺試玩平臺,親測有效 生成pdf文件 創建controller調用生成pdf文件 ftl模板放在項目根...

    iText + freemarker轉成pdf字節流打印 無需生成本地pdf文件

    iText + freemarker轉成pdf字節流打印 無需生成本地pdf文件 本項目為springboot項目 引入依賴 2.操作工具類 3.controller層調用 構造data 4.模板 以及字體目錄結構...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    猜你喜歡

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    精品国产乱码久久久久久蜜桃不卡