最近在研究flyingSaucer生成pdf,现在遇到一个图片显示问题,请大虾们帮忙解决,谢谢。下面将代码贴出来:这个为web测试入口:
package servlet;import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspWriter;import com.baibin.FlySaucerContext;
import com.baibin.URLUtil;public class CreatePdfServlet extends HttpServlet{
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("创建Pdf.....");
try {
String url = req.getRequestURL().toString();
System.out.println(url);

String html = URLUtil.getHtml("http://127.0.0.1:8080/testFlySaucer/html/hello.html");
System.out.println();
System.out.println(html);
String path = req.getSession().getServletContext().getRealPath("html");
FlySaucerContext.pdfFileDir=path+"\\";
FlySaucerContext.imgFileDir=path+"\\";
FlySaucerContext.createPdf(new StringBuffer(html), "web测试pdf");
System.out.println("创建完毕......");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp);
}
}
这个是生成pdf的核心代码
package com.baibin;import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;
import org.xhtmlrenderer.pdf.ITextRenderer;
import org.xhtmlrenderer.pdf.TrueTypeUtil;
import org.xml.sax.InputSource;import com.lowagie.text.pdf.BaseFont;public class FlySaucerContext {
private static ITextRenderer renderer=new ITextRenderer();
public static String pdfFileDir="E:\\pdf\\";
public static String imgFileDir="E:\\projects\\brent\\testFlySaucer\\";
private static String fontFamilySupport="C:/Windows/Fonts/arialuni.ttf";
/**
 * 
 * @param buf 需要转换的String
 * @param pdfFileName
 * @throws Exception
 */
public static void createPdf(StringBuffer buf,String pdfFileName) throws Exception{
 System.out.println("当前使用的xhtml信息:"+buf.toString());
 //解决renderer对中文的支持问题
 setCharSupport(fontFamilySupport);
 //解决图片的相对路径问题
 renderer.getSharedContext().setBaseURL(imgFileDir);
 System.out.println("temp:"+renderer.getSharedContext().getBaseURL());
 //将需转换的内容以UTF-8的方式转换成字节数组
 byte[] bytes=buf.toString().getBytes("UTF-8");
 //根据字节数组创建字节数组输入流
 ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
 //开始将流转换成文档对象
 InputSource is = new InputSource(bais);
 DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
 Document doc = builder.parse(is);
 //将需转换的xhtml文档与转换器关联
 renderer.setDocument(doc, null); 
 renderer.layout(); 
 //准备pdf文件输出流
 String filename = pdfFileDir+pdfFileName+".pdf";
 BufferedOutputStream bufferedOutput = new BufferedOutputStream(new FileOutputStream(filename));
 //根据pdf文件输出流创建pdf
 renderer.createPDF(bufferedOutput);
 bufferedOutput.flush();
 bufferedOutput.close(); 
}

 /**
  * 
  * @param fileInput 需要转换的html,xml文件
  * @param pdfFileName 生成的pdf名称
  * @throws Exception
  */
 public static void createPdf(InputStream fileInput,String pdfFileName) throws Exception{
StringBuffer strBuf=new StringBuffer();
//开始将文件流转换成StringBuffer
  BufferedReader bufReader=new BufferedReader(new InputStreamReader(fileInput));
String buf = bufReader.readLine();
while(buf!=null){
strBuf.append(buf);
buf = bufReader.readLine();
}
System.out.println("从文件流里面读出的xhtml信息:"+strBuf.toString());
//开始创建pdf
FlySaucerContext.createPdf(strBuf,pdfFileName);
 }



/**
 * 
 * @param support 字符设置,若是要显示中文,
 * 则参数须为:C:/Windows/Fonts/arialuni.ttf
 * @return 返回该字符设置的字体fontFamilyName
 * @throws Exception
 */
private static String setCharSupport(String support) throws Exception{
renderer.getFontResolver().addFont(support,BaseFont.IDENTITY_H,BaseFont.EMBEDDED);
BaseFont font = BaseFont.createFont(support, BaseFont.IDENTITY_H , BaseFont.NOT_EMBEDDED);
        String fontFamilyName = TrueTypeUtil.getFamilyName(font);
        System.out.println("fontFamilyName:"+fontFamilyName);
        return fontFamilyName;
}

}这个是mian方法测试入口:
package com.baibin;import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;
import org.xhtmlrenderer.pdf.ITextRenderer;
import org.xhtmlrenderer.pdf.TrueTypeUtil;
import org.xml.sax.InputSource;import com.lowagie.text.pdf.BaseFont;public class Test {
public static void main(String[] args) throws Exception{
InputStream file=Thread.currentThread().getContextClassLoader().getResourceAsStream("html\\hello.html");
FlySaucerContext.createPdf(file, "myFirstPdfqq");
}
}现在遇到的问题就是,在main方法里面测试完全正确,图片和中文都能正常显示,但通过Servlet测试时,图片无法显示,不知是否是路径问题?请大虾们帮忙看看,谢谢。