关于flyingSaucer生成pdf图片显示的问题

薄冰2010 2011-02-23 10:41:07
最近在研究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测试时,图片无法显示,不知是否是路径问题?请大虾们帮忙看看,谢谢。
...全文
948 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
shanliangliuxing 2011-09-23
  • 打赏
  • 举报
回复
生成的图片只显示一部分,有一部分被遮盖了,这个问题怎么解决?
shanliangliuxing 2011-09-23
  • 打赏
  • 举报
回复
生成的图片只显示一部分,有一部分被遮盖了,这个问题怎么解决?
shanliangliuxing 2011-09-23
  • 打赏
  • 举报
回复
生成的图片不能只显示一部分,有一部分被遮盖了,这个问题怎么解决?
血狼123 2011-07-27
  • 打赏
  • 举报
回复
import org.xhtmlrenderer 是哪个jar包里面的啊
薄冰2010 2011-03-22
  • 打赏
  • 举报
回复
问题已解决,在html中,<img src="sunset.jpg">对于flySaucer程序来说,找不到其图片路径,现将其改写成<img src="http://loalhost:8080/..../sunset.jpg">就ok啦

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧