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.关闭输出流
代码如下:
- 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);
- }
- }