第一步,html转pdf
依赖的jar包可以从这下载
http://download.csdn.net/detail/czj2015/9430534
html转pdf 的代码如下:
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
import com.lowagie.text.pdf.BaseFont;
public class HtmltoPDF {
public static void main(String[] args) throws Exception {
// htmlToPdf();
htmlToPdf2();
// htmlToPdf3();
}
// 不支持中文
public static void htmlToPdf() throws Exception {
String inputFile = "f:/b.html";
String url = new File(inputFile).toURI().toURL().toString();
String outputFile = "f:/flying.pdf";
OutputStream os = new FileOutputStream(outputFile);
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(url);
renderer.layout();
renderer.createPDF(os);
os.close();
}
// 支持中文
public static void htmlToPdf2() throws Exception {
String outputFile = "F:/demo_3.pdf";
OutputStream os = new FileOutputStream(outputFile);
ITextRenderer renderer = new ITextRenderer();
ITextFontResolver fontResolver = renderer.getFontResolver();
fontResolver.addFont("C:/Windows/fonts/simsun.ttc",
BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
StringBuffer html = new StringBuffer();
// DOCTYPE 必需写否则类似于 这样的字符解析会出现错误
html.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
html.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">")
.append("<head>")
.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />")
.append("<style type=\"text/css\" mce_bogus=\"1\">body {font-family: SimSun;}</style>")
.append("</head>")
.append("<body>aaaaaaa测试啊测试</body>");
html.append("</html>");
renderer.setDocumentFromString(html.toString());
// 解决图片的相对路径问题
// renderer.getSharedContext().setBaseURL("file:/F:/teste/html/");
renderer.layout();
renderer.createPDF(os);
System.out.println("======转换成功!");
os.close();
}
public static void htmlToPdf3() throws Exception {
String inputFile = "F:/b.html";
String outFile = "F:/test.pdf";
OutputStream os = null;
os = new FileOutputStream(outFile);
ITextRenderer renderer = new ITextRenderer();
ITextFontResolver fontResolver = renderer.getFontResolver();
fontResolver.addFont("C:/Windows/fonts/simsun.ttc",
BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
String url = new File(inputFile).toURI().toURL().toString();
System.out.println("=============url: " + url);
renderer.setDocument(url);
renderer.layout();
renderer.createPDF(os);
System.out.println("======转换成功!");
os.close();
}
}
第二步: 提供下载功能
原先的想法是,网页上点击了下载按钮以后, 托管bean开始生成pdf,生成结束后直接给页面跳出下载。
然而后来发现这种方法行不通。因为jsf下载功能只有控件 commandButton和commandLink可以实现。其实用js来控制来onclick按钮也可以解决这个问题,但是这样做的
话调用的就不是一个托管bean了。
提供下载的代码如下:
public void downPdf() {
// String filePath = this.vals;
String filePath = "f:/demo_3.pdf";
System.out.println("filePath" + filePath);
File file = new File(filePath);
FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) context
.getExternalContext().getResponse();
response.setContentType("application/msdownload");
response.setCharacterEncoding("UTF-8");
response.setContentLength(new Long(file.length()).intValue());// 文件长度
response.setHeader("Content-Disposition", "attachment; filename=\""
+ file.getName() + "\"");// 文件名
ServletOutputStream out = null;
FileInputStream fis = null;
BufferedReader reader = null;
String readLine = null;
try {
out = response.getOutputStream();
fis = new FileInputStream(file);
reader = new BufferedReader(new InputStreamReader(fis));
while ((readLine = reader.readLine()) != null) {
try {
out.write(readLine.getBytes());
} catch (Exception e) {
}
}
out.flush();
context.responseComplete();
System.out.println("提供下载结束");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}