我的Java开发学习之旅------>java生成pdf方案
2013-03-07 00:57
344 查看
java生成pdf方案很多,常用的如下:
1. 利用jacob生成pdf:这种方法调用office的本地方法实现对pdf API的操作,只能在windows平台使用
2. 利用openoffice生成pdf:openoffice是开源软件且能在windows和linux平台下运行
3. itext + flying saucer生成pdf:itext和flying saucer都是免费开源的,且与平台无关,结合css和velocity技术,可以很好的实现。
我们重点介绍第三种方案。它实现的步骤是非常简单的:
1.新建一个ITextRenderer类
2.添加字体
3.设置ITextRenderer的源文档
4.调用layout()方法
5.调用createPdf()方法
6.关闭输出流
代码如下:
Java代码
package com.hank.pdfhtml;
/**
* @author Hank
* 2009-12-30
*/
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.BaseFont;
public class Html2Pdf {
private static void addFonts() throws DocumentException, IOException{
if(null == renderer) {
return;
}
// 添加所需的字体
ITextFontResolver fontResolver = renderer.getFontResolver();
URL fontsUrl = Html2Pdf.class.getResource("/com/hank/fonts/");//该文件夹下放所需字体文件
File fonts = new File(fontsUrl.getPath());
File[] fileList = fonts.listFiles();
for(int i=0; i < fileList.length; i++){
fontResolver.addFont(fileList[i].getAbsolutePath(), BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
}
}
public static String print2Pdf(String inputFile) {
String url = null;
try {
url = new File(inputFile).toURI().toURL().toString();
} catch (MalformedURLException e) {
return null;
}
String outputFile = inputFile.substring(0, inputFile.lastIndexOf(".")) + ".pdf";
OutputStream os = null;
try {
os = new FileOutputStream(outputFile);
} catch (FileNotFoundException e) {
return null;
}
ITextRenderer renderer = null;
try {
renderer = new ITextRenderer();
} catch (Exception e) {
return null;
}
renderer.setDocument(url);
// 解决图片的相对路径问题
renderer.getSharedContext().setBaseURL("file:/D:/working/HtmlTemp/image/");
renderer.layout();
try {
renderer.createPDF(os);
} catch (DocumentException e) {
return null;
}
try {
os.close();
} catch (IOException e) {
return null;
}
return outputFile;
}
public static void main(String args[]){
String inputFile = "D:/working/HtmlTemp/test.html"; //必须符合W3C标准
Html2Pdf.print2Pdf(inputFile);
}
}
1. 利用jacob生成pdf:这种方法调用office的本地方法实现对pdf API的操作,只能在windows平台使用
2. 利用openoffice生成pdf:openoffice是开源软件且能在windows和linux平台下运行
3. itext + flying saucer生成pdf:itext和flying saucer都是免费开源的,且与平台无关,结合css和velocity技术,可以很好的实现。
我们重点介绍第三种方案。它实现的步骤是非常简单的:
1.新建一个ITextRenderer类
2.添加字体
3.设置ITextRenderer的源文档
4.调用layout()方法
5.调用createPdf()方法
6.关闭输出流
代码如下:
Java代码
package com.hank.pdfhtml;
/**
* @author Hank
* 2009-12-30
*/
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.BaseFont;
public class Html2Pdf {
private static void addFonts() throws DocumentException, IOException{
if(null == renderer) {
return;
}
// 添加所需的字体
ITextFontResolver fontResolver = renderer.getFontResolver();
URL fontsUrl = Html2Pdf.class.getResource("/com/hank/fonts/");//该文件夹下放所需字体文件
File fonts = new File(fontsUrl.getPath());
File[] fileList = fonts.listFiles();
for(int i=0; i < fileList.length; i++){
fontResolver.addFont(fileList[i].getAbsolutePath(), BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
}
}
public static String print2Pdf(String inputFile) {
String url = null;
try {
url = new File(inputFile).toURI().toURL().toString();
} catch (MalformedURLException e) {
return null;
}
String outputFile = inputFile.substring(0, inputFile.lastIndexOf(".")) + ".pdf";
OutputStream os = null;
try {
os = new FileOutputStream(outputFile);
} catch (FileNotFoundException e) {
return null;
}
ITextRenderer renderer = null;
try {
renderer = new ITextRenderer();
} catch (Exception e) {
return null;
}
renderer.setDocument(url);
// 解决图片的相对路径问题
renderer.getSharedContext().setBaseURL("file:/D:/working/HtmlTemp/image/");
renderer.layout();
try {
renderer.createPDF(os);
} catch (DocumentException e) {
return null;
}
try {
os.close();
} catch (IOException e) {
return null;
}
return outputFile;
}
public static void main(String args[]){
String inputFile = "D:/working/HtmlTemp/test.html"; //必须符合W3C标准
Html2Pdf.print2Pdf(inputFile);
}
}
相关文章推荐
- 我的Java开发学习之旅------>介绍一个Java生成PDF的方案
- java学习09-通过文档注释->生成开发文档
- 从Java应用程序动态生成PDF文件-Java基础-Java-编程开发
- 我的Java开发学习之旅------>Java经典面试题
- [Java学习] 将PDF格式文件转成二进制并生成Base64编码,将Base64编码转成PDF文件
- 我的Java开发学习之旅------>Workspace in use or cannot be created, choose a different one.--错误解决办法
- 我的Java开发学习之旅------>Java String对象作为参数传递的问题解惑
- 我的Java开发学习之旅------>Java经典面试题
- 我的Java开发学习之旅------>Java字符编码解析
- 我的Java开发学习之旅------>Java使用ObjectOutputStream和ObjectInputStream序列号对象报java.io.EOFException异常的解决方法
- 我的Java开发学习之旅------>Java多线程下载文件 实例
- 矿Java开发学习之旅------>Java排序算法经典的二分法插入排序
- Java解析OFFICE(word,excel,powerpoint)以及PDF的实现方案及开发中的点滴分享
- [Java学习] 将PDF格式文件转成二进制并生成Base64编码,将Base64编码转成PDF文件
- 我的Java开发学习之旅------>二进制、八进制、十进制、十六进制之间转换
- 我的Java开发学习之旅------>Java经典排序算法之冒泡排序
- 我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法
- 我的Java开发学习之旅------>自己编写的Java数组操作工具
- 我的Java开发学习之旅------>交通灯管理系统
- 生成PDF文件方案--学习中