How to set base url in Flying-Saucer when rendering HTML to PDF?

I am trying to make an HTML page in PDF using Flying-Saucer. HTML is created in memory and passed to the renderer as

renderer.setDocumentFromString(new String(htmlByteArray)); 

The problem is that I have <img src="images.jpg"/> in HTML, and it cannot be displayed in the final HTML. The image is in the resources folder in the package.

I tried to set the base url as follows, but without success:

  ITextRenderer renderer = new ITextRenderer ();
 renderer.getSharedContext (). setBaseURL ("com / org / tools / designer / resources /");
 System.out.println (renderer.getSharedContext (). GetBaseURL ());
 renderer.setDocumentFromString (new String (htmlByteArray));
 renderer.layout ();
 renderer.createPDF (os);
+6
source share
1 answer

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); 
+3
source

Source: https://habr.com/ru/post/903197/


All Articles