W moim strumieniu produkcji muszę wygenerować kilkaset plików PDF z HTML. W tym scenariuszu najpierw konwertuję HTML na XHTML. Niż ich przekazanie "wyczyszczone" XHTML i URI do renderera.XHTML do PDF za pomocą latającego spodka, jak cache css
Ponieważ pliki * .css i imageFiles są równe dla wszystkich plików XHTML, nie muszę ich rozwiązywać przez cały czas przetwarzania pliku. Pomyślnie za pomocą następującego kodu dla buforowania obrazów. Jak mogę buforować pliki .css? Chcę uniknąć umieszczania wszystkich plików w mojej ścieżce klas.
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;
}
}