8

私の制作パイプラインでは、HTMLから数百のPDFを生成する必要があります。このシナリオでは、最初にHTMLをXHTMLに変換します。「クリーンアップされた」XHTMLとURIをレンダラーに渡すよりも。

* .cssとimageFilesはすべてのXHTMLファイルで等しいので、ファイルを処理するたびにそれらを解決する必要はありません。画像をキャッシュするために次のコードを正常に使用しています。.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;
    }
}
4

1 に答える 1

4

ここで同じ問題に直面している誰かが私がそれを解決した方法である場合に備えて。CustomUserAgent内に*.cssファイルをキャッシュできなかったため、別の方法を見つける必要がありました。私のソリューションでは、Squidをhttpプロキシとして使用して、頻繁に使用されるすべてのリソースをキャッシュします。

CustomUserAgent内では、proxy-objectを渡すことによってこのプロキシにアクセスするだけで済みます。

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

ご覧のとおり、キャッシュされたリソースとキャッシュされていないリソースの違いは重要です

于 2012-08-07T09:04:38.310 に答える