zoukankan      html  css  js  c++  java
  • Itext结合struts2 中的FreeMarker动态打印输出html页面为pdf文件


    背景资料我就不介绍了,可以参考相关关于Itex和FreeMarker的文章和博文,下面的内容参考了网上各种资料,由于找的时候没有仔细的记录相应的出处,因此可能有些内容和其他博主的内容重复,敬请谅解在实现的过程中遇到很多问题,下面着重讲解遇到的问题与查找到的解决方法:

    (1)用老版本的Itext ,最新的Itext 5.0.3我没实现成功,我用的是Itext 2.0.8

    (2)要解决中文,日文的输出要 这个文件  iTextAsian.jar  ,记得要放在classpath路径下噢,顺便提一个小技巧,对最新版的Itext 5.0.3这个 iTextAsian.jar没法用,网上找到的方法是手工解压这个文件,并讲包名改为这个开头的com.itextpdf.text,也就是改目录名字哈

    (3)测试输出时使用的FreeMarker模板文件如下:在这个模板文件中要动态输出两个内容:一条消息,用表格方式循环数输出一个列表中的内容代码

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>测试一下</title>
    </head>
    <body>
    随便输出点啥${message}
    
    <br></br>
    是非得失 test
    <table>
    <#list userList as listUser>
    				<tr>
    					<td>名称1 ${listUser.userName1}</td>
    					<td>名称2 ${listUser.userName2}</td>
    				</tr>
    </#list>														
    </table>
    </body>
    </html>
    

    (4)中文输出的问题是最不好解决的,开始搞了半天也没能实现FreeMaker输出的内容在itext打印为中文,后来参考晚上的一片文章说看itext源码后发现采用SAXmyHtmlHandler方式能手动设置字体,这样就实现中文中文输出,核心代码如下 代码

    private Configuration cfg;
    
    public void process() throws Exception {
    
            // 取得模版文件,就是上面第三步的模板文件哈
            Template t = cfg.getTemplate("test.ftl");
            
            
            // 建立数据模型
            Map root = new HashMap();
                   //构造列表数组,列表中的数据包含两个字段,即两个名字撒
            List<User> users=new ArrayList<User>();
            for (int i = 0; i < 10; i++) {
                User usertemp=new User();
                usertemp.setUserName1(i+"s随便弄个名字东");
                usertemp.setUserName2(i+"中国古高度发达");
                users.add(usertemp);
                
            }
            
            root.put("message", "Hello 随便输出点消息看看效果咯!");
            root.put("userList", users);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            OutputStreamWriter oStreamWriter=new OutputStreamWriter(baos);
            t.process(root,oStreamWriter );
            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());</pre>
    <pre class="java">      //打印pdf咯
            html2pdf(bais, "/Users/sir/Desktop/test1.pdf");        
        
        }
        private void html2pdf(InputStream is,String outputPathName) throws Exception {
            Document doc = new Document();
            BaseFont bf = BaseFont.createFont("STSong-Light,Bold", "UniGB-UCS2-H",
                    BaseFont.NOT_EMBEDDED);//设置中文宋体字
            //下面这点代码就是解决中文输出的关键所在了
            SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
            PdfWriter.getInstance(doc, new FileOutputStream(outputPathName));
            SAXmyHtmlHandler saxHandler = new SAXmyHtmlHandler(doc, bf);
            parser.parse(is, saxHandler);
        }
    

    (5)调用上面代码的process() 函数就可以输出pdf文件了

    (6)总结:感谢网上各位同志分享资料FreeMarker的模板文件随便编,这样就可以实现你想怎么打印输出就怎么打印输出当然Itext并不是所有的html都支持噢
    更详细的资料请您查看 http://today.java.net/pub/a/today/2007/06/26/generating-pdfs-with-flying-saucer-and-itext.html

  • 相关阅读:
    HDU2034:人见人爱A-B
    Codeup1085: 阶乘的和
    HDU2037:今年暑假不AC
    剑指Offer(Java版)第二十七题:从上往下打印出二叉树的每个节点,同层节点从左至右打印。
    剑指Offer(Java版)第二十六题:输入两个整数序列,第一个序列表示栈的压入顺序, 请判断第二个序列是否为该栈的弹出顺序。 假设压入栈的所有数字均不相等。 例如序列1、2、3、4、5是某栈的压栈序列, 序列5、4、3、2、1是该压栈序列对应的一个弹出序列, 但4、3、5、1、2就不可能是该压栈序列的弹出序列。
    剑指Offer(Java版)第二十五题:包含min函数的栈
    剑指Offer(Java版)第二十四题:顺时针打印矩阵
    MongoDB学习笔记10——分片
    MongoDB学习笔记9——复制
    MongoDB学习笔记8——优化
  • 原文地址:https://www.cnblogs.com/wordadobe/p/1842040.html
Copyright © 2011-2022 走看看