利用velocity模板以及itext生成pdf
我整理的源码:http://download.csdn.net/download/u012174571/8748897
首先是velocity的使用:
1.下载:http://velocity.apache.org/download.cgi
2.导入包:velocity-1.7.jar、commons-lang-2.4.jar、commons-collections-3.2.1.jar这三个包导入工程中。
3.用法演示:
新建一个文件:hello.vm放在根目录下,
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <style> *{font-family: SimSun;} </style> </head> <body> <p> ${name} </p>
${date} </body> </html> |
新建一个测试类TestVelocity
import java.io.StringWriter; import java.util.Date;
import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.VelocityEngine;
public class TestVelocity {
public static void main(String[] args) throws Exception { //初始化并取得Velocity引擎 VelocityEngine ve = new VelocityEngine(); ve.init();
//取得velocity的模版 Template t = ve.getTemplate("src/hello.vm");
//取得velocity的上下文context VelocityContext context = new VelocityContext();
//往vm中写入信息 context.put("name", "Liang"); context.put("date", (new Date()).toString());
StringWriter writer = new StringWriter();
//把数据填入上下文 t.merge(context, writer);
String out = writer.toString(); System.out.println(writer.toString());
} public static String get() throws Exception{ //初始化并取得Velocity引擎 VelocityEngine ve = new VelocityEngine(); ve.init();
//取得velocity的模版 Template t = ve.getTemplate("src/hello.vm","UTF-8"); //velocity 在给路劲时会比较麻烦,
//取得velocity的上下文context VelocityContext context = new VelocityContext();
StringWriter writer = new StringWriter();
//把数据填入上下文 t.merge(context, writer);
//输出流 String out = writer.toString(); return out; } } |
4.运行输出结果:
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8" />
<style>
*{font-family:SimSun;}
</style>
</head>
<body>
<p>
Liang
</p>
Thu May 28 14:23:22 CST 2015
</body>
</html>
其次itext的使用:
下载包:需要两个包:(最好都下最新的,不然不支持中文)
1.itext核心包: http://sourceforge.net/projects/itext/files/
2.xml包:http://sourceforge.net/projects/xmlworker/files/
其中有用的是:itext下的itextpdf-5.5.6.jar
xml下的xmlworker-5.5.6.jar
在E盘创建一个html;写上些东西(先不要写中文)
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.nio.charset.Charset;
import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.pdf.PdfWriter; import com.itextpdf.tool.xml.XMLWorkerHelper;
public class Test {
public static final String HTML = "E:/MyHtml.html"; public static final String DEST = "E:/hero.pdf";
/** * Creates a PDF with the words "Hello World" * @param file * @throws IOException * @throws DocumentException */ public void createPdf(String file) throws Exception { // step 1 Document document = new Document(); // step 2 PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file)); // step 3 document.open(); String value = TestVelocity.get(); @SuppressWarnings("deprecation") Reader reader = null; reader = new StringReader(value);
// step 4 // XMLWorkerHelper.getInstance().parseXHtml(writer, document, reader); XMLWorkerHelper.getInstance().parseXHtml(writer, document, new FileInputStream(HTML) , Charset.forName("UTF-8")); // step 5 document.close(); }
/** * Main method */ public static void main(String[] args) throws Exception{ File file = new File(DEST); file.getParentFile().mkdirs(); new Test().createPdf(DEST); } } |
ok可以去e盘找pdf了。
两者合并:
上边代码中的
String value = TestVelocity.get();
@SuppressWarnings("deprecation")
Reader reader = null;
reader = new StringReader(value);
// step 4
// XMLWorkerHelper.getInstance().parseXHtml(writer, document, reader);
就是去找velocity并交给itex生成pdf;将注解放开,把这段 XMLWorkerHelper.getInstance().parseXHtml(writer,document,
new FileInputStream(HTML) , Charset.forName("UTF-8"));
注解掉,ok再生成的pdf就是hello.vm中的内容了;
中文处理:itext对中文支持不是很好,但是高版本的jar包已经可以支持中文了。在vm中添加样式:<style>
*{font-family: SimSun;}
</style>
把所有的文字都指定为宋体(最好这个字体,我试过有的字体会少一些字);字体记得要往服务器加哦,服务器一般是linux的没有中文字体哦!