Freemarker生成生成HTML三种情况
1、通过.flt模板生成file
2、根据模板字符串生成file
3、根据模板字符串生成HTML文件字符串
开始
模板数据准备
private static void autoGenHTMLTest()
{
//给模板文件组装数据
Map<String, Object> dataMap = new HashMap<String, Object>();
SpecialInfo specialInfo = new SpecialInfo();
specialInfo.setSpecialName("xxx专项");
specialInfo.setSpecialProjectName("xxx项目");
/*<td class="df-table-td">${policyBasis.title}</td>
</tr>
<tr class="df-table-tr">
<td class="df-table-td">政策文号</td>
<td class="df-table-td">${policyBasis.documentNumber}</td>*/
PolicyBasis policyBasis = new PolicyBasis();
policyBasis.setTitle("xxx标题");
policyBasis.setDocumentNumber("xxx文号");
dataMap.put("project",specialInfo);
dataMap.put("policyBasis",policyBasis);
dataMap.put("title","标题");
String DEST_PATH = "e:/freemarker";//目标路径
genFileWithTemplate(TEMPLATE_PATH,DEST_PATH,"test.ftl","hello.html",dataMap);
}
一、通过.flt模板生成file
//通过.flt模板生成file
private static void genFileWithTemplate(String templateDir,String destDir,String templateFileName,String destFileName,Map<String,Object> dataMap)
{
//创建freeMarker配置实例
Configuration configuration = new Configuration();
Writer out = null;
try {
//设置模版路径
configuration.setDirectoryForTemplateLoading(new File(templateDir));
//加载模版文件
Template template = configuration.getTemplate(templateFileName);
//生成数据
File docFile = new File(destDir + "\\" + destFileName);
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile)));
//输出文件
template.process(dataMap, out);
System.out.println(destFileName+" 模板文件创建成功 !");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != out) {
out.flush();
out.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
二、根据模板字符串生成file
//根据模板字符串自动创建html-示例
private static void autoGenHTMLStrTest(){
//给模板文件组装数据
Map<String, Object> dataMap = new HashMap<String, Object>();
SpecialInfo specialInfo = new SpecialInfo();
specialInfo.setSpecialName("xxx专项");
specialInfo.setSpecialProjectName("xxx项目");
/*<td class="df-table-td">${policyBasis.title}</td>
</tr>
<tr class="df-table-tr">
<td class="df-table-td">政策文号</td>
<td class="df-table-td">${policyBasis.documentNumber}</td>*/
List<PolicyBasis> policyBasisList = new ArrayList<>();
for(int i=0;i<10;i++){
PolicyBasis policyBasis = new PolicyBasis();
policyBasis.setTitle("xxx标题");
policyBasis.setDocumentNumber("xxx文号");
policyBasisList.add(policyBasis);
}
dataMap.put("policyBasis",policyBasisList);
//dataMap.put("project",specialInfo);
dataMap.put("title","标题");
String templateString="<!DOCTYPE html><html><head><meta charset=\"utf-8\"/><title>${title}</title></head><body><div id=\"app\"><div class=\"df-container flex-1\" ><table class=\"df-table\" cellspacing=\"0\"><tr class=\"df-table-tr\"><td class=\"df-table-td\" >政策标题</td><td class=\"df-table-td\" >政策文号:</td></tr><#list policyBasis as item><tr class=\"df-table-tr\"><td class=\"df-table-td\" >${item.title}</td><td class=\"df-table-td active\" >${item.documentNumber}</td></tr></#list></table></div></div></body></html>\n";
String DEST_PATH = "e:/freemarker";//目标路径
genFileWithTemplate(DEST_PATH,"hello7.html",dataMap,templateString);
//genFileWithTemplate(dataMap,templateString);
}
//html字符串生成模板
private static void genFileWithTemplate(String destDir,String destFileName,Map<String,Object> dataMap,String templateString){
//使用一个模板加载器变成模板
StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();
stringTemplateLoader.putTemplate("template",templateString);
//在配置中设置模板加载器
Configuration configuration = new Configuration();
configuration.setTemplateLoader(stringTemplateLoader);
//创建freeMarker配置实例
Writer out = null;
try {
//获取模板的内容
Template template = configuration.getTemplate("template","utf-8");
//生成数据
File docFile = new File(destDir + "\\" + destFileName);
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile)));
//输出文件
template.process(dataMap, out);
System.out.println(" 模板文件创建成功 !");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != out) {
out.flush();
out.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
三、根据模板字符串生成HTML文件字符串
private static void genFileWithTemplate(Map<String,Object> dataMap,String templateString){
StringWriter stringWriter = new StringWriter();
//读取模板的位置在resources 下的templates下contractAgreement.ftl
//使用一个模板加载器变成模板
StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();
stringTemplateLoader.putTemplate("template",templateString);
//在配置中设置模板加载器
Configuration configuration = new Configuration();
configuration.setTemplateLoader(stringTemplateLoader);
try {
Template template = configuration.getTemplate("template","utf-8");
template.process(dataMap, stringWriter);
} catch (Exception e) {
e.printStackTrace();
}
stringWriter.flush();
System.out.println(stringWriter.toString());
}
HTML转PDF
Java Html转pdf实战
https://www.jianshu.com/p/d07bca50daed?tdsourcetag=s_pctim_aiomsg
安装文中步骤来,注意修改js中和代码中文件路径。
细节描述
安装
- 下载
wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.7-linux-x86_64.tar.bz2
- 解压
tar -xvf phantomjs-1.9.7-linux-x86_64.tar.bz2
如果提示 tar (child): bzip2:无法 exec: 没有那个文件或目录, 需要运行 yum -y install bzip2 安装bzip2
- 将可执行文件放入系统路径
#sudo ln -s /home/test/bin/phantomjs-1.9.7-linux-x86_64/bin/phantomjs /usr/bin/phantomjs
- 安装依赖——fontconfig和freetype
yum install fontconfig freetype2
- 解决中文乱码
yum -y install bitmap-fonts bitmap-fonts-cjk
字体粗细不一致
这是centos不存在字体的原因,可以导入字体。
安装字体管理工具: yum install -y fontconfig mkfontscale
访问 c:\windows\fonts,把需要的字体copy出来。然后上传到服务器上的 /usr/share/fonts下
执行 mkfontscale mkfontdir fc-cache -fv三个命令,然后重启服务器(reboot)即可(可以不用重启)。
命令的介绍
sudo mkfontscale (创建字体的fonts.scale文件,控制字体的选装缩放)
sudo mkfontdir (创建字体的fonts.dir文件,控制字体粗斜体产生)
sudo fc-cache -fv (建立字体缓存信息,也就是让系统认识这个字体–即安装)
注意:
1、如果报mkfontscale错误
yum install mkfontscale
2、如果执行报没有权限
cd chmod -R /phantomjs-1.9.7-linux-x86_64
3、没有libfontconfig.so.1字体
yum install libXext libXrender fontconfig libfontconfig.so.1
补充:提取HTML或fit文件字符串中要求的某段字符串
例子
private static void getAnchorPoint(String str) {
// 把要匹配的字符串写成正则表达式,然后要提取的字符使用括号括起来
// 在这里,我们要提取最后一个数字,正则规则就是“一个数字加上大于等于0个非数字再加上结束符”
//<div class="df-anchor" title="锚点标题" id="anchor-1594267188743" style="height: 10px;"></div>
Pattern pattern = Pattern.compile("(\\d)[^\\d]*$");
Matcher matcher = pattern.matcher(str);
if (matcher.find()){
System.out.println(matcher.group(1));
}
}
业务实例
//<div class="df-anchor" title="锚点标题" id="anchor-1594267188743" style="height: 10px;"></div>
//正则表达式获取锚点id
Pattern pattern = Pattern.compile("<div class=\"df-anchor\" title=\"(.+?)\" id=\"(.+?)\".*?></div>");
Matcher matcher = pattern.matcher(str);
while (matcher.find()){
System.out.println(matcher.group(2));
}