Adding an ImageProvider
We've used a relative path to our images in thoreau.html:
<img src="img/Henry_David_Thoreau_1861.jpg" />
If the HTML file you're parsing is stored in a directory that is different from the working directory, iText won't be able to create Image
objects.
We have to supply an implementation of the ImageProvider
interface that tells iText what to do if an img
tag is encountered.
This interface has the following methods:
Image retrieve(final String src);
String getImageRootPath();
void store(String src, Image img);
void reset();
You can write your own class implementing these four methods, or you can subclass AbstractImageProvider
.
It is preferred to do the latter.
XML Worker will use the store()
method of the AbstractImageProvider
class to cache all the Image
objects that are encountered in a Map
.
These objects will be reused when the retrieve()
method is called for an image with the same src
.
If you don't cache images, your PDF will be bloated. The same image bits and bytes will be written to the PDF more than once.
The reset()
method clears the cache; it is used when an ImageProvider
is cloned.
Finally, the getImageRootPath()
method isn't implemented. You have to implement it yourself, as is done in the following snippet:
htmlContext.setImageProvider(new AbstractImageProvider() { public String getImageRootPath() { return "src/main/resources/html/"; } });
The relative path from our workdir to our thoreau.html file is "src/main/resources/html/"
.
By using this ImageProvider
in the HtmlPipelineContext
, relative paths in the src
attribute of an img
tag will be adapted.
iText will add src/main/resources/html/
to the src
attribute of the tag (e.g. img/Henry_David_Thoreau_1861.jpg
), resulting in the path src/main/resources/html/img/Henry_David_Thoreau_1861.jpg
.
This path is valid relative to the working directory.