We also used FOP 2.1 and want to ensure that images inside the jars-classpath are found. Our tested and used solution:
Create Your Own ResourceResolver
import java.io.IOException; import java.io.OutputStream; import java.net.URI; import java.net.URL; import org.apache.fop.apps.io.ResourceResolverFactory; import org.apache.xmlgraphics.io.Resource; import org.apache.xmlgraphics.io.ResourceResolver; public class ClasspathResolverURIAdapter implements ResourceResolver { private final ResourceResolver wrapped; public ClasspathResolverURIAdapter() { this.wrapped = ResourceResolverFactory.createDefaultResourceResolver(); } @Override public Resource getResource(URI uri) throws IOException { if (uri.getScheme().equals("classpath")) { URL url = getClass().getClassLoader().getResource(uri.getSchemeSpecificPart()); return new Resource(url.openStream()); } else { return wrapped.getResource(uri); } } @Override public OutputStream getOutputStream(URI uri) throws IOException { return wrapped.getOutputStream(uri); } }
- Create a FOPBuilderFactory with your Resolver
FopFactoryBuilder fopBuilder = new FopFactoryBuilder(new File(".").toURI(), new ClasspathResolverURIAdapter());
- Finally, turn to your image.
<fo:external-graphic src="classpath:com/mypackage/image.jpg" />
Since you use our own Resolver, you can perform any search you want.
source share