iText Freemarker模板生成导出PDF及部署到Linux

1.工程结构


2.maven

  <dependencies>
    <dependency>
		    <groupId>javax.servlet</groupId>
		    <artifactId>servlet-api</artifactId>
		    <version>2.5</version>
		    <scope>provided</scope>
		</dependency>
		
		       <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.11</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf.tool</groupId>
            <artifactId>xmlworker</artifactId>
            <version>5.5.11</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>
        <!--freemarker-->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.26-incubating</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
  </dependencies>

3 PDFKit.java

package com.servlet;
import com.itextpdf.text.Document;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;

import javax.servlet.http.HttpServletResponse;

import java.io.*;
import java.nio.charset.Charset;

public class PDFKit {
    
    public static class AsianFontProvider extends XMLWorkerFontProvider {

        @Override
        public Font getFont(final String fontname, String encoding, float size, final int style) {
            String fntname = fontname;
            if (fntname == null) {
               /*使用的windows里的宋体,可将其文件放资源文件中引入*/
                String classpath = PDFKit.class.getClassLoader().getResource("").getPath();
                String fontPath =classpath+"fonts/simsun.ttc";
                fntname = fontPath;
            }
            if (size == 0) {
                size = 4;
            }
            System.out.println(fntname);
            return super.getFont(fntname, encoding, size, style);
        }
    }



    /**
     * 生成PDF到输出流中(ServletOutputStream用于下载PDF)
     * @param data 输入到FTL中的数据
     * @param response HttpServletResponse
     * @return
     */
    public  void exportToResponse(Object data, HttpServletResponse response){
        try{
            String classpath = PDFKit.class.getClassLoader().getResource("").getPath();
            String filePath = classpath + "templates/hello.ftl";

            String html= FreeMarkerUtil.getContent(filePath,data);
            System.out.println(html);
            OutputStream out = null;
            out = response.getOutputStream();
            Document document = new Document(PageSize.A4);
            PdfWriter writer = PdfWriter.getInstance(document, out);
            convertToPDF(writer,document,html);
           // out.close();
        }catch (Exception ex){
            ex.printStackTrace();
        }
        

    }

    /**
     * @description PDF文件生成
     */
    private  void convertToPDF(PdfWriter writer,Document document,String htmlString){
        //获取字体路径
        document.open();
        try {
            XMLWorkerHelper.getInstance().parseXHtml(writer,document,
                    new ByteArrayInputStream(htmlString.getBytes()),
                    XMLWorkerHelper.class.getResourceAsStream("/default.css"),
                    Charset.forName("UTF-8"),new AsianFontProvider());
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            document.close();
        }

    }

}

FreemarkerUtil.java

    public static String getContent(String templatePath,Object data){
        String templateFileName=getTemplateName(templatePath);
        String templateFilePath=getTemplatePath(templatePath);
        if(StringUtils.isEmpty(templatePath)){
            throw new RuntimeException("templatePath can not be empty!");
        }
        try{
            Configuration config = new Configuration(Configuration.VERSION_2_3_25);
            config.setDefaultEncoding("UTF-8");
            config.setDirectoryForTemplateLoading(new File(templateFilePath));
            config.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
            config.setLogTemplateExceptions(false);
            Template template = config.getTemplate(templateFileName);
            StringWriter writer = new StringWriter();
            template.process(data, writer);
            writer.flush();
            String html = writer.toString();
            return html;
        }catch (Exception ex){
            throw new RuntimeException("FreeMarkerUtil process fail",ex);
        }
    }

DownloadServlet.java

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PDFKit kit=new PDFKit();
        
        String fileName = "广西XXXX系统健康状况.pdf";
        response.setContentType("application/pdf");
        try {
            response.setHeader("Content-Disposition", "attachment;filename="
                  + new String(fileName.getBytes("gb2312"), "ISO8859-1"));
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Map<String,String> a = new HashMap<String,String>();
        a.put("name", "中文字符");
        kit.exportToResponse(a,response);
	}
参考以下资料
http://blog.csdn.net/zxz547388910/article/details/74315277
ITEXT5.5.8转html为pdf文档解决linux不显示中文问题

https://segmentfault.com/a/1190000009160184
java根据模板动态生成PDF

http://blog.csdn.net/jys1109/article/details/10066747
使用itext将html生成pdf中文换行问题解决方案2
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值