Freemarker生成HTML页面及字符串,HTML页面生成PDF文件

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中和代码中文件路径。

细节描述

安装

  1. 下载

wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.7-linux-x86_64.tar.bz2

  1. 解压

tar -xvf phantomjs-1.9.7-linux-x86_64.tar.bz2

如果提示 tar (child): bzip2:无法 exec: 没有那个文件或目录, 需要运行 yum -y install bzip2 安装bzip2

  1. 将可执行文件放入系统路径

#sudo ln -s /home/test/bin/phantomjs-1.9.7-linux-x86_64/bin/phantomjs /usr/bin/phantomjs

  1. 安装依赖——fontconfig和freetype

yum install fontconfig freetype2

  1. 解决中文乱码

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));
            }
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值