利用velocity模板以及itext生成pdf

利用velocity模板以及itext生成pdf

1.首先在pom.xml文件中导入jar包:

		<!-- velocity依赖 -->
		<dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.velocity.tools</groupId>
            <artifactId>velocity-tools-generic</artifactId>
            <version>3.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.velocity.tools</groupId>
            <artifactId>velocity-tools-view</artifactId>
            <version>3.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.velocity.tools</groupId>
            <artifactId>velocity-tools-view-jsp</artifactId>
            <version>3.0</version>
        </dependency>

		<!-- freemarker 读取html模板文件 -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.23</version>
        </dependency>
        <!-- xml 将html模板文件转换成pdf -->
        <dependency>
            <groupId>org.xhtmlrenderer</groupId>
            <artifactId>flying-saucer-pdf</artifactId>
            <version>9.0.9</version>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.10</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf.tool</groupId>
            <artifactId>xmlworker</artifactId>
            <version>5.5.6</version>
        </dependency>
        <dependency>
            <groupId>org.xhtmlrenderer</groupId>
            <artifactId>flying-saucer-pdf</artifactId>
            <version>9.0.3</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-pdfa</artifactId>
            <version>5.5.6</version>
        </dependency>

2.创建一个hello.vm文件,可以放在resouces/templates目录下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
    <style>
        *{
            font-family: SimSun;
            margin: auto;
        }
    </style>
</head>
<body>
	<p>
	${name}
	</p>
	<p>
	年龄:${age}
	</p>
</body>
</html>

3.新见一个Testvelocity测试类:

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine;
import java.io.StringWriter;

public class TestVelocity {
	public static void main(String[] args) {
	        //初始化并取得Velocity引擎
	        VelocityEngine ve = new VelocityEngine();
	        ve.setProperty(Velocity.ENCODING_DEFAULT,"UTF-8");
	        ve.setProperty(Velocity.INPUT_ENCODING,"UTF-8");    //指定编码格式,避免生成模板就造成乱码
	        ve.init();
	
	        //取得velocity的模板
	        Template t = ve.getTemplate("valley-service/src/main/resources/templates/zdyg.vm");
	        //取得velocity的上下文context
	        VelocityContext context = new VelocityContext();
	
	        //往vm中写入信息
	        context.put("name","张三");
	        context.put("age","24");
	        StringWriter writer = new StringWriter();
	
	        //把数据填入上下文
	        t.merge(context,writer);
	
	        String out = writer.toString();
	        System.out.println(writer.toString());
	    }
    }

4.运行结果为:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
    <style>
        *{
            font-family: SimSun;
            margin: auto;
        }
    </style>
</head>
<body>
	<p>
	张三
	</p>
	<p>
	年龄:24
	</p>
</body>
</html>

5.以上是测试在vm文件中插入数据的操作,
现在先新建一个velocityUtils工具类:

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine;
import java.io.StringWriter;

public class velocityUtils{
	public static String get(){
	        //初始化并取得velocity引擎
	        VelocityEngine ve = new VelocityEngine();
	        ve.init();
	
	        //取得velocity的模板
	        Template t = ve.getTemplate("test-service/src/main/resources/templates/hello.vm","UTF-8");
	
	        //取得velocity的上下文
	        VelocityContext context = new VelocityContext();
	        //往vm中写入信息
	       //写入自己要插入的信息,
	        context.put("","");
	        StringWriter writer = new StringWriter();
	
	        //把数据填入上下文
	        t.merge(context,writer);
	
	        //输出流
	        String out = writer.toString();
	        return out;
	    }
    }

6.创建一个Test类,创建一个生成pdf文件的方法:

import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import java.io.*;

public class Test {
    public static final String DEST = "c:/Users/xxx/Desktop/hello.pdf";
    
    public void createPdf(String file) throws Exception{
    	//设置打印后pdf的格式
        Document document = new Document(PageSize.A4,60.5f,60.5f,33f,33f);
        PdfWriter writer = PdfWriter.getInstance(document,new FileOutputStream(file));
        document.open();
        String value = velocityUtils.get();
        @SuppressWarnings("deprecation")
        Reader reader = null;
        reader = new StringReader(value);

		//去找velocity并交给itext生成pdf
        XMLWorkerHelper.getInstance().parseXHtml(writer,document,reader);
        //根据html文件生成pdf
        //XMLWorkerHelper.getInstance().parseXHtml(writer,document,new FileInputStream(HTML), Charset.forName("UTF-8"));
        document.close();
    }

    public static void main(String[] args) throws Exception {
        File file = new File(DEST);
        file.getParentFile().mkdirs();
        new Test().createPdf(DEST);
    }
}

注意:vm文件中所有的标签都必须关闭
中文处理:
itext对中文不是很支持,但是更高版本的jar已经可以支持中文了,在vm文件中添加样式
*{
font-family: SimSun;
}
把所有的文字指向为宋体,打印出来的pdf文件中文才会显示。
字体要记得往linux服务器加哦,linux服务器没有中文的哦

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Velocity的能力远不止web站点开发这个领域,例如,它可以从模板(template)产生SQL和PostScript、XML,它也可以被当作一个独立工具来产生源代码和报告,或者作为其他系统的集成组件使用。Velocity也可以为Turbine web开发架构提供模板服务(template service)。Velocity+Turbine提供一个模板服务的方式允许一个web应用以一个真正的MVC模型进行开发。 Velocity能为我们作什么? The Mud Store Example 假设你是一家专门出售Mud的在线商店的页面设计人员,让我们暂且称它为“在线MUD商店”。你们的业务很旺,客户下了各种类型和数量的mud订单。他们都是通过输入用户名和密码后才登陆到你的网站,登陆后就允许他们查看订单并购买更多的mud。现在,一种非常流行的mud正在打折销售。另外有一些客户规律性的购买另外一种也在打折但是不是很流行的Bright Red Mud,由于购买的人并不多所以它被安置在页面的边缘。所有用户的信息都是被跟踪并存放于数据库中的,所以某天有一个问题可能会冒出来:为什么不使用 velocity来使用户更好的浏览他们感兴趣的商品呢? Velocity使得web页面的客户化工作非常容易。作为一个web site的设计人员,你希望每个用户登陆时都拥有自己的页面。 你会见了一些公司内的软件工程师,你发现他们每个人都同意客户应该拥有具有个性化的信息。那让我们把软件工程师应该作的事情发在一边,看一看你应该作些什么吧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值