java使用freemark生成pdf

1.首先通过maven的pom.xml文件引入jar包


			javax.servlet
			javax.servlet-api
			3.0.1
			provided
		
		
			org.freemarker
			freemarker
			2.3.22
		
		
			org.xhtmlrenderer
			flying-saucer-pdf
			9.0.3
		

2.编写一个PDF生成辅助类

package yang.zheng.util.pdf;

import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Locale;

import org.xhtmlrenderer.pdf.ITextRenderer;

import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.BaseFont;

import freemarker.core.ParseException;
import freemarker.template.Configuration;
import freemarker.template.MalformedTemplateNameException;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateNotFoundException;
 
/**
 * PDF生成辅助类
 * @author Goofy http://www.xdemo.org
 *
 */
@SuppressWarnings("deprecation")
public class PdfHelper {
 
    public static ITextRenderer getRender() throws DocumentException, IOException {
 
        ITextRenderer render = new ITextRenderer();
 
        String path = getPath();
        //添加字体,以支持中文
        render.getFontResolver().addFont(path + "pdf/arialuni.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        render.getFontResolver().addFont(path + "pdf/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
 
        return render;
    }
 
    //获取要写入PDF的内容
    public static String getPdfContent(String ftlPath, String ftlName, Object o) throws TemplateNotFoundException, MalformedTemplateNameException, ParseException, IOException, TemplateException {
        return useTemplate(ftlPath, ftlName, o);
    }
 
    //使用freemarker得到html内容
    public static String useTemplate(String ftlPath, String ftlName, Object o) throws TemplateNotFoundException, MalformedTemplateNameException, ParseException, IOException, TemplateException {
 
        String html = null;
 
        Template tpl = getFreemarkerConfig(ftlPath).getTemplate(ftlName);
        tpl.setEncoding("UTF-8");
 
        StringWriter writer = new StringWriter();
        tpl.process(o, writer);
        writer.flush();
        html = writer.toString();
        return html;
    }
 
    /**
     * 获取Freemarker配置
     * @param templatePath
     * @return
     * @throws IOException
     */
    private static Configuration getFreemarkerConfig(String templatePath) throws IOException {
    	freemarker.template.Version version = new freemarker.template.Version("2.3.22");
        Configuration config = new Configuration(version);
        config.setDirectoryForTemplateLoading(new File(templatePath));
        config.setEncoding(Locale.CHINA, "utf-8");
        return config;
    }
     
    /**
     * 获取类路径
     * @return
     */
    public static String getPath(){
        return PdfHelper.class.getResource("/").getPath().substring(1);
    }
 
}
3.编写一个pdf工具类

package yang.zheng.util.pdf;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.xhtmlrenderer.pdf.ITextRenderer;

import com.lowagie.text.DocumentException;

import freemarker.core.ParseException;
import freemarker.template.MalformedTemplateNameException;
import freemarker.template.TemplateException;
import freemarker.template.TemplateNotFoundException;
 
/**
 * PDF生成工具类
 * @author Goofy http://www.xdemo.org
 *
 */
public class PdfUtils {
 
    public static void main(String[] args) {
        try {
 
            Map o=new HashMap();
            //存入一个集合
            List list = new ArrayList();
            list.add("小明");
            list.add("张三");
            list.add("李四");
            o.put("name", "http://www.xdemo.org/");
            o.put("nameList", list);
             
            String path=PdfHelper.getPath();
             
            generateToFile(path, "pdf/tpl.ftl",path+"pdf/", o, "D:\\xdemo.pdf");
             
        } catch (Exception e) {
            e.printStackTrace();
        }
 
    }
     
    /**
     * 生成PDF到文件
     * @param ftlPath 模板文件路径(不含文件名)
     * @param ftlName 模板文件吗(不含路径)
     * @param imageDiskPath 图片的磁盘路径
     * @param data 数据
     * @param outputFile 目标文件(全路径名称)
     * @throws Exception
     */
    public static void generateToFile(String ftlPath,String ftlName,String imageDiskPath,Object data,String outputFile) throws Exception {
        String html=PdfHelper.getPdfContent(ftlPath, ftlName, data);
        OutputStream out = null;
        ITextRenderer render = null;
        out = new FileOutputStream(outputFile);
        render = PdfHelper.getRender();
        render.setDocumentFromString(html);
        if(imageDiskPath!=null&&!imageDiskPath.equals("")){
            //html中如果有图片,图片的路径则使用这里设置的路径的相对路径,这个是作为根路径
            render.getSharedContext().setBaseURL("file:/"+imageDiskPath);
        }
        render.layout();
        render.createPDF(out);
        render.finishPDF();
        render = null;
        out.close();
    }
     
    /**
     * 生成PDF到输出流中(ServletOutputStream用于下载PDF)
     * @param ftlPath ftl模板文件的路径(不含文件名)
     * @param ftlName ftl模板文件的名称(不含路径)
     * @param imageDiskPath 如果PDF中要求图片,那么需要传入图片所在位置的磁盘路径
     * @param data 输入到FTL中的数据
     * @param response HttpServletResponse
     * @return
     * @throws TemplateNotFoundException
     * @throws MalformedTemplateNameException
     * @throws ParseException
     * @throws IOException
     * @throws TemplateException
     * @throws DocumentException
     */
    public static OutputStream generateToServletOutputStream(String ftlPath,String ftlName,String imageDiskPath,Object data,HttpServletResponse response) throws TemplateNotFoundException, MalformedTemplateNameException, ParseException, IOException, TemplateException, DocumentException{
        String html=PdfHelper.getPdfContent(ftlPath, ftlName, data);
        OutputStream out = null;
        ITextRenderer render = null;
        out = response.getOutputStream();
        render = PdfHelper.getRender();
        render.setDocumentFromString(html);
        if(imageDiskPath!=null&&!imageDiskPath.equals("")){
            //html中如果有图片,图片的路径则使用这里设置的路径的相对路径,这个是作为根路径
            render.getSharedContext().setBaseURL("file:/"+imageDiskPath);
        }
        render.layout();
        render.createPDF(out);
        render.finishPDF();
        render = null;
        return out;
    }
}
4.pdf生成模板(tpl.ftl)








    作者:http://www.xdemo.org/
    

你好:${name}

Hello PDF: 中文支持

样式支持,红边框,红字
样式支持,蓝色10像素的边框,蓝字

<#list nameList as list>
A B C D
100 29 32 43
100 29 32 43
100 29 32 43
100 29 32 43
100 29 32 43
${list}
5.字体

 生成pdf工具类中使用了两种字体分别为arialuni.ttf和simsun.ttc,请大家自行到百度中搜索下载。



你可能感兴趣的:(java基础,java生成pdf)