Hay una interfaz muy fresco en FS llamada UserAgentCallback
que le permite obtener todos sus propios recursos. Para otras personas mirando este puede configurar la dirección URL correspondiente:
renderer.getSharedContext().getUserAgentCallback().setBaseURL("url_to_resources");
Sin embargo, usted tiene un caso especial aquí, que tienen recursos incrustados dentro de su archivo JAR que necesitan una forma especial para ser visitada. Puede implementar su propio UserAgentCallback
Heres un pequeño que escribí para usted. (No probé esto, así que quizás debas depurarlo un poco).
Este bit de código extiende el ITextUserAgent
de esa manera solo tiene que sobreescribir el método getBinaryResource
y dejar el resto a la biblioteca. Si esto no funciona, puede buscar implementar un completo en UserAgentCallback
.
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.xhtmlrenderer.pdf.ITextOutputDevice;
import org.xhtmlrenderer.pdf.ITextUserAgent;
public class PackageUserAgentCallback extends ITextUserAgent {
private Class resourceClass;
public PackageUserAgentCallback(ITextOutputDevice outputDevice, Class resourceClass) {
super(outputDevice);
this.resourceClass = resourceClass;
}
@Override
public byte[] getBinaryResource(String uri) {
try {
InputStream in = resourceClass.getResourceAsStream(uri);
ByteArrayOutputStream out = new ByteArrayOutputStream();
int numRead;
byte [] buffer = new byte[256];
while((numRead = in.read(buffer)) != -1) {
out.write(buffer, 0, numRead);
}
return out.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
continuación, puede establecer esto a su UserAgentCallback
, esto sería dirigir todas las peticiones de recursos a través de su PackageUserAgentCallback
ITextRenderer renderer = new ITextRenderer();
renderer.getSharedContext().setUserAgentCallback(
new PackageUserAgentCallback(renderer.getOutputDevice(), Resources.class));
System.out.println(renderer.getSharedContext().getBaseURL());
renderer.setDocumentFromString(new String(htmlByteArray));
renderer.layout();
renderer.createPDF(os);
¿Ha intentado 'setBaseURL' con una base real ** ** URL? P.ej. 'file: /// --- path-to-resources --- com/org/tools/designer/resources /' – mkl