java生成pdf方案总结
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.关闭输出流
代码如下:
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); }}
3 楼 tengfeineu 2012-07-13 // 解决图片的相对路径问题 renderer.getSharedContext().setBaseURL("file:/D:/working/HtmlTemp/image/");
这个linux下不好使 加载不了图片