关于flyingSaucer生成pdf图片显示的问题
最近在研究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测试时,图片无法显示,不知是否是路径问题?请大虾们帮忙看看,谢谢。