2012-07-24 35 views
7

在我的生产流水线中,我需要从HTML生成几百PDF。对于这种情况,我首先将HTML转换为XHTML。 比im将'已清理'的XHTML和uri传递给渲染器。XHTML为PDF使用飞碟如何缓存css

由于* .css和imageFiles对于所有XHTML文件都是相同的,所以我不需要在处理文件的时候解决它们。 Im成功使用以下代码来缓存图像。我怎样才能缓存.css文件?我想避免将所有文件放入我的类路径中。

ITextRenderer renderer = new ITextRenderer(); 

ResourceLoaderUserAgent callback = new ResourceLoaderUserAgent(renderer.getOutputDevice()); 
callback.setSharedContext(renderer.getSharedContext()); 

for (MyObject myObject : myObjectList) { 

    OutputStream os = new FileOutputStream(tempFile); 

    final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); 
    documentBuilderFactory.setValidating(false); 
    DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder(); 
    org.w3c.dom.Document document = builder.parse(myObject.getLocalPath); // full path to .xhtml 

    renderer.getSharedContext().setUserAgentCallback(callback); 

    renderer.setDocument(document, myObject.getUri()); 
    renderer.layout(); 
    renderer.createPDF(os); 

    os.flush(); 
    os.close(); 
} 
    ... 


private static class ResourceLoaderUserAgent extends ITextUserAgent 
{ 
    public ResourceLoaderUserAgent(ITextOutputDevice outputDevice) { 
     super(outputDevice); 
    } 

    protected InputStream resolveAndOpenStream(String uri) { 
     InputStream is = super.resolveAndOpenStream(uri); 
     System.out.println("IN resolveAndOpenStream() " + uri); 

     return is; 
    } 
} 

回答

3

因为有人面对同样的问题,所以我解决了这个问题。 因为我无法缓存CustomUserAgent中的* .css文件,所以我不得不寻找另一种方法。我的解决方案使用Squid作为http代理来缓存所有经常使用的资源。

在我的CustomUserAgent里面我只需要通过传递代理对象来访问这个代理。

public class ResourceLoaderUserAgent extends ITextUserAgent { 

public ResourceLoaderUserAgent(ITextOutputDevice outputDevice) { 
    super(outputDevice); 
} 

protected InputStream resolveAndOpenStream(String uri) {  

    HttpURLConnection connection = null; 
    URL proxyUrl = null; 
    try { 
     Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("localhost", 3128)); 
     proxyUrl = new URL(uri); 
     connection = (HttpURLConnection) proxyUrl.openConnection(proxy); 
     connection.connect(); 

    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 

    java.io.InputStream is = null; 
    try { 
     is = connection.getInputStream(); 
    } catch (java.net.MalformedURLException e) { 
     XRLog.exception("bad URL given: " + uri, e); 
    } catch (java.io.FileNotFoundException e) { 
     XRLog.exception("item at URI " + uri + " not found"); 
    } catch (java.io.IOException e) { 
     XRLog.exception("IO problem for " + uri, e); 
    } 

    return is; 
} 
} 

缓存:

resolving css took 74 ms 
resolving images took 225 ms 

未缓存:

resolving css took 15466 ms 
resolving images took 11236 ms 

,你可以看到,高速缓存和非高速缓存的资源之间的型动物是显著