JAVA用.ftl模板文件生成PDF

场景:产品提了个需求,要求按照他给的原型格式生成一个PDF文件。

(这是产品给的原型)

JAVA用.ftl模板文件生成PDF_第1张图片

解决思路:可以先写一个.ftl模板文件(其实也就是一个html页面),然后预留对应的字段放入map中进行替换(其中data11....都是要替换的)

注:

Freemarker是一个模板框架,主要是为了加快染速度而产生的。它与web容器无关,只要是关于模板生成一些代码的都可以使用它完成。

比如xml,Java代码的生成等。 其他类似的模板框架还有velocity。

 

贴出html代码:




    
    



    

申请单

XXX ${XXX} XXX ${XXX}
XXX ${XXX} XXX ${XXX}
XXX ${XXX} XXX ${XXX}
XXX XXX XXX ${XXX}
XXX ${XXX} XXX ${XXX}
XXX ${XXX}
XXX ${XXX}
XXX ${XXX}
XXX ${XXX}

 

贴出map代码:

 Map map = new HashMap<>();
 map.put("xxx",StringUtils.isNotBlank(xxx)?xxx:" ");
.
.
.
.
.
//生成工具,下面有代码
String htmlStr = HtmlGenerator.generate(htmlName, map);
//生成工具,下面有代码
byte[] bytes = PdfDocumentGenerator.pdfgenerate(htmlStr);    

关键来了!!!

用freemarker框架读取.ftl模板地址。

HtmlGenerator类

//用freemaker框架读取模板,并把map值注入
String htmlStr = HtmlGenerator.generate(htmlName, map);

//po出我工具类的代码
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Map;

public class HtmlGenerator {

    public static String generate(String template, Map variables) throws IOException, TemplateException, IOException {
        Configuration config = FreemarkerConfiguration.getConfiguation();
        //读取模板文件地址
        config.setDirectoryForTemplateLoading(new File(Constants.templatePath));
        config.setDefaultEncoding("UTF-8");
        //获取模板文件
        Template tp = config.getTemplate(template);
        StringWriter stringWriter = new StringWriter();
        BufferedWriter writer = new BufferedWriter(stringWriter);
        tp.setEncoding("UTF-8");
        //把map数据写入
        tp.process(variables, writer);
        String htmlStr = stringWriter.toString();
        writer.flush();
        writer.close();
        return htmlStr;
    }
}

输出:这边可以得到一个已经替换的html格式的String流。我们只需要把这个String流输出成PDF文件就可以了。

po出我的工具。其实也就是用iText生成。

//用刚刚得到的html String流 生成pdf
byte[] bytes = PdfDocumentGenerator.pdfgenerate(htmlStr);






//po出代码
import com.lowagie.text.pdf.BaseFont;
import freemarker.template.TemplateException;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.xhtmlrenderer.pdf.ITextRenderer;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.*;
import java.util.Map;

@Slf4j
public class PdfDocumentGenerator {
    private final static Logger logger = Logger.getLogger(PdfDocumentGenerator.class);

    private final static HtmlGenerator htmlGenerator;
    static {
        htmlGenerator = new HtmlGenerator();
    }


    /*
     *
     * 根据html的内容生成pdf
     *
     */
    public static byte[] pdfgenerate(String htmlContent)throws Exception{

        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
         Document doc = builder.parse(new ByteArrayInputStream(htmlContent.getBytes("UTF-8")));
        ITextRenderer iTextRenderer = new ITextRenderer();
        // classpath 路径
        String outputFileClass = ResourceLoader.getPath("");
        log.info("Resource Path =====> {}",outputFileClass);
        //添加字体,以支持中文
        iTextRenderer.getFontResolver().addFont(Constants.templatePath + "/fonts/simsun.ttc", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        iTextRenderer.setDocument(doc, null);
        iTextRenderer.layout();
        iTextRenderer.createPDF(out);
        byte[] bytes = out.toByteArray();
        out.close();
        return bytes;
    }
}

用生成的字节流生成PDF

//用生成的字节流
FileOutputStream fout = new FileOutputStream(bytes);
//将字节写入文件
fout.write(b);
fout.close();

最终效果:

JAVA用.ftl模板文件生成PDF_第2张图片

你可能感兴趣的:(java)