利用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服务器没有中文的哦