1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > JAVA用.ftl模板文件生成PDF

JAVA用.ftl模板文件生成PDF

时间:2021-12-22 11:38:54

相关推荐

JAVA用.ftl模板文件生成PDF

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

(这是产品给的原型)

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

注:

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

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

贴出html代码:

<!DOCTYPE html><html><head><meta charset="UTF-8"></meta><style>.apply {margin: 0 auto;padding: 0 30px;}.title {margin-top: 40px ;text-align: center;font-weight: bold;//字体需要和后台对应上font-family: SimSun;font-weight: bold;font-size: 20px;color: #333333;letter-spacing: 0;}.table {width: 100%;margin-top: 30px;font-family: SimSun;font-size: 14px;color: #111111;letter-spacing: 0.54px;}.label {background-color: #E6E6E6;width: 20%;}.normaltd {padding: 10px 0;}.maxtd {height: 250px;}.value {width: 30%;padding-left: 10px;}</style></head><body style="font-family: SimSun"><div class="apply"><p class="title">申请单</p><table border="1" cellspacing="0" class="table"><tr><td class="label normaltd" align="center">XXX</td><td class="normaltd value">${XXX}</td><td class="label normaltd" align="center">XXX</td><td class="normaltd value">${XXX}</td></tr><tr><td class="label normaltd" align="center">XXX</td><td class="normaltd value">${XXX}</td><td class="label normaltd" align="center">XXX</td><td class="normaltd value">${XXX}</td></tr><tr><td class="label" align="center">XXX</td><td class="normaltd value">${XXX}</td><td class="label normaltd" align="center">XXX</td><td class="normaltd value">${XXX}</td></tr><tr><td class="label normaltd" align="center">XXX</td><td class="normaltd value">XXX</td><td class="label normaltd" align="center">XXX</td><td class="normaltd value">${XXX}</td></tr><tr><td class="label normaltd" align="center">XXX</td><td class="normaltd value">${XXX}</td><td class="label normaltd" align="center">XXX</td><td class="normaltd value">${XXX}</td></tr><tr ><td valign="middle" colspan="1" class="label maxtd" align="center">XXX</td><td valign="middle" colspan="3" class="maxtd value">${XXX}</td></tr><tr><td colspan="1" class="label normaltd" align="center">XXX</td><td colspan="3" class="normaltd value">${XXX}</td></tr><tr><td colspan="1" class="label normaltd" align="center">XXX</td><td colspan="3" class="normaltd value">${XXX}</td></tr><tr><td colspan="1" class="label normaltd" align="center">XXX</td><td colspan="3" class="normaltd value">${XXX}</td></tr></table></div></body></html>

贴出map代码:

Map<String, Object> 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<String,Object> 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流 生成pdfbyte[] 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;@Slf4jpublic 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();

最终效果:

POM:

iText <dependency> <groupId>com.lowagie</groupId> <artifactId>itext</artifactId> <version>2.1.7</version> </dependency>

freemarker <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker-gae</artifactId> <version>2.3.22</version> </dependency>

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。