利用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的设计人员,你希望每个用户登陆时都拥有自己的页面。 你会见了一些公司内的软件工程师,你发现他们每个人都同意客户应该拥有具有个性化的信息。那让我们把软件工程师应该作的事情发在一边,看一看你应该作些什么吧。
首先,需要引入 Apache Velocity 的相关依赖。在 Maven 项目中,可以在 `pom.xml` 文件中添加以下依赖: ```xml <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.3.1</version> </dependency> ``` 然后,可以编写一个 Velocity 模板文件,用来生成 `pom.xml` 文件。例如: ```xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>$groupId</groupId> <artifactId>$artifactId</artifactId> <version>$version</version> <dependencies> #foreach($dependency in $dependencies) <dependency> <groupId>${dependency.groupId}</groupId> <artifactId>${dependency.artifactId}</artifactId> <version>${dependency.version}</version> </dependency> #end </dependencies> </project> ``` 在模板文件中,可以使用 Velocity 的语法,通过变量和循环生成 `pom.xml` 文件的内容。例如,可以定义 `$groupId`、`$artifactId`、`$version` 和 `$dependencies` 等变量,分别表示项目的组ID、项目ID、版本号和依赖列表。在 `$dependencies` 变量中,使用 `#foreach` 循环遍历依赖列表,生成多个 `<dependency>` 标签。 最后,可以编写一个 Java 类,使用 Velocity 引擎加载模板文件,并传入变量值,生成 `pom.xml` 文件。例如: ```java import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.VelocityEngine; import java.io.File; import java.io.FileWriter; import java.util.ArrayList; import java.util.List; public class PomGenerator { public static void main(String[] args) throws Exception { // 初始化 Velocity 引擎 VelocityEngine ve = new VelocityEngine(); ve.init(); // 加载模板文件 Template t = ve.getTemplate("pom_template.vm"); // 设置变量值 VelocityContext ctx = new VelocityContext(); ctx.put("groupId", "com.example"); ctx.put("artifactId", "example-project"); ctx.put("version", "1.0.0"); List<Dependency> dependencies = new ArrayList<>(); dependencies.add(new Dependency("org.springframework", "spring-core", "5.2.0.RELEASE")); dependencies.add(new Dependency("org.springframework", "spring-web", "5.2.0.RELEASE")); ctx.put("dependencies", dependencies); // 生成输出文件 FileWriter writer = new FileWriter(new File("pom.xml")); t.merge(ctx, writer); writer.close(); } static class Dependency { String groupId; String artifactId; String version; Dependency(String groupId, String artifactId, String version) { this.groupId = groupId; this.artifactId = artifactId; this.version = version; } } } ``` 在代码中,首先初始化 Velocity 引擎,然后加载模板文件 `pom_template.vm`。接着,设置变量值,包括 `$groupId`、`$artifactId`、`$version` 和 `$dependencies` 等。最后,使用 Velocity 引擎的 `merge` 方法,将模板和变量合并,并将输出写入文件。这样就可以生成 `pom.xml` 文件了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值