Cette semaine, j'ai travaillé sur ce sujet, et je vous donne ce qui a bien fonctionné pour moi.
Dans la réalité, votre document XHTML pointe vers plusieurs ressources (images, css, etc.) avec des chemins relatifs. Vous devez également expliquer à la soucoupe volante où les trouver. Ils peuvent être dans votre classpath, ou dans votre système de fichiers. (S'ils sont sur le réseau, vous pouvez simplement définir l'URL de base, donc ce ne sera pas aider)
Vous devez étendre le ITextUserAgent comme ceci:
private static class ResourceLoaderUserAgent extends ITextUserAgent {
public ResourceLoaderUserAgent(ITextOutputDevice outputDevice) {
super(outputDevice);
}
protected InputStream resolveAndOpenStream(String uri) {
InputStream is = super.resolveAndOpenStream(uri);
String fileName = "";
try {
String[] split = uri.split("/");
fileName = split[split.length - 1];
} catch (Exception e) {
return null;
}
if (is == null) {
// Resource is on the classpath
try{
is = ResourceLoaderUserAgent.class.getResourceAsStream("/etc/images/" + fileName);
} catch (Exception e) {
}
if (is == null) {
// Resource is in the file system
try {
is = new FileInputStream(new File("C:\\images\\" + fileName));
} catch (Exception e) {
}
}
return is;
}
}
Et vous l'utiliser comme ceci :
// Output stream containing the result
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ITextRenderer renderer = new ITextRenderer();
ResourceLoaderUserAgent callback = new ResourceLoaderUserAgent(renderer.getOutputDevice());
callback.setSharedContext(renderer.getSharedContext());
renderer.getSharedContext().setUserAgentCallback(callback);
renderer.setDocumentFromString(htmlSourceAsString);
renderer.layout();
renderer.createPDF(baos);
renderer.finishPDF();
Cheers.
Cette solution doit être basée sur le ressort. –