zoukankan      html  css  js  c++  java
  • 使用freemarker和itext把html转pdf

    1.把html转pdf,首先必须要解决中文显示问题,CSS样式问题以及可能的JS问题,先上例子,自己去体会。

    2.先去下载simsun.ttc字体;

    2.demo.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF­8"/>
        <title>Title</title>
        <style>
            .color {
                color: green;
            }
    
            .pos {
                position: absolute;
                left: 200px;
                top: 5px;
                width: 200px;
                font­size: 10px;
            }
        </style>
    </head>
    <body style="font-family: SimSun">
        <img src="logo.png" width="600px" />
        <div class="color pos">
            hello,${name};
        </div>
    </body>
    </html>

    3.java实现转换代码

    package com.ra.truck.createpdf;
    
    import com.itextpdf.text.pdf.BaseFont;
    import com.lowagie.text.*;
    import com.lowagie.text.Font;
    import com.lowagie.text.Rectangle;
    import com.lowagie.text.pdf.PdfWriter;
    import freemarker.template.Configuration;
    import freemarker.template.Template;
    import org.xhtmlrenderer.pdf.ITextFontResolver;
    import org.xhtmlrenderer.pdf.ITextRenderer;
    
    import java.awt.*;
    import java.io.*;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * @Auther: lanhao
     * @Date: 2018/8/7 11:46
     * @Description:
     */
    public class JavaToPdfHtmlFreeMarkerFS {
        private static final String DEST ="../HelloWorld_CN_HTML_FREEMARKER_FS_index.pdf";
        private static final String HTML = "demo.html";
        private static final String FONT = "simsun.ttc";private static final String LOGO_PATH ="file:/"+PathUtil.getCurrentPath()+"/"+"demo448"+".png";
        private static Configuration freemarkerCfg=null;
        static {
            freemarkerCfg =new Configuration();
            //freemarker的模板目录
            try {
                freemarkerCfg.setDirectoryForTemplateLoading(new File(PathUtil.getCurrentPath()));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        public static void main(String[] args){
            String os=System.getProperty("os.name");
            System.out.println(os);
            Map<String,Object> data = new HashMap<>();
            data.put("name","lan浩");
            String content =freeMarkerRender(data,HTML);
            createPdf(content,DEST);
        }
    
        /**
         * freemarker渲染html
         */
        public static String freeMarkerRender(Map<String, Object> data,String htmlTmp) {
            Writer out = new StringWriter();
            try {
                // 获取模板,并设置编码方式
                Template template = freemarkerCfg.getTemplate(htmlTmp);
                template.setEncoding("UTF­8");
                // 合并数据模型与模板
                template.process(data, out); //将合并后的数据和模板写入到流中,这里使用的字符流
                out.flush();
                return out.toString();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    out.close();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
            return null;
        }
    
        private static void createPdf(String content,String dest) {
            try {
                ITextRenderer render = new ITextRenderer();
                //解决中文不显式问题
                ITextFontResolver fontResolver = render.getFontResolver();
                fontResolver.addFont(FONT,BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
                // 解析html生成pdf
                render.setDocumentFromString(content);
                //解决图片相对路径的问题
                render.getSharedContext().setBaseURL(LOGO_PATH);
                render.layout();
                render.createPDF(new FileOutputStream(dest));
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    注:引用的文件全部放在项目的resource根目录下

  • 相关阅读:
    SAP S/4HANA extensibility扩展原理介绍
    SAP CRM系统订单模型的设计与实现
    使用nodejs代码在SAP C4C里创建Individual customer
    SAP Cloud for Customer Account和individual customer的区别
    Let the Balloon Rise map一个数组
    How Many Tables 简单并查集
    Heap Operations 优先队列
    Arpa’s obvious problem and Mehrdad’s terrible solution 思维
    Passing the Message 单调栈两次
    The Suspects 并查集
  • 原文地址:https://www.cnblogs.com/lazyInsects/p/9492602.html
Copyright © 2011-2022 走看看