2012-07-24 124 views
1

我已经为Flying Saucer R8设置了一个测试环境,并且正在测试从模板和数据构建PDF的过程。我正在使用自定义的UserAgentCallback从文件系统本地读取外部js/css和图像。将下面的自定义UserAgentCallback当问题发生:Flying Saucer在处理自定义图像时发生异常UserAgentCallback

package support; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.InputStream; 
import java.net.MalformedURLException; 
import java.net.URL; 

import org.xhtmlrenderer.swing.NaiveUserAgent; 

public class FileUserAgent extends NaiveUserAgent { 
    @Override 
    public String resolveURI(String uri) { 
     URL url = null; 
     String path = null; 
     try { 
      url = new URL(uri); 
      path = url.getPath(); 
     } catch (MalformedURLException e) { 
      // only path present 
      path = uri; 
     } 
     if (path.charAt(0) == '/') { 
      path = path.substring(1, path.length()); 
     } 
     return path; 
    } 

    @Override 
    protected InputStream resolveAndOpenStream(String filepath) { 
     InputStream is = null; 
     try { 
      File file = new File(filepath); 
      is = new FileInputStream(file); 
     } catch (Exception e) { 
      System.out.print("an error occured when reading resource: " + e.getMessage()); 
     } 
     return is; 
    } 
} 

的UserAgentCallback能够在没有任何问题,阅读CSS,但读取图像时,无论是从SRC或background-image属性我得到的followng例外:

java.lang.ClassCastException: org.xhtmlrenderer.swing.AWTFSImage$OldAWTFSImage cannot be cast to org.xhtmlrenderer.pdf.ITextFSImage 
    at org.xhtmlrenderer.pdf.ITextOutputDevice.drawImage(ITextOutputDevice.java:761) 
    at org.xhtmlrenderer.render.AbstractOutputDevice.paintTiles(AbstractOutputDevice.java:300) 
    at org.xhtmlrenderer.render.AbstractOutputDevice.paintBackground0(AbstractOutputDevice.java:245) 
    at org.xhtmlrenderer.render.AbstractOutputDevice.paintBackground(AbstractOutputDevice.java:191) 
    at org.xhtmlrenderer.pdf.ITextOutputDevice.paintBackground(ITextOutputDevice.java:187) 
    at org.xhtmlrenderer.render.Box.paintBackground(Box.java:436) 
    at org.xhtmlrenderer.layout.Layer.paintBackgroundsAndBorders(Layer.java:243) 
    at org.xhtmlrenderer.layout.Layer.paint(Layer.java:329) 
    at org.xhtmlrenderer.pdf.ITextRenderer.paintPage(ITextRenderer.java:384) 
    at org.xhtmlrenderer.pdf.ITextRenderer.writePDF(ITextRenderer.java:348) 
    at org.xhtmlrenderer.pdf.ITextRenderer.createPDF(ITextRenderer.java:315) 
    at org.xhtmlrenderer.pdf.ITextRenderer.createPDF(ITextRenderer.java:246) 

回答

0

从我在飞碟论坛中读到的内容中,您必须确保返回正确的ImageResource!

帮助我的是用ITextUserAgent而不是NaiveUserAgent扩展这个类。 (ITextUserAgent扩展了NaiveUserAgent)。