Theres a really cool FS interface called UserAgentCallback , which allows you to get all your resources. For other people looking at this, you can set your URL accordingly:
renderer.getSharedContext().getUserAgentCallback().setBaseURL("url_to_resources");
However, you have a special case, you have resources built into your jar file that need a special access method. You can implement your own UserAgentCallback Heres small one that I wrote for you. (I have not tested this, so you may have to debug it a bit).
This bit of code extends ITextUserAgent in such a way that you only need to overwrite the getBinaryResource method and leave the rest in the library. If this does not work, you can study completeness on 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; } }
Then you can set this to your UserAgentCallback , it would UserAgentCallback all resource requests through your 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);
source share